วันอังคารที่ 20 ธันวาคม พ.ศ. 2565

GD32F103C8T6

 

Fig.1 GD32F103C8T6 board

    เห็นราคาดี 1.18USD (45บาท) ราคานี้ข่มใจไม่ไหว หามาลองตามเรื่องตามราว มี hardware UART หลายชุด วันนี้เอา pin map มาแปะไว้ก่อน

Fig.2 GD32F103FC8T6 pin map

    ลอง serial, serial1, serial2, serial3 ดูแล้ว รับส่งข้อมูลได้ปกติ โดยที่ serial นี่รับส่งข้อมูลผ่าน USB เห็นข้อมูลปกติ แต่พอต่อเข้ากับ PA11,PA12 ไม่ยักกะได้ เป็นข้อมูลผิดๆเพี้ยนๆ

    มีฝรั่งเขาทำไลบรารี่ให้ใช้ ก็ใช้งานได้กับ Arduino IDE สะดวกไปร้อยแปด โดยรวมๆ น่าใช้งานมากเหมือนกัน เทียบกับราคายิ่งน่าสนใจเข้าไปอีก

    ลองเล่นไปเรื่อยๆ ก็เริ่มจะเบื่อ เริ่มขาดแรงบันดาลใจ ว่าจะหันไปเล่นกับ MCS-51 ของ STC ที่ซื้อมานานนมแล้ว แต่พอได้เริ่มเล่นอารมณ์มันเหมือนการใช้แอนดรอยด์มานาน พอกลับไปใช้มือถือปุ่มกดก็จะออกแนวงงๆ    

Fig.3 STC8H4K64TL chip (source:AliExpress)

      ของฝรั่งเขามี ST ส่วนที่จีนก็มี STC, คิดว่า C =>China  ชิพส่วนใหญ่เป็น 8051 ข้อดีที่ชอบคือการอัพโหลดไฟล์(programming/flashing) ไม่ต้องการ programmer ใช้แค่ adapter TTL-USB ที่มี Rx,Tx แค่นั้น สะดวกดี มีคู่มือเป็นภาษาอังกฤษ ลองไปดู CHIPSEA, DigaDevice, HOLTEK มีมึน เพราะส่วนใหญ่เป็นภาษาจีน ส่วน WCH, Artery, Geehy นี่เป็นภาษาอังกฤษ นี่แค่บางส่วนของ MCU จากจีน ที่มีมากมาย

    ตอนนี้น่ากำลังจะผลิต STC8S003 คงเทียบได้กับ STM8S003

    STC ส่วนมากมีขายเป็นตัวชิพ ซื้อเอามาประกอบลงบอร์ดเองได้ ทั้ง package LQFP32,44,48, 64 และ TSSOP20 ราคาชิพ 0.8 - 1.5 USD มีหลายรุ่น และแน่นอนว่าเป็น 8051 ทั้งนั้น

    ถ้าต้องเลือกในรุ่นที่คิดว่าดีใช้ได้ เหมาะสมกับค่าตัวที่ถูก มี option เยอะ ก็คงเลือก STC8H, STC8G series ค่าตัวต่อออพชั่นนี่ดีประมาณหนึ่งเลย เป็นรุ่น STC8H1K28 นี่มีครบ ส่วน STC8G17, STC08G08* package TSSOP20 ราคาราว 0.3USD ไม่มี PWM อย่างเดียว(ไม่มี analog.write ทำให้ไม่มี analog output แต่ก็ทำได้ด้วย software) จะมีอยู่ในรุ่นใหญ่ขึ้น เช่น STC8G2K64S2, STC8G2K64S4 (S2, S4 นี่หมายถึงมี UART2 และ 4 ชุด ตามลำดับ) ราคารุ่นนี้ราว 1.13USD
    * ตามคู่มือบอก ไม่แนะนำให้ใช้ 8G1K04 ส่วน package DIP16, DIP20 ก็ไม่แนะนำให้ใช้เช่นกัน ส่วน SOP20 ก็ให้ใช้ตัว 8G1K17 แต่ SOP16, QFN20, TSSOP20 ใช้ได้ทั้ง 8G1K17 และ 8G1K08

    การเอาชิพลงบอร์ดก็ไม่ได้ยากมากมาย ใช้ตะกั่วเหลว สำหรับงาน surface mounting และเครื่องเป่าลมร้อน

Fig.4 STC8G1K08A DIP8 package costs only 0.3usd
เจ้า STC8G1K08A ตัวนี้มี GPIO 6 ขา ส่วน reset pin ก็เอาไปใช้เป็น IO ได้ เพราะมัน program ผ่าน rx,tx pin , มี hardware serial ส่วน ATTiny85 ยังไม่มีเลย ค่าตัวก็ไม่สูงมาก ราวๆ  0.3usd

Fig.5 STC8H3K64S2 and bare board.

24C128 EEPROM

 

Fig.1 EEPROM 24C128N.

ก่อนความจำที่แสนสั้นจะลืมเลือน เลยมาบันทึกไว้สักหน่อยว่าด้วยเรื่องการเขียนข้อมูลลง EEPROM 

    มีของอยู่ในมือเป็น Atmel 24C256 และจากจีน ATMTC087 24C128N ต่างกันที่ความจุ ส่วน address ในการอ่าน-เขียนเหมือนกัน 0x50 (A0,A1 floating or GND) ถ้าใช้อันเดียวก็ต่อสาย VCC,GND,SDA,SCL ที่เหลือปล่อยลอยๆ ไม่ต้องต่ออะไร แล้วก็ใช้ address 0x50 (หรือ 80 เลขฐานสิบ)

Fig.2 Pin 24Cxxx pin

    เอาไว้เก็บข้อมูลบางอย่าง เคยเอาไว้เก็บพารามิเตอร์ของโปรแกรม ค่า setting ต่างๆ เมื่อไฟดับลง ค่าที่เก็บไว้ก็ยังอยู่ เปิดเครื่องขึ้นมาก็อ่านเข้ามาใช้งานได้ต่อไป ไม่ต้องไปไล่ตั้งค่ากันอีก

    แต่ตอนเขียนข้อมูลนั้นมีข้อควรพึงระวังไว้ ในกรณีเขียนต่อเนื่องมันเขียนได้ทีละ 64byte เกินกว่านี้มันเอาส่วนที่เกินไปเขียนตั้งต้นใหม่ (rollover)  ดูรูปประกอบ ก็ต้องเขียนไม่ให้เกินกว่านั้น ถ้าจะข้ามรอยต่อ address 63 และ address 64 ก็เอาส่วนที่เกินไปเริ่มที่ address 64 เป็นแบบนี้เรื่อยไป

    แต่ถ้าใช้ไลบรารี่หรือว่าเขียนทีละ address ก็ไม่ต้องกังวล

Fig.3 writing into 24C128,256 EEPROM and rollover

 การอ่านเขียนผ่าน Wire library มีบัฟเฟอร์ 32byte ก็อ่าน-เขียนไม่เกินนี้ เคยเห็นเขาเอาแค่ 28 ประมาณนั้น ตัวอย่าง อ่านทีละ 16 byte จำนวน 10 รอบ ก็ได้ข้อมูล 160 byte ข้อมูลเดิม fill ด้วย 0xFF

Fig.4 Reading data from eeprom q'ty 160byte

เรื่องก็มีเท่านี้

วันอาทิตย์ที่ 18 ธันวาคม พ.ศ. 2565

Flashing ATTiny85 with Arduino ISP, LGT8F as ISP


    

 เนื่องจากบอร์ด ATTiny85 ไม่รู้เป็นไร เสียบสาย usb แล้วหากันไม่เจอ จะติดตั้ง bootloader ก็ทำไม่เป็น/ทำไม่ได้ เลยต้องเอาบอร์ดอื่นเป็น ISP และบอร์ดที่โชคดีก็เป็น LGT8F SSO20

    ขั้นตอนประมาณนี้
1. การทำ ISP
2. การ upload sketch ไปยังบอร์ดที่ต้องการ(target) โดยทำผ่าน ISP

ขั้นตอนที่ 1 การเตรียม ISP
ไปเปิด ArduinoISP เปิดขึ้นมาแล้วปรับแก้นิดหน่อย ให้เป็น RESET 2 และ MOSI 10 เนื่องจากบอร์ดที่เลือกใช้ ขามันไม่หมือนชาวบ้านเขา ถ้าบอร์ดอื่นก็ไม่ต้องแก้


Fig.1 Open example sketch

Fig.2 Edit pin no for LGT8F as programmer/ISP
เตรียมเรื่อง sketch แล้ว จากนั้นก็เลือกบอร์ด เพื่อจะได้ upload ลงตัวบอร์ด(LGT8F) เพื่อติดตั้งโปรแกรมให้มันเป็นตัว ISP เสียบสายให้เรียบร้อย

Fig.3 Select board.

Fig.4 Final checking

จากนั้นก็กด upload ตามปกติ เท่ากับว่าตอนนี้ได้ ArduinoISP แล้ว เก็บไว้ใช้ก็ได้

ขั้นตอน 2 ทำการ upload sketch ที่ต้องการ
ตอนนี้ต้องต่อสายไฟระหว่าง ISP กับ target เข้าหากัน
มี 4 สายที่ต้องต่อหากัน ที่ target มีอยู่ 4 ขา คือ MOSI,MISO,SCK,RESET แล้วจะต่อไปยัง ISP ที่ขาไหน

    ตามที่ทำ ISP เรากำหนดไว้แบบนี้
        2 RESET
        10 MOSI
        13 MISO
        13 SCK 

จากนั้นก็ต่อสายจาก ISP ไป ATTiny85
ISP    ATTiny85
10 <-----> P0
12 <-----> P1
13 <-----> P2
2 <------> P5


Fig. 5 Wiring between target and ISP.

    ตัว ISP นั้นก็ต่อสายไฟเข้าคอมพิวเตอร์ปกติเหมือนตอนทำ ISP
    จากนั้นก็เปิด sketch ที่ต้องการ แล้วก็เลือกบอร์ดที่ต้องการ upload เลือก ATTiny85 แล้วก็เลือก Programmer "Arduino as ISP" จากนั้นก็กดเมนู Sketch/Upload Using Programmer

Fig.6 Target setting.

Fig.7 Uploading, final result shown.

เอาไว้ใช้งานแก้ขัดยามไม่มีอะไรให้เลือกมากนัก จากคลิป ตอน upload มันจะกระพริบถี่ๆ ที่ ISP โดยเป็นการ upload sketch ใหม่เข้าไปซึ่งไฟ LED มันจะกระพริบถี่ขึ้นกว่าเดิม upload เสร็จมันก็ทำงานทันที






ATTiny85+PCF8574+HMI

Fig.1 Attiny85 clone version

    

 Attiny85 ตัวเล็กๆ มีแค่ 6 ขา ใช้ได้ 5 ขา อีกขาเป็น reset จะใช้งานมันเป็น IO ต้องแก้ fuse และอีกเรื่อง พอเลิกให้มันเป็นขา RESET แล้ว มันก็จะไม่สามารถ upload sketch มาที่บอร์ดโดยใช้ ISP ได้ ต้องทำผ่าน usb อย่างเดียว วันไหนติดต่อกันไม่ได้ทาง usb ก็จะลำบากล่ะ ว่ากันว่าใน sleep mode มันประหยัดไฟมากมาย มันรันที่ 128kHz ใช้ไฟ volt ต่ำ

    ถึงตัวจะเล็กขาจะน้อย มันก็สามารถใช้ I2C และ TTL Serial ได้
เลยลองเอามาขยำรวมกัน Attiny85, PCF8574 และ HMI เพื่อควบคุม IO ของ PCF8574 สั่งงานจาก HMI

TTL ใช้ SoftSerial.h                        
I2C ใช้ Wire.h                                
ใช้ MAX485 เพื่อควบคุมทิศทาง          
    ต่อกันหมด GPIO กันเลยเชียว ใช้ Modbus Protocol และใช้แค่ function code 1,5 ตอนทดลองมันมีการรับส่งข้อมูลผิดพลาดในบางจังหวะ โดยที่ HMI ใช้ frame interval 40ms, timeout 50ms.
    ลองปรับให้ master retry sending จาก 1 เป็น 2 ลดข้อผิดพลาดลงได้เยอะ

Fig.2. Pin configuration

Fig.3 PCF8574 with port test LED

Fig.4 ATtiny85 equipped with MAX485.

Fig.5 Attiny85 IO controller.

ทำแล้วไม่เห็นประโยชน์อะไรมากมายเลย แค่ได้ลอง งานแบบนี้เอาอย่างอื่นมาทำก็ได้ อย่างเช่นบอร์ด Attiny88 ที่มี IO เยอะ อีกอย่างบอร์ดก็ไม่ได้ถูกนัก ตอนปี 2018 นั้นซื้อมา 1.35usd ตอนนี้ปี 2022 ราคา 2.1usd (ราคา Tiny88 1.2usd)


At Dormitory
Dec18,2022

วันศุกร์ที่ 16 ธันวาคม พ.ศ. 2565

IO EXTENDER MODULE, PCF8574

     

Fig.1 PCF8574 IO extender.

    การเพิ่ม IO ให้กับระบบ มีหลายแนวทาง ใช้ RS485 module ก็ได้ เพิ่มได้บานเบอะเยอะแยะ แต่ที่จะเขียนกันลืมนั้นเป็นบอร์ดที่ใช้เพิ่ม IO ที่ใช้ชิพ PCF8574 ของ NXP (Philips เดิม) สนนราคาอันละ 27บาท(ณ 11/2564)  เพียง 1 บอร์ดจะเพิ่มได้ 8 I/O ทั้งนี้มันสามารถต่อกันได้อีกรวมๆ 8บอร์ด (มันมีสาม DIP switch/jumper ไว้ใช้กำหนดเลข slave 2^3 = 8 เลข) ซึ่งเมื่อต่อกันได้ 8 อันก็จะได้ 64I/O

    มันใช้ I2C protocol ใช้งานเพียง 2 สาย ต่อสาย SDA-A4, SCL-A5 มันต้องมีหมายเลขประจำตัวของใครของมันเรียกว่า address

Fig.2 Setting address.
   

    Address กำหนดได้ด้วย 1 byte แบบนี้ 0b0100 A2 A1 A0  โดยที่ bit A2,1,0 จะมี logic เป็น 0 ถ้าต่อ GND และเป็น 1 ถ้าต่อ Vcc (ย้าย jumper เอา) ถ้าใช้บอร์ดเดียวก็ต่อกราวน์หมด แล้วใช้แอดเดรส 0x20

Fig.3 Available setting address.

    ต่อกราวน์ทั้งหมด ก็จะได้แอดเดรส 20H  การสั่งงานก็ใช้ wire library ช่วย และคำสั่งที่ใช้ก็แค่

    #define <Wire.h>   
    Wire.begin();
    Wire.beginTransmission(0x20);     //0x20 คือแอดเดรสของบอร์ด
    Wire.write(data) ;                        //
โดย data 1 byte เป็น bit ของ portP7....P0
    Wire.endTransmission();

ตัวอย่าง
    data = 0b11111111 หมายถึง P7-P0 จะมี logic High
    data = 0b00000000 หมายถึง P7-P0 จะมี logic Low
    อยากจะเปิด ปิด อันไหนก็เลือกเอา


    ส่วนการอ่านค่า port input (นึกถึงคำสั่ง digitalRead แบบเดียวกันเลย ) จะมีคำสั่งต่างกันนิดหน่อย คำสั่งนี้ทำไปเพื่อดูสถานะของ P7..P0 ว่าเปิดปิดยังไงกันอยู่
ตัวอย่าง
    byte state;
    byte nData = 1;                            //จำนวน 1 byte
    Wire.requestFrom(0x20,nData);      //address 20 จำนวน 1 register 
    if(Wire.available())
      state = Wire.read();                    //เก็บข้อมูลใส่ตัวแปร state จากนั้นจะเอาไปทำไรก็ตามสะดวก
    Serial.println(state,BIN);                //แสดงผลลัพธ์ 

Fig.4 Master read register's status.

ตบท้ายนี้

PCF8574 มันไม่ได้เป็นแค่ Output อย่างเดียว มันทำได้ 4 อย่าง

    1. Input HIGH
    2. Input LOW
    3. Output HIGH
    4. Output LOW

Input HIGH จะกำหนดให้เป็น input ก็กำหนด logic 1 ให้พอร์ตนั้น จากนั้นก็อ่านค่า register เพื่อดูสถานะของพอร์ตนั้นว่า เป็น 1 หรือ 0

Input LOW กำหนด logic 1 ให้พอร์ตนั้น จากนั้นก็อ่านค่า register เพื่อดูสถานะของพอร์ตนั้น ถ้า external ที่ต่อที่พอร์ตนั้นดึงลงกราวน์ หรือมี logic 0 (พอร์ตนี้มีกระแสอ่อนๆ 100uA เป็น source) เมื่ออ่านค่า register ก็จะได้ logic 0

Output HIGH กำหนด logic 1 ให้พอร์ตนั้น เหมือนตัวอย่างข้างต้น

Output LOW กำหนด logic 0 ให้พอร์ตนั้น เหมือนตัวอย่างข้างต้น

เกร็ดเล็กเกร็ดน้อย

    - กระแสที่ออกจากพอร์ตเมื่อเป็น source(ไหลออกพอร์ต) แค่ 100uA เอง หวังจะเอาไปขับโหลดอะไรได้ ทำให้ LED หลายอันติดก็คงลำบาก ตรงนี้ต้องใช้ทรานซิสเตอร์ช่วย
    - ถ้าให้พอร์ตเป็น sink (ไหลเข้าพอร์ต) กระแสทั้งหมดต้องไม่เกิน 80mA และทำได้แค่ 10mA ต่อพอร์ต(ที่ 5V) อยากได้ 20mA ก็ต่อขนาน 2 พอร์ต และเมื่อมีการขนานกัน 5 พอร์ตจะทำได้ 80mA และก็ไม่ควรจะทำงานพร้อมกัน

Fig.5 High current application

ข้อแนะนำ

เอาง่ายๆ ก็หาไบบรารี่มาใช้ หรือไม่ก็ทำเป็นฟังก์ชั่น จะได้เอาเวลาไปทำอย่างอื่น

"เวลาของโปรเซสเซอร์มีค่าน้อยมาก เมื่อเทียบกับเวลาของเรา"
ฝรั่งท่านหนึ่งได้กล่าวเอาไว้

MAPs

วันก่อนได้ลองเขียนแบบ แบบตัวนั้นมันต้องแนบแผนที่สังเขปของโครงการ ลองๆ แล้วก็ใช้ snazzymaps แล้วก็เอามาทำต่อใน inkscape มันก็ออกมาดูได้ระดับห...