ADC Auto-Trigger mit Timer1 Compare Match B

Gast #1811091
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!
Angehängte Dateien:
Gast #1811740
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
Gast #1812374
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?
Gast #1812400
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
Gast #1827640
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?

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.