Du musst die Integer mit itoa() in einen Char umwandeln. Diesen kannst du dann ohne Probleme am LCD oder übers Hyperterminal anzeigen lassen.
Hallo,
ich programmiere einen ATMEGA8 mit Codevision AVR. An den atmega hab ich ein LCD gehängt, ich kann auch Strings mit dem Befehlausgeben. Nur habe ich keine Ahnung mit welchem Befehl ich einen Int-Wert ausgeben kann?lcd_putsf("Hello world");
bei putsf bekomm ich eine Fehlermeldung: function parameter incompatible with its declaration
Hier mein Code:
Code:#include <mega8.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x12 ;PORTD #endasm #include <lcd.h> #include <delay.h> #define ADC_VREF_TYPE 0x00 // 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 void main(void) { // Declare your local variables here int x; int y; // Input/Output Ports initialization // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00; DDRB=0x00; // Port C initialization // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00; DDRC=0x00; // Port D initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTD=0x00; DDRD=0x00; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped TCCR0=0x00; TCNT0=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 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 MCUCR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; // ADC initialization // ADC Clock frequency: 125,000 kHz // ADC Voltage Reference: AREF pin ADMUX=ADC_VREF_TYPE; ADCSRA=0x87; // LCD module initialization lcd_init(16); while (1) { x= read_adc(PINC.0); y= read_adc(PINC.1); lcd_gotoxy(0,0); lcd_putsf('x'); lcd_gotoxy(5,0); lcd_putsf(y); delay_ms(500); }; }
vielen Dank für eure Hilfe.
Jan
Edit: lcd_putchar(x) geht auch nicht, da wird jedem int Wert ein Buchstabe zugeordnet
Du musst die Integer mit itoa() in einen Char umwandeln. Diesen kannst du dann ohne Probleme am LCD oder übers Hyperterminal anzeigen lassen.
www.subms.de
Aktuell: Flaschcraft Funkboard - Informationssammlung
Fraglich, ob das bei Codevision dabei ist, weil itoa() kein ISO-C ist.
Zitat von avr-libcZitat von avr-libc
Disclaimer: none. Sue me.
ja itoa gibt es im CodevisionAVR ...
der Prototyp ist allerdings ein wenig anders:
void itoa(int n, char *str)
// converts the integer n to characters in string str.
Hm.
Ich hab ja keine Ahnung, wie komplex die iota-Funktion ist, aber selbst mit meinen mitunter recht schwachem Mathe, könnte ich das relativ schnell, wenn auch wahrscheinlich nicht sonderlich effizient, selbst basteln...
Wozu gibts sonst Modulo und Dividieren?
BGMF
P.S. Wobei ich zugeben muss, dass Iota mal einfach mächtiger scheint...
P.P.S Aber vieleicht ist das ja auch mit Kanonen auf Spatzen schiessen...
itoa() ist low level und isst etwa 150 Bytes deines wertvollen Flashs auf. Dabei sind die durch itoa() nachgezogenen Divisionsroutinen etc. schon mit eingerechnet. Falls man an anderer Stelle eh dividieren muss, ist es natürlich weniger, es verbleiben dann rund 110 Bytes.Zitat von BGMF
Disclaimer: none. Sue me.
hey,
itoa funktioniert, vielen Dank für den Tipp
hallo,
ich habe ein weiteres Problem, passt zwar nicht richtig in diesen Thread aber ich poste dass hier trotzdem mal.
Also, ich möchte mit dem ADC vom Atmega8 einen Wert einlesen. Nach langen Testen hab ich jetzt heraus gefunden dass mein Programm grundsätzlich die Spannung von PinC.1 ausliesst. Es ist total egal welchen Pin ich auslesen möchte er nimmt immer Pin.1.
Hier mein Code:
und er liesst nicht die Spg. von PINC.0Code:#include <mega8.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x12 ;PORTD #endasm #include <lcd.h> #include <delay.h> #include <stdlib.h> #define ADC_VREF_TYPE 0x00 // 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 void main(void) { // Declare your local variables here int x; char s[3]; // Input/Output Ports initialization // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00; DDRB=0x00; // Port C initialization // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00; DDRC=0x00; // Port D initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTD=0x00; DDRD=0x00; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped TCCR0=0x00; TCNT0=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 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 MCUCR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; // ADC initialization // ADC Clock frequency: 125,000 kHz // ADC Voltage Reference: AREF pin ADMUX=ADC_VREF_TYPE; ADCSRA=0x87; // LCD module initialization lcd_init(8); while (1) { lcd_clear(); x= read_adc(PINC.0); itoa(x,s); lcd_gotoxy(0,1); lcd_puts(s); delay_ms(500); }; }
wäre nett wenn ihr mir wieder so schnell helfen könntet.
Vielen Dank
Jan
Was hast du dir denn bei dieser Zeile gedacht?
ADMUX=adc_input|ADC_VREF_TYPE;
Hi kater,
das würde schon passen, wenn man die funktion richtig aufruft,
@Jan.HH
man gibt hier nicht das Pin direkt an an welchem man gerne messen würde, sondern nur die nummer von 0 bis 6.
Dazu gibts im Datenblatt irgendwo eine Liste in der steht welche Nr welches Pin ist, aber normalerweise Pin ADC0 mit Nr 0 auswählen.
Mit ADC_VREF_TYPE gibst Du an wie deine Referenzspannung aussieht, das muss dann aber zu dem passen wie Du das angeschlossen hat, ebenfalls siehe Datenblatt.
Lesezeichen