Hi Das Programm im Anhang soll vom Kanal0 des ADC einen Wert einlesen und über die serielle Schnittstelle ausgeben.(Im Moment nur zum Testen wird nur das Lowbyte ausgegeben) Der Kanal soll ständig abgefragt werden also im "Freerunning Modus" betrieben werden. Das ganze funktionert auch, aber nur wenn ich das ADSC(ADC start conversation) Bit im ADCSR Register jedesmal neu setze. Es wird also das ADSC Bit bei Eintritt in die ADC Interruptroutine gelöscht und ich muss es manuell neu setzen sonst tritt kein Interrupt mehr auf.Das ist aber doch eigentlich nicht der Sinn des "Freerunning Modus". Aus dem Datenblatt werde ich auch nicht ganz schlau.Muss ich das Bit ADSC 2 mal setzen und ist die erste Umwandlung nur eine "Dummy" Umwandlung zum initialisieren des ADC. Unten hab ich mal einen Auszug aus dem Datenblatt kopiert. Wäre nett wenn sich mal einer das Programm anschaut, ob es so richtig ist das Bit jedesmal in der Interrupt Routine neu zu setzen oder muss ich den ADC anders Initialisieren. Grüsse Toto Quote: In Single Conversion Mode, a logical ?1? must be written to this bit to start each conversion. In Free Running Mode, a logical ?1? must be written to this bit to start the first conversion. The first time ADSC has been written after the ADC has been enabled or if ADSC is written at the same time as the ADC is enabled, an extended conversion will precede the initiated conversion. This extended conversion performs initialization of the ADC. ADSC will read as one as long as a conversion is in progress. When the conversion is complete, it returns to zero. When a extended conversion precedes a real conversion, ADSC will stay high until the real conversion completes. Writing a ?0? to this bit has no effect.
Lass den ADC ohne Interrupt laufen, genauso wie Deine serielle Ausgabe einfach in einer Endlosschleife. Dann klappt es so lange bis Du ADEN wieder auf Null setzt. Habe auch den 8535 und es klappt ohne probleme.
Das Programm läuft ja so wie es ist. Ich habe es warscheinlich mit ein bisschen viel Text umschrieben, aber ich wollte eigentlich nur wissen ob es normal ist das bei dem "Free Running" Modus das ADSC(ADC start conversation) Bit jedesmal bei Eintritt in die Interrupt Routine zurückgesetzt wird und ich es Manuell neu setzen muss. Oder ich irgendwo einen Denkfehler mache. Trotzdem danke für die schnelle Antwort mfG Toto
Hast du dich im Code geirrt? ldi temp,0b11101000 ;ADC aktivieren free running mode Interrupt aktiviert out ADCSR,temp ;Vorteiler 64 ADC aktivieren und vorteiler 64 sind doch 0b11101110 aber das nur nebenbei. Dein problem ist, das Du den Freerunning Mode und Start Conversion gleichzeitig setzt. In dem Fall wird das als Single Confersion verstanden (siehe seite 72/73 im Datenblatt: ? Bit 6 ? ADSC: ADC Start Conversion In Single Conversion Mode, a logical ?1? must be written to this bit to start each conversion. In Free Running Mode, a logical ?1? must be written to this bit to start the first conversion. The first time ADSC has been written after the ADC has been enabled or if ADSC is written at the same time as the ADC is enabled, an extended conversion will precede the initiated conversion. This extended conversion performs initialization of the ADC. ADSC will read as one as long as a conversion is in progress. When the conversion is complete, it returns to zero. When a extended conversion precedes a real conversion, ADSC will stay high until the real conversion completes. Writing a ?0? to this bit has no effect.) Also erst den Freerunning Mode aktivieren und danach erst den Start ADC. Dann sollte es gehen.....
Hi mit dem Vorteiler hast du natürlich Recht, hatte ich runtergesetzt damit ich im AVR Studio (4,9,0,338) einfacher Simulieren kann. Ich hab das Programm mal dementsprechend geändert also erst der Bits ADEN (Enable) ADFR (Free Running) ADIE (ADC INT Enable) ADPS2 = 1 (Vorteiler 64) ADPS1 = 1 ADPS0 = 1 Danach den Kanal gewählt (Kanal 0) MUX0-2 = 0 und dann mit sbi ADCSR,ADSC den ADC gestartet. Klappt aber immer noch nicht laut AVR Studio wird ADSC jedesmal bei eintritt in die Int Routine zurückgesetzt.Und das nicht nur bei der 1. Wandlung sondern jedesmal. Ist ja eigentlich auch nicht schlimm Prog läuft ja, ich möchte halt nur einfach verstehn warum das so ist und ob ich etwas falsch Programmiert habe. nochmal lob an das Forum hier ist ja besser als eine Onlinehilfe mfg Toto
Noch ein Nachtrag habe den Kommentar nicht mitgeändert ADC wird aber bei der ersten Initialisierung noch nicht gestartet Bit6(ADSC)=0
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.