รบกวนปรืกษา ภาษา c ใช้avr ให้แสดงข้อความและVoltage จากA2D ให้แสดงที่LCD

Started by kook, March 24, 2013, 02:38:05 PM

Previous topic - Next topic

kook

ผมพึ่งลองใช้ avr atmega32  และพึ่งฝึกเขียนภาษา c คับเลยอ่อนภาษา c มาก รบกวน ช่วยบอกความหมายของแต่ละบรรทัด(ที่เป็นสีแดง)ว่าคืออะไร อย่างละเอียดเลยยิ่งดีคับ   
อันนี้ผมใช้โปรแกรมCodeVisionAVR แล้ว generate  เขียนโปรแกรมให้ แสดงข้อความและค่าVoltage ของR ปรับค่าได้ แสดงที่ LCD    (R ปรับค่าได้ต่อที่ADC0)



Program 10 bit show A2D volmiter 0-5V todsaniyom 3 tumnang
/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.6 Professional
Automatic Program Generator
© Copyright 1998-2005 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
e-mail:office@hpinfotech.com

Project :
Version :
Date    : 1/4/1980
Author  : F4CG                           
Company : F4CG                           
Comments:


Chip type           : ATmega32
Program type        : Application
Clock frequency     : 7.372800 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 512
*****************************************************/

#include <mega32.h>

// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>

// Standard Input/Output functions
#include <stdio.h>

#define ADC_VREF_TYPE 0x20
void print_LCD(unsigned char *x);

#define ADC_VREF_TYPE 0x40

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
// Declare your global variables here
unsigned char s1[16],s[16];
void main(void)
{
// Declare your local variables here
unsigned char a,b,i;
float t;

PORTA=0x00;
DDRA=0x00;


PORTB=0x00;
DDRB=0x00;


PORTC=0x00;
DDRC=0x00;


PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x2F;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC Clock frequency: 115.200 kHz
// ADC Voltage Reference: AREF pin
// Only the 8 most significant bits of
// the AD conversion result are used
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x86;

// LCD module initialization
lcd_init(16);
lcd_clear();
while (1)
      {
     t = read_adc(0);   
     t =(t*5.00)/1023;      //บรรทัดนี้ขออย่างละเอียดคับ
     sprintf(s1,"  test   ");
     lcd_gotoxy(0,0);                 
     print_LCD(s1);
       sprintf(s,"Voltage: %0.3f V",t);
     lcd_gotoxy(0,1);
     print_LCD(s);       
                       
      };
}                 
void print_LCD(unsigned char *x)
{
    int i;
    for(i=0;i<16;i++){
    lcd_putchar(*x);
    x++;
    }
       
}

zilog

ผมว่ามันคงไม่เกี่ยวกับอ่อนภาษา C นะ
แต่น่าจะเป็นเพราะไม่อ่าน Manual ของ CodeVision เลยมากกว่า
ลองอ่านดูก่อนครับ มันบอกทุกอย่างแล้ว ใน Manual ของ Tool นี้นะ
ไม่ยากนะครับ ของดีๆ ที่ท่านอยากรู้อยู่ใน Manual นั้นแล้ว

และหากรู้ตัวว่า ภาษา C อ่อนด้วย ก็ศึกษาอ่านและฝึกฝนให้มากขึ้นครับจะช่วยท่านได้แน่นอน
ลองพยายามดูก่อน จะช่วยท่านได้มากกว่าถามผู้อื่นนะครับ
http://www.bloggang.com/viewblog.php?id=kingmaithai&date=25-10-2005&group=27&gblog=7
http://www.pantown.com/board.php?id=20933&area=3&name=board3&topic=43&action=view

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



kook

ขอบคุณสำหรับคำตอบคับ  เด๋วไว้ไปศึกษาผ่านGoogleเอาเองดีกว่าคับดีกว่ามาตั้งกระทู้มึนๆอยู่ เพราะพื้นฐานไม่มีเลย

zilog

ยินดีกับท่าน kook นะครับ ที่จะพยายามศึกษาหาความรู้มาก่อน ติดขัดอย่างไร ก็ค่อยมาสอบถามในส่วนที่สงสัยเป็นเรื่องๆไปครับ
ซึ่งในเรื่องพื้นฐานท่านหาคำตอบได้เองจาก Google อยู่แล้ว แต่หากเป็นเรื่องข้อสงสัยในประสบการณ์ก็ลองมาสอบถามกันมาได้ครับ
เพื่อที่จะได้ไม่เป็นการรบกวน เพื่อนๆพี่ๆ เขามากนัก

อ้อ รบกวนเรื่อง แก้ภาษาไทย บ้างก็จะดีนะครับ เป็นการให้เกียรติผู้ตอบนะครับ อย่าง
คับ  ควรเป็น "ครับ"
เด๋ว  ควรเป็น เดี๋ยว



firmware.c

อันดับแรกหาหนังสือ C programming มาอ่านครับ ส่วนไหนที่นอกเหนือจากนั้นอ่าน manual ของ CodeVisoin
IAR Embedded Workbench for ARM
AVR-Studio + AVR-GCC
CodeBlocks + MinGw
CodeBlocks + Gtk+

wlasoi

อย่าเพิ่งรีบ ... ให้อ่านกันก่อน ครับ เริ่มใหม่ๆ .. อ่านกันหนักๆ เข้าไว้ หาหนังสือที่พอคิดว่า อ่านแล้วเข้าใจง่ายๆ หนังสือที่ผมส่ง Link ไปให้ เล่มนั้เป็นเล่มเดียวที่ ใช้ codevision ทั้งเล่ม .. ค่อนข้างจะง่าย แรกๆมันจะมึนๆ งงๆ ไปไม่ถูก แบบนี้แหละ ทางแก้ คือ การอ่านเท่านั้น  ที่สำคัญ datasheet อย่าได้ขาด พยายามอ่านให้ได้ .. ;D