Atmega328P Datasheet 18. I/O Ports 1

Started by tha, August 25, 2019, 09:42:42 AM

Previous topic - Next topic

tha

พรายกระซิบบอกให้ไปเช็คโปรเจ็คที่ใช้ lcd16x2 ของ stm32 ที่เคยทำไว้ ก็เป็นตัวอย่างของ ETT นั่นแหละ ก็เลยไปเช็คดู พบว่าในโปรแกรมของ stm32 มีการเช็ค busy flag ด้วย โปรแกรมที่ผมทำมันเลยได้บ้างไม่ได้บ้างเพราะไม่ได้เช็ค busy flag นี่เอง ยังไงนะให้แปลดาต้าชีทของ lcd16x2 เอาที่ดาวน์โหลดของเว๊บ electronicWings เลยนะ ยังไม่รู้เรื่องเหมือนกัน งั้นเดี๋ยวจะลองแปลดู จะได้ละเอียดๆ

tha

ก็เอาตัวอย่างของบอร์ด ET-STM32F103RB มาทำเป็น Header file LCD16x2.h เก็บเอาไว้ใช้กับโปรแกรมอื่นๆได้ง่ายดี ลองเอาไปดูกันครับ
http://www.mediafire.com/file/tczke251kbwww5s/ET-STM32F103_LCD16X4_BMP085.rar/file

tha

เสิร์จกูเกิ้ลด้วย "อธิบาย LCD16x2" เจอนี่มา คงไม่ต้องแปลแล้วใช่ป่าว อ่านนี่ง่ายกว่า หรือว่าไง ลองอ่านกันดูก่อนครับ       
https://piyawat1989.files.wordpress.com/2017/03/618352ch05.pdf


tha

CGRAM เราคงไม่ค่อยได้ใช้ ก็จะไม่ศึกษานะเพราะเดี๋ยวจะมั่วกันไปใหญ่(ไม่รู้ด้วยว่า address มันอยู่แถวไหนด้วย  :P)
คราวนี้ก็มาแก้ไฟล์ LCD16x2.h ของ stm32 ให้มาใช้กับ AVR ของเรา ก็จะได้เป็นแบบนี้
http://www.mediafire.com/file/x5262nhpfljvf8w/LCD16X2.h/file

มาลงให้ดูก่อน ยังไม่ได้ลองกับบอร์ด ยังไม่แน่ใจที่จุดนี้ที่เช็ค busy flag
Quote
  if (LCD_Data_Port & (1<<LCD_D7_PIN))      // Check Busy Flag
ว่าเช็คแบบนี้ถูกต้องหรือเปล่า ถ้าบิท D7 ยังเป็น "1" อยู่แสดงว่า busy อยู่ ก็จะวนลูปอยู่จนกว่าจะเป็น "0"
ก็ดูมาจากตรงนี้ ในไฟล์ sfr_defs.h ใน C:\WinAVR-20100110\avr\include\avr ลองไล่เช็คดู ไฟล์ sfr_defs.h ก็ถูก include เข้าในไฟล์ io.h นั่นแหละ
Quote
#define bit_is_set(sfr, bit) (_SFR_BYTE(sfr) & _BV(bit))
ก็เอาด้านหลังมาเลยเพราะกลัวจะงงกัน
ส่วนตรงอื่นๆรู้สึกมั่นใจว่าถูกนะ ยังไม่ได้ลอง เดี๋ยวช่วงบ่ายจะออกไปธุระก่อน เลยเอามาลงให้เช็คความถูกต้องกัน

tha

มีผิดอยู่จุดตรงเช็ค busy flag ต้องอ่าน PIN ไม่ใช่อ่าน PORT ก็ได้แก้ใขแล้ว
อันนี้ทำเป็น 4 bit แล้ว D4-7 = PD4-7, RS = PB0, RW = PB1, EN = PB0
อันนี้ทำ header file LCD16x2.h แยกไว้ต่างหาก เอาไปใช้กับโปรเจ็คอื่นได้ง่าย ผมใช้โปรแกรม keil เปิดแล้วแก้ใข เสร็จแล้วก็ก๊อบปี้มาวางในโปรเจ็ค เวลาจะให้แสดงก็เพียงคลิกซ้ายคลิกขวาที่ header file ในหน้าต่างของ AVR Studio 4 แล้วก็ add header file เข้ามาแค่นี้ก็เสร็จ

http://www.mediafire.com/file/uwt6aygloahf1uf/LCD16x2_4bit.rar/file





ปล. มีปัญหาจอขาวเหมือนกัน ก็มึนไปพัก แต่ก็เช็คเจอที่ตรงเช็ค busy flag ไปอ่าน PORTD ไม่ได้อ่าน PIND ก็แก้ใขแล้ว คราวนี้จะรีเซ็ทยังไงก็ไม่มีปัญหา ต้องขอขอบคุณทางทีมงาน ETT นะ ขอเอาไฟล์มาใช้นะครับ ขอบคุณครับ :D

tha

พรายกระซิบบอกให้ลองทำ ADC แล้วให้มาแสดงที่หน้าจอ LCD16x2 ดู ชักลืมแล้ว ADC เดี๋ยวจะทบทวนดูก่อน ดูดาต้าชีทด้วย ตรงนี้ก็เคยทำ
http://www.electoday.com/index.php/topic,15922.8.html
http://maxembedded.com/2011/06/the-adc-of-the-avr/
http://extremeelectronics.co.in/avr-tutorials/using-adc-of-avr-microcontroller/

tha

ได้แล้ว วัด ADC Channel 0 (PC0) มาโชว์ที่จอ LCD16x2 ท่านใดไม่เข้าใจเรื่อง ADC ก็หาหนังสือมาอ่านก่อนนะ ยังแปลไม่ถึง แต่ไม่ตรงตัวเท่าไหร่ ในหนังสือเป็น ATmega16 ของเรา ATmega328p ก็ต้องดูรีจีสเตอร์ในดาต้าชีสประกอบด้วย
ส่วน prescaler ต้องหาร clock 16MHz ด้วย 128 จะได้ = 125KHz ถึงจะไม่เกิน ADC clock 200kHz ตามที่ดาต้าชีทระบุไว้ระหว่าง 50 - 200 kHz

http://www.mediafire.com/file/ug84naeqqimvsdm/LCD16x2_ADC_1.rar/file 



ปล. ไปเดินออกกำลังกายสักหน่อย มีปัญหาอะไรไว้พรุ่งนี้ก็ได้

tha

ลองมาทำ ADC 2 channel(PC0,PC1) ดู ก็สามารถทำงานได้ครับ ลองเอาไปดูกัน

http://www.mediafire.com/file/r5emp0yj326rho0/LCD16x2_ADC_2.rar/file



ฟังชั่น sprintf ลองใช้ %0.2f แล้วบังคับตัวแปรให้เป็น (float) ให้คำนวณเป็นจุดทศนิยมเลย อย่างตัวอย่างของ stm32 ที่ให้ไปก็ทำไม่ได้ ขึ้นแสดงเป็นเครื่องหมาย ? ก็เลยต้องใช้รูปแบบเดิม %d.%d หารเอาส่วนก็เป็น %d ตัวแรก หารเอาเศษก็เป็น %d ตัวหลัง มี . คั่น ก็แสดงเป็นจุดทศนิยมได้ สงสัย ATmega328p 8 บิท มันคงจะคำนวณตัวแปร float ไม่ไหวใช่ไหม?