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.