Atmega328P Datasheet 18. I/O Ports 1

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

Previous topic - Next topic

tha

คราวนี้ลองเอาบอร์ด ET-BASE AVR EASY32U4 มาต่อกับจอ nokia5110 อีกที แล้ววัด adc 4 channel 7,6,5,4 มาแสดงผลบนจอ ก็สามารถทำได้ มันใช้ไฟ 3.3V ก็มีการแก้ใขการคำนวณนิดหน่อย 8 บิทมันคำนวณจุดทศนิยมไม่ไหว ก็ใช้วิธีนี้ แทนที่จะคูณด้วย 3.3 ก็เป็น 33/10 แทน ดูเอานะครับ

http://www.mediafire.com/file/28kqqrl9udrglwg/GLCD5110_32u4_adc.rar/file


tha

ท่านใดแจ้งมาว่า ADC clock prescaler ไม่ได้แก้ เพราะมาใช้ crystal 8MHz เพื่อให้มาใช้กับไฟ 3.3v ได้แล้ว แต่ก็ยังไม่ผิดนะเพราะตั้ง ADC clock prescaler ไว้ที่ 128 แล้ว system clock = 8MHz ก็จะได้ ADC clock = 62.5kHz ก็ยังอยู่ในย่าน 50 - 200kHz อยู่นะ ถ้าเราต้องการให้ไวๆ ก็สามารถตั้ง ADC clock prescaler = 64 ก็ได้ ก็จะได้ ADC clock = 125kHz ก็จะเร็วขึ้นครับ

tha

ท่านใดแจ้งมาว่าใช้ถ่านไฟเป็น power supply แล้วมาวัด ADC จะมีปัญหา ถ้าแรงดันไฟมันอ่อนตกลง แล้วจะวัดค่าได้ไม่ตรง ก็มีปัญหาสิ ลองคิดกันดู ผมก็จนปัญญาเหมือนกัน ถ้าใช้ ADC ก็ควรใช้ power supply ที่มีแรงดันไฟที่คงที่ก็แล้วกันครับ


tha

ท่านใดแนะนำมาให้ทำเฮดเดอร์ไฟล์ให้ lcdInit(); แยกต่างหากเหมือนอย่าง ADCInit(), LCDInit(); ก็ได้ตรวจเช็คโปรแกรมดู ก็สามารถทำได้โดย comment out (เอาออก) เอา lcdInit(); ออกที่จุดนี้
Quote
void configGlcd()
{
    if(glcd_ini==0)
    {
        glcd_ini=1;
        //lcdInit();
        lcdClear();
    }
}
แล้วที่เมนโปรแกรม เราก็ประกาศ lcdInit(); ก่อนตามตัวอย่าง จะได้เหมือนกับ ADCInit(), LCDInit();
แต่ว่าไปโปรแกรมเก่ามันก็ทำฟังชั่น lcdInit(); ครั้งเดียวนะ เพราะเมื่อ glcd_ini = 1; แล้ว มันก็จะไม่วนทำซ้ำอีก เพราะฟังชั่น if เป็นเท็จไปแล้วเมื่อ glcd_ini = 1 ลองตรวจเช็คกันดูนะว่าแบบไหนดีกว่ากัน ก็มีตัวอย่างมาให้ดู

http://www.mediafire.com/file/4xc9bpp8bge3p66/GLCD5110_32u4_6.rar/file

tha

ตกลงใช้เฮดเดอร์ไฟล์ของตัวเก่า glcd5110_32u4_1.h นะ rebuild แล้ว code size เท่ากัน
ใส่ volatile unsigned char glcd_ini=0; ก็ code size เท่ากัน ไม่มีผลอะไร ถ้าตัวแปรถูกใช้ในหลายฟังชั่นย่อย ถึงต้องประกาศตัวแปรเป็น volatile เพื่อไม่ให้คอมไพลเลอร์มันบีบอัดตัดทอน ทำให้โปรแกรมไม่ทำงานตามที่เราเขียนโปรแกรม
ตกลงประกาศเป็น volatile เอาไว้นะเพราะประกาศอยู่ที่หัวของโปรแกรมเลย ถึงจะใช้ในฟังชั่นย่อยฟังชั่นเดียวก็ตาม แก้กันเองได้นะครับ
พรายกระซิบบอก ให้ประกาศเป็น volatile ไว้เลย ไม่งั้นมันอาจจะทำฟังชั่น lcdInit(); หลายรอบก็ได้ มีอะไรก็แนะนำกันมานะครับ ทำกันเป็นทีม จะได้รอบคอบ

tha

ADC แบบ interrupt ก็เหมือนกันกับที่ทำกับจอ LCD16x4 นั่นแหละ ไม่เหมือนกันที่จอเท่านั้นเอง ลองทำกันดูนะครับ

moneyp1000