Forum: Mikrocontroller und Digitale Elektronik ADC Auto-Trigger mit Timer1 Compare Match B


von Andi (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe mal wieder Probleme mit meinem ADC.
Überblick:
Ich habe eine PWM mit 500Hz für 40 ms alle 200ms.
In den 40 ms wo die PWM an ist schalte ich nach 20 ms einen andern
Tastgrad. Das Funktioniert.

Jetzt möchte ich bei jedem Comparematch des Timers 1 B einen ADC Messung 
mit dem Auto Trigger anstoßen. Das funktioniert leider nicht.
Zum test ob bzw. wie oft die ISR ausgeführt wird lasse ich noch eine LED 
Toggeln. Leider geht sie nur an, d.h die ISR wird nur einmal ausgeführt.

Nach Lesen in dem Forum habe ich gesehen das oft vergesen wird das 
Interrupt Flag zurückzusetzten, das mache ich aber.

Da ich eine PWM mit 500 Hz habe mit verschiedenen Tastgraden sollte 
zwischen den Messungen immer mehr als 1 ms Zeit sein. Das sollte ja 
Eigentlich für die Wandlung reichen.

Hat jemand vielleicht eine Idee wieso meine ISR nur einmal aufgerufen 
wird?
(Code im Anhang)

Danke schonmal fürs anschauen!

von Andi (Gast)


Lesenswert?

ich habe den Code kurzeit so umgeschrieben das der ADC durch den INT0 
angestoßen werden soll, jedoch das selber fehler Bild...

von spess53 (Gast)


Lesenswert?

Hi

>void init_ADC_Current(void)
....
>  ADCSRA =(1<<ADEN)       //ADC Einschalten !!!!!!!!!!!!!!!!!!
>       |(1<<ADPS2)      //ADC Takt: F_Quarz/128
>       |(1<<ADPS1)       //    "-"
.....


>  ADCSRA =(1<<ADATE)       //Auto Trigger AN  !!!!!!!!!!!!!!!1
>       |(1<<ADIE);      //ADC ISR AN

Ist das so gewollt?

MfG Spess

von Andi (Gast)


Lesenswert?

spess53 schrieb:
> Ist das so gewollt?

dabei habe ich mir gedacht, dass ich erst eine normalnen Dummy Read
mache (falls ich mal den Kanal wechseln will) und erst danach den Auto 
Trigger einschalte.

oder habe ich da einen logik fehler?

von spess53 (Gast)


Lesenswert?

Hi

Du schaltest mit der 2. Anweisung den ADC ab.

'=' -> '|='

MfG Spess

von Andi (Gast)


Lesenswert?

Die Routine wird jetzt so durchlaufen wie ich will vielen dank du hast 
mir
sehr geholfen.

mit nur "=" schreibe ich eine 1. wenn aber schon eine 1 da ist wirds 
eine 0. mit "|=" bleibt die 1 selbst wenn schon eine 1 da steht. oder?

aber ich schreibe doch in kein Register was den ADC abschaltet sondern 
den Autotrigger an? Das verseth ich noch nicht ganz...kannst du mir das 
bitte erklären?

von spess53 (Gast)


Lesenswert?

Hi

>mit nur "=" schreibe ich eine 1.

Nein. Du schreibst Einsen und Nullen.

ADCSRA =(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1) -> 0b10000110

ADCSRA =(1<<ADATE)|(1<<ADIE)            -> 0b00101000

ADCSRA |=(1<<ADATE)|(1<<ADIE)           -> 0b10101110

Mit '|=' schreibst du Einsen. Bits auf Null setzt du mit:

ADCSRA &=~((1<<ADATE)|(1<<ADIE))

MfG Spess

von Andi (Gast)


Lesenswert?

Danke, das hab ich verstanden und vergess ich jetzt nie wieder ;)

von Andi (Gast)


Lesenswert?

Hab jetzt noch eine Frage zu dem ADC verhalten, wofür ich
keinen neues Thema aufmachen will:

Der ADC misst in der Regel richtig. Ich lass mir von den Messpunkten
die mich interessieren die ADC Register wert über seriell Auslesen.

Manchmal sind aber Registerwerte von über 20000 dabei???
Dachte der Maxiaml wert wäre 1024. Was veranlasst den ADC solch einen 
Wert
ins Register zu schreiben?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Andi schrieb:
> Manchmal sind aber Registerwerte von über 20000 dabei???

Dann wird bei dir was anderes faul sein.

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
Noch kein Account? Hier anmelden.