Atmega328P Datasheet 18. I/O Ports 1

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

Previous topic - Next topic

tha

ท่านใดแนะนำมาให้ลองต่อกับจอ GLCD5110 ดู พอดีมีไฟล์คู่มือภาษาไทยพร้อมตัวอย่างของ ETT และไฟล์โปรแกรมของ INEX ของบอร์ด stm32 จะอัฟโหลดคู่มือให้ไปศึกษาจะได้รู้ไปพร้อมกัน คงจะไม่หวงนะที่ผมจะเผยแผ่และขอขอบคุณมา ณ ที่นี้ด้วยครับ
จอ GLCD5110 มันใช้กับไฟ 3.3V เราก็จะต้องลดโวลท์ของบอร์ด 32u4 ลงมา 3.3V ด้วย ซึ่งก็สามารถทำได้ แต่ก็จะต้องลด system clock ลงมาด้วย(ดูที่กราฟคุณสมบัติหน้าไหนนะเคยเอามาลงแล้วหรือดูที่ดาต้าชีท) ลดเหลือ 8MHz ก็ใช้ได้ แต่จะไม่เปลี่ยน crystal จาก 16MHz เป็น 8MHz นะ แต่จะใช้วิธีหารด้วย clock prescaler แทน(หารสอง) ก็จะเหลือ 8MHz อย่างนี้ใช้ได้ไหมทุกท่าน

http://www.mediafire.com/file/wa03tiw08tvslzg/ET-NOKIA_LCD_5110.rar/file

แต่จอ LCD16x4 กับ ADC ยังไม่จบนะ วันนี้งดก่อนหนึ่งวัน ไม่รู้ตามกันทันไหม ไปช้าๆเอาดีกว่านะ จะได้แน่นๆรู้ลึกรู้จริงดีกว่าครับ

tha

ลองเอาตัวอย่างไปเต็มโปรเจ็คก็ได้สำหรับจอ GLCD5110 ต่อกับ ET-STM32F103RB
http://www.mediafire.com/file/7k0vnlw3c1y7kni/ET-STM32F103_NOKIA5110_HMC5883L.rar/file

tha

มาลองบอร์ด ET-BASE AVR EASY32U4 ADC มาแสดงผลที่จอ LCD16x4 เอามาแสดงผล 4 channel เลย โวลุ่ม 10k ผมมีเยอะ ก็ไล่จาก adc7 ไป 6, 5, 4 ตามพินของบอร์ด ADC ของ 32u4 นี้จะมี MUX ถึง 6 บิทเลย ที่เรียงกันก็มี 5 บิท (MUX 4:0) ในรีจีสเตอร์ ADMUX ส่วน MUX บิทที่ 6(MUX 5) ไปอยู่ที่รีจีสเตอร์ ADCSRB เลย(ดูดาต้าชีทประกอบ) แต่ตอนนี้เรายังแปลไม่ถึงก็เขียนโปรแกรมง่ายๆไปก่อน ไว้แปลถึงแล้วคงจะได้ลองใช้งานให้เต็มที่ว่าทำอะไรได้บ้าง
คราวนี้มาถึงจุดนี้ของโปรแกรม
Quote
//sprintf(LCD_buf,"%d.%d ", (adc_result*5)/Vadc,(((adc_result*5)%Vadc)*100)/Vadc);
  sprintf(LCD_buf,"%d.%d ", (adc_result*5)/Vadc,(((adc_result*5)%Vadc)*10)/102);
ด้วยพลังของ 8 บิท ให้มันคูณด้วย 100 หารด้วย Vadc(1023) มันคงทำงานไม่ไหว ได้ค่าไม่ตรง อย่าง adc_result = 1022 แล้ว แสดงค่ามาได้ 4.35V เอง แต่พอลดทอนตัวคูณตัวหารมา(สิบ *10/102)แล้ว ค่าที่แสดงได้จะตรง อย่าง adc_result = 1022 แล้ว แสดงค่ามาได้ 4.99V ตรง
ไล่แก้ที่โปรแกรมก่อนหน้าที่ทำมาด้วยครับ ผิดพลาดอีกแล้ว  ;D
มีโปรแกรมตัวอย่าง
http://www.mediafire.com/file/6kmbptiy8dqlng4/LCD16x4_32u4_adc2.rar/file




tha

คราวนี้มาลองบอร์ด ET-BASE AVR EASY32U4 ADC แบบ interrupt ดูบ้าง ก็ทำงานได้เหมือนกัน
http://www.mediafire.com/file/gicbn9ri3p4lr6a/LCD16x4_32u4_adc3.rar/file

ปล. เดี๋ยวพรุ่งนี้จะลองพิมพ์ที่ usart แล้วมาแสดงผลที่จอ LCD16x4 ดูนะ ไม่รู้มีท่านใดแนะนำมา เดี๋ยวจะลองทำดู

tha

มีท่านใดแนะนำมา เอา adc มาแสดงเฉยๆ สามารถตัวแปร adc_result เพียงตัวเดียวก็ได้ พอมาลองทำตามดูก็สามารถทำได้ครับ ต้องขอขอบคุณด้วย ทำกันหลายๆแบบเป็นตัวอย่างเก็บเอาไว้ใช้ ส่วนตรงฟังชั่น sprintf หารเอาส่วนมาต่อหลังจุดทศนิยม ไม่สามารถลดทอนได้อีก มันจะมีสดุดตอนที่เราปรับโวลุ่ม(ค่า)ขึ้น แทนที่จะขึ้นจาก 4.9->4.99->5.0V กลับเป็น 4.9->4.10->5.0V ครับ ใช้รูปแบบนี้ได้ค่าถูกต้องดีแล้วครับ
Quote
sprintf(LCD_buf,"%d.%d ", (adc_result*5)/Vadc,(((adc_result*5)%Vadc)*10)/102);

http://www.mediafire.com/file/4iqebis354cx3v7/LCD16x4_32u4_adc4.rar/file

tha

อย่างนี้ก็ไม่ได้อีก ขึ้นค่าไม่ถูกต้องเหมือนกัน อย่างปรับค่าเป็น 3.05V แทนที่จะขึ้นค่าอย่างนี้ กลับแสดงได้เป็น 3.5V ไป ไม่ได้สังเกตุดูให้ดีๆ เดี๋ยวลองหาวิธีดูก่อน ไม่ทราบท่านใดแนะนำมา ต้องขอขอบคุณด้วยครับ

tha

แก้ไขได้ละ ทำแบบนี้เอา ถ้าได้ค่าต่ำกว่า 10 ก็เติม 0 เข้าไป ก็จะแสดงผลได้ถูกต้องแล้วครับ มีท่านใดแนะนำมาอีกไหมนี่ เราทำงานกันเป็นทีมนะ ต้องขอขอบคุณด้วย ช่วยแก้ไขในโปรแกรมก่อนหน้าด้วยครับ
Quote
c = (adc_result*5)/Vadc;
  d = (((adc_result*5)%Vadc)*10)/102;
  if(d<10)
    {
     //sprintf(LCD_buf,"%d.%d ", (adc_result*5)/Vadc,(((adc_result*5)%Vadc)*100)/Vadc);
     //sprintf(LCD_buf,"%d.%d ", (adc_result*5)/Vadc,(((adc_result*5)%Vadc)*10)/102);
      sprintf(LCD_buf,"%d.0%d ", c, d);
   }
  else
   {
     sprintf(LCD_buf,"%d.%d ", c, d);
    }

http://www.mediafire.com/file/d7p33hlrvn3ug25/LCD16x4_32u4_adc4%25282%2529.rar/file

tha

คราวนี้มาลองบอร์ด ET-BASE AVR EASY32U4 ADC มาแสดงที่ uart ด้วย LCD16x4 ด้วย เรามีเฮดเดอร์ไฟล์เก็บเอาไว้เยอะแล้ว ก็เป็นเรื่องง่ายที่จะนำเอามาใช้ เพียง #include file เข้าไปก็เรียกใช้งานเฮดเดอร์ไฟล์นั้นได้แล้ว มีโปรแกรมตัวอย่างครับ

http://www.mediafire.com/file/cik06hmckqfooaj/LCD16x4_32u4_adc_uart1.rar/file