www.mikrocontroller.net

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


Autor: Andi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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!

Autor: Andi (Gast)
Datum:

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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Du schaltest mit der 2. Anweisung den ADC ab.

'=' -> '|='

MfG Spess

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, das hab ich verstanden und vergess ich jetzt nie wieder ;)

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andi schrieb:
> Manchmal sind aber Registerwerte von über 20000 dabei???

Dann wird bei dir was anderes faul sein.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.