www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC-Auto Trigger Mode


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

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich möchte mit meinem ATmega168 nun einen Strom Rückmessen.
Die HW Funktioniert, am ADC eingang liegt der erwartete Wert an.

Ich benutze Timer 1 um eine Fast PWM zu Erzeugen.
Alle 200 ms habe ich für 40 ms eine PWM.
Diese hat eine Frequenz von 500 Hz und ändert innerhalb der 40 ms nach 
20 ms ihren Duty Cycle. (erste 20 ms 25% dann 10%). => Funktioniert

Jetzt möchte ich bei jedem Timer1 Compare Match eine ADC Messung machen.
Dazu soll angehängter Code dienen, welcher aber leider nicht 
funktioniert.

Kann man die AUTO-Trigger Messungen etwa nur in der ISR des ADC 
abhandeln?

Vielen Dank schonmal für die Hilfe & Gruß

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

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

habe immer noch das selber Problem wie oben.
Mittlerweile mach ich die Messung im ADC Interrupt.
Innerhalb der ISR ist die Convertierung schon abgeschlossen oder?
(so versteh ich das Datenblatt)

Jedoch bleibt meine LED weiter aus, die richtigen Werte liegen aber am 
ADC PIN an.

wenn ich die Funktion init_Current_OPV(); in meine Hauptschleife schiebe
wechselt meine LED zwischen AN AUS.

Kann mir das verhalten nicht erklären...

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab jetzt noch einen Fehler verbessert:

Ich dachte man muss muss ADIF zurück setzten um wieder eine neue 
Wandlung
starten zu können.
also habe ich:

ADCSRA &= ~(1<<ADIF);
durch
TIFR1 = (1<<OCF1B);

in der ADC ISR geändert...aber es geht totzdem noch nicht...

Autor: JW (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Andy,
static volatile unsigned int test =0;
Gruß,
Jürgen

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das zusätzliche "volatile" bringt leider keine Verbesserung.

Autor: JW (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aber ohne merkt der compiler nicht, daß
test
 in der ISR geändert wird ;-)

Autor: MitLeser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst das Timer1 Capture Compare-Flag nach dem Event selbst
zurücksetzen, weil der entsprechende Interrupt nicht ausgeführt wird.
D.h. wahrscheinlich wird der ADC nur einmal vom Timer1 angestossen.

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MitLeser schrieb:
> Du musst das Timer1 Capture Compare-Flag nach dem Event selbst
>
> zurücksetzen, weil der entsprechende Interrupt nicht ausgeführt wird.
>
> D.h. wahrscheinlich wird der ADC nur einmal vom Timer1 angestossen.


Andi schrieb:
> TIFR1 = (1<<OCF1B);
>
> in der ADC ISR geändert...aber es geht totzdem noch nicht...

Ich setzte es in der ADC ISR durch  TIFR1 = (1<<OCF1B); zurück.


JW schrieb:
> aber ohne merkt der compiler nicht, daßtest
>
>  in der ISR geändert wird ;-)

dann sollte ich bei meiner PWM den counter auch static volatile machen, 
funktioniert zwar auch ohne aber sicher ist sicher ;)

Autor: JW (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andi schrieb:
> dann sollte ich bei meiner PWM den counter auch static volatile machen,
> funktioniert zwar auch ohne aber sicher ist sicher ;)

wenn eine Variable nur in der ISR oder nur im "Hauptprogramm" benutzt 
wird, dann braucht man volatile nicht. Es sorgt nämlich dafür, daß immer 
aus dem RAM nachgelesen wird, auch wenn der Wert schon in einem Register 
stand. Er kann sich ja jederzeit ändern.

Peter Dannegger benutzt ein paar Macros um das zu umgehen:
Variable ohne volatile, in der ISR (aber nur wenn nur eine ISR auf die 
Variable zugreift) und in der "Mainschleife" per Macro auf volatile 
casten. Damit optimiert der GCC in der ISR besser.

Gruß,
Jürgen

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
JW schrieb:
> wenn eine Variable nur in der ISR oder nur im "Hauptprogramm" benutzt
> wird, dann braucht man volatile nicht. Es sorgt nämlich dafür, daß immer
> aus dem RAM nachgelesen wird, auch wenn der Wert schon in einem Register
> stand. Er kann sich ja jederzeit ändern.

ok verstanden.
Ich seh denoch keinen Fehler warum mein Programm nicht geht.

Ich habe meine PWM die geht.
Ich habe den ADC auf Autotrigger an gestellt.
Ich habe Compare Match T1B als Trigger Quelle.
Ich Verrechne das ADC Ergebniss in seiner ISR und setze das Timer
Flag zurück.
Ich greife per Funktion auf meine static volatile variable zu
und vergleiche den wert.
Funktioniert vielleicht da was nicht?

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.