Nabend, habe ein Programm geschrieben mit dem ich einfach nur eine Spannung am PA1 eines ATmega32 messen möchte. Sollange der µc im STK500 läuft, funktioniert alles so wie es soll. In der Platiene in dem ich ihn betreiben möchte, bekomme ich auf dem Display an der Stelle wo der wert des ADC's stehen sollte nur laufende Zahlen angezeigt. Ich geh davon aus das ich bei der Inizialiierung die Taktfrequenz nicht richig eingestellt habe. Da ich den µC auf der Plaiene mit nem 14.7456MHz Quarz takte habe ich nen Teilungsfaktor von 128 gewählt sprich in C wie folgt eingegeben. ADCSRA = (1<<ADEN) | (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0) ; Ist das soweit richtig? Bin für jede Hilfe dankbar. Der gesammte Code sieht wie folgt aus: #include <avr/io.h> #include "lcd-routines.h" uint16_t ReadChannel(uint8_t mux) { uint8_t i; uint16_t result; ADMUX = 0x00; // Kanal waehlen ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen ADCSRA = (1<<ADEN) | (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0) ; // Frequenzvorteiler // setzen auf 8 (1) und ADC aktivieren (1) /* 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 } result = ADCW; // ADCW muss einmal gelesen werden, // sonst wird Ergebnis der nächsten Wandlung // nicht übernommen. /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */ result = 0; for( i=0; i<4; i++ ) { ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion" while ( ADCSRA & (1<<ADSC) ) { ; // auf Abschluss der Konvertierung warten } result += ADCW; // Wandlungsergebnisse aufaddieren } ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2) result /= 4; // Summe durch vier teilen = arithm. Mittelwert return result; } int main(void){ lcd_init(); uint16_t adcval; uint16_t x; while(1) { set_cursor(4,4); adcval = ReadChannel(1); x=adcval/0.4; send_int(x); set_cursor(9,4); lcd_string("mV"); } } void send_int(uint16_t zahl){ char Buffer[20]; //umwandlung von Dezimal in ASCII itoa(zahl, Buffer, 10 ); lcd_string(Buffer); }
> Sollange der µc im STK500 läuft, > funktioniert alles so wie es soll. Demnach scheint Dein Programm zu funktionieren. > In der Platiene in dem ich ihn > betreiben möchte, bekomme ich auf dem Display an der Stelle wo der wert > des ADC's stehen sollte nur laufende Zahlen angezeigt. Hast Du auf Deiner Plati(e)ne auch alle drei 100nF-Keramik-Abblock-Kondensatoren (an VCC, AVCC und AREF jeweils gegen GND) vorgesehen? Und dazu eine Drossel zwischen VCC und AVCC? Falls die zu messende Spannung etwas hochohmig ist, hilft ein C von etwa 10nF am ADC-Eingang gegen GND. > Ich geh davon aus > das ich bei der Inizialiierung die Taktfrequenz nicht richig eingestellt > habe. Das scheint richtig zu sein (C ist aber nicht mein Ding), allerdings setze ich auch adsc gleich mit aden und dem Vorteiler. KH
> Hast Du auf Deiner Plati(e)ne auch alle drei > 100nF-Keramik-Abblock-Kondensatoren (an VCC, AVCC und AREF jeweils gegen > GND) vorgesehen? > Und dazu eine Drossel zwischen VCC und AVCC? Ja habe ich! Ich denke, dass das Problem in der hohen Frequenz des Quarzes liegt, und damit das ich die Voreinstellungen nicht richtig vorgenommen oder zumindest was vergessen habe. Weiß nur momentan keine Lösung. Trotzdem danke!
Wenn du den Code entsprechend der Regeln formatierst, gucke ich ihn mir vielleicht mal an...
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.