Hallo ich versuche jetzt schon den halbe Tag eine Spannung mit einem atmega8L zu messen. Das klappt auch ansatzweise. Um mir die Werte anzeigen zu lassen verwende ich ein 2x16 Zeichen LCD Display. Allerdings sind die Werte die dort angezeigt werden immer deutlich höher als 1024 und das ist doch theoretisch gar nicht möglich oder? Der Quellcode stammt größtenteils aus dem AVR-GCC-Tutorial. Als Testspannung verwende ich einen Handelsüblichen AA Akku mit 1,2V. Hier mal der Programmcode.. #include <avr/io.h> #include "lcd-routines.h" #include <util/delay.h> int main(void) { void ADC_Init(void) { uint16_t result; ADMUX = (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen ADCSRA = (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler ADCSRA |= (1<<ADEN); // ADC aktivieren /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */ ADCSRA |= (1<<ADSC); // eine ADC-Wandlung while (ADCSRA & (1<<ADSC) ); // auf Abschluss der Konvertierung warten /* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten Wandlung nicht übernommen. */ result = ADCW; } /* ADC Einzelmessung */ uint16_t ADC_Read( uint8_t channel ) { // Kanal waehlen, ohne andere Bits zu beeinflußen ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F); ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion" while (ADCSRA & (1<<ADSC) ) // auf Abschluss der Konvertierung warten return ADCW; // ADC auslesen und zurückgeben } /* ADC Mehrfachmessung mit Mittelwertbbildung */ uint16_t ADC_Read_Avg( uint8_t channel, uint8_t average ) { uint32_t result = 0; for (uint8_t i = 0; i < average; ++i ) result += ADC_Read( channel ); return (uint16_t)( result / average ); } lcd_init(); // LCD Display intialisieren ADC_Init(); // ADC intialisieren while(1) { lcd_clear; // LCD Display reseten uint16_t adcval; adcval = ADC_Read_Avg(0,5); // Analogwert auslesen char Buffer[10]; itoa( adcval, Buffer, 10 ); // Analogwert umwandeln in String lcd_setcursor( 0, 2 ); lcd_string(Buffer); // Stringwert auf LCD ausgeben } }
Vielleicht nur ein Anzeigeproblem. Korrigier mal
1 | lcd_clear; // LCD Display reseten |
zu lcd_clear(); Und schalt die Compiler-Warnings ein, da hätte der GCC schon meckern müssen.
Ja Danke jetzt geht alles wie es sollte. Ein kleiner Fehler mit großen Auswirkungen...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.