2021年10月14日 星期四

One Source, Multi-MCUs

The global chip shortage has turned me into a multi-platform firmware developer.

Zero code modifications.

STM / MM32 / Nuvotone



解決 Google Drive 中文名稱的問題

問題 :

    Google Drive 雲端硬碟檔案串流 在中文環境下預設是「G:\我的雲端硬碟」,磁碟代號可改,但「我的雲端硬碟」卻無法修改,導致有些「非多國語應用程式」無法正確指到檔案路徑。

解決 :

    使用 Windows 內建虛擬磁碟指令將 指定目錄變成一顆磁碟機…

        subst x: G:\我的雲端硬碟

2021年9月13日 星期一

一個奇怪的問題、一種簡單的解法

兩個未知規格的熱敏電阻(10K、20K或50K…未知),熱敏電阻A、熱敏電阻B

如何驗證二顆不同的熱敏電阻規格是一致的?

原來是一個簡單的分壓問題…

測試一、正電-->熱敏電阻A--求分壓a-->熱敏電阻B--負電

測試二、正電-->熱敏電阻B--求分壓b-->熱敏電阻A--負電

測試環境從 100°C~0°C,分壓a 需恆等於分壓b

即可初步判定二顆熱敏電阻規格是一致的

2021年9月9日 星期四

RDM DISCOVERY_COMMAND use Recursive Method

void DiscoveryAll( void ) {     /// unmute all devices : RDM_UnMute()     /// implement DISCOVERY_COMMAND:DISC_UNMUTE    RDM_UnMute( 0xFFFFFFFFFFFF ); 

    /// discovery full range      Discovery( 0, 0xFFFFFFFFFFFE );           }

void Discovery( long long low, long long high ) {     unsigned char res;

    while(1)     {         /// try to discover devices : RDM_Discovery()         /// implement DISCOVERY_COMMAND:DISC_UNIQUE_BRANCH        res = RDM_Discovery( low, high ); 

        if( res == TARGET_IDENTIFIED )    /// target identified                {             /// mute identified target : RDM_Mute()             /// implement DISCOVERY_COMMAND:DISC_MUTE            RDM_Mute(target);                continue;    /// repeat         } else if( res == DETECT_COLLISIONS )    /// detect collisions        {            Discovery( low, (low+high)/2 );    /// discovery low bound            Discovery( (low+high)/2+1, high );    /// discovery high bound        }

        return;    /// finish     } }

2020年3月10日 星期二

Raspberry Pi 3 Static IP, WIFI and Ethernet


sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
network={
ssid="XXX"
proto=RSN
key_mgmt=WPA-PSK
pairwise=CCMP TKIP
psk="XXXXX"
}

sudo nano /etc/network/interfaces
iface eth0 inet manual 
allow-hotplug wlan0
iface wlan0 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

sudo nano /etc/dhcpcd.conf
interface eth0
static ip_address=192.168.1.111/24
static routers=192.168.1.1
static domain_name+servers=8.8.8.8 
interface wlan0
static ip_address=192.168.1.222
static routers=192.168.1.1
static domain_name_servers=8.8.8.8

2020年2月17日 星期一

DMX512 protocol

DMX protocol…
# 1:break + 1:start + 512:channel

python:
import serial

class DMX512:
    def __init__(self, port):
        self.serial = serial.Serial(
        port=port,
        baudrate=250000,
        bytesize=serial.EIGHTBITS,
        parity=serial.PARITY_NONE,
        stopbits=serial.STOPBITS_TWO,
        timeout=0
        )
        self.data=[0]*513   # 513 bytes = 1:start + 512:channel

    def setChannel(self, chan, intensity):
        self.data[chan] = intensity

    def setAll(self,col):
        for i in range(1, 513):
            self.data[i] = col

    def update(self):
        # break use or serial.send_break  or serial.break_condition
        self.serial.send_break(0.0001)  # 100us but not precise on different OSs
        # 513 bytes = 1:start + 512:channel
        self.serial.write(bytes(self.data))

dmx = DMX512( 'COM3' )
dmx.setAll(255)
dmx.update()

stm8s:
====BREAK====:
UART3_Init(
    (u32)45500,
    UART3_WORDLENGTH_9D,
    UART3_STOPBITS_1,
    UART3_PARITY_NO,
    UART3_MODE_TXRX_ENABLE
    );
UART3_SendData9( 0x0100 | 0x00 );

====TX/RX====:
UART3_Init(
    (u32)250000,
    UART3_WORDLENGTH_9D,
    UART3_STOPBITS_1,
    UART3_PARITY_NO,
    UART3_MODE_TXRX_ENABLE
    );
UART3_SendData9( 0x0100 | data ); /// 513 BYTES

====rx====:
u8 dmx_buffer[513];
u16 dmx_buffer_idx; 
BOOL DMX_FLAG = FALSE;
BOOL SC_FLAG = FALSE;

void UART3_RX_IRQHandler( void )
{
    BOOL BREAK_FLAG = FALSE; 
    u8 rx = 0; 

    /// DMX512 = 1:break + 1:start + 512:data
    if(UART3_GetITStatus(UART3_IT_RXNE )!= RESET)
    {
        BREAK_FLAG = UART3_ReceiveData9()>>8;
        rx = UART3_ReceiveData8();

        if(BREAK_FLAG == FALSE) /// 1:break
        {
            if(rx == 0x00)
            {
                SC_FLAG = TRUE;
                return ;           
            }
        }

        if((BREAK_FLAG == TRUE)&&(SC_FLAG == TRUE)) /// 1:start
        {
            SC_FLAG = FALSE;
            if(rx == 0x00)
            {
                DMX_FLAG = TRUE;
            dmx_buffer_idx = 1; /// fill buff start from idx=1
            return;
        }
        }

        if((BREAK_FLAG == TRUE)&&(DMX_FLAG == TRUE)) /// 512:data
        {
            if( dmx_buffer_idx < sizeof(dmx_buffer) )
            {
            dmx_buffer[dmx_buffer_idx] = rx;
                dmx_buffer_idx++;
            }
        }
    }
}

VirtualBox 空間減肥

sdelete64 -z c: VBoxManage  modifymedium  disk  "/Users/fellow/VirtualBox VMs/Win10/Win10.vdi"  --compact *.vdi 路徑可以在 VirtualBox 儲...