Das Ziel meiner Applikation ist die Messung von analogen Werte durch den AD-Wandler. Deswegen habe ich die zwei folgende Möglichkeiten ausgewählt: 1) Aktivierung des AD-Wandlers mit Auto-Triggering. Als Trigger-Quelle wird der "COMPARE MATCH A" des Timers 0 verwendet. Damit die Flag für COMPARE MATCH A wieder für die Aktivierung des AD-Wandlers verwendet werden kann, wird diese Flag durch die Interrupt-Aufruf gelöst. - Hier habe ich zwei Probleme: die Flag für COMPARE MATCH A (OCF0A) wird nur manchmal gesetzt und der AD-Wandler wird nie aktiviert (ADSC=0). 2) Aktivierung des AD-Wandlers mit Auto-Triggering. Als Trigger-Quelle wird "Free-Running" verwendet. Damit der AD-Wandler starten werden kann, wird das Bit ADSC des Registers ADCSRA gesetzt in der Initialisierung des AD-Wandlers. -Hier habe ich folgendes Problem: nach der ersten Konvertierung (die zu meinem Zeit-Design auch nicht passt) wird die Interrupt-Flag des Interrupts gesetzt und der AD-Wandler wird nie wieder aktiviert, da das Bit ADSC gelöst wird. Ich wäre sehr dankbar, wenn jemand mir einen Vorschlag geben könnte. Anbei die zwei "main" Dateien. Viele Grüße, Sebas
Gast
#1804454
Hi
>Ich wäre sehr dankbar, wenn jemand mir einen Vorschlag geben könnte.
Für beide Fälle: ADC-Complete-Interrupt verwenden.
MfG Spess
Gast
#1804477
>die Flag
die Flag != dis Flag
die Flag wird geschrieben auch mit "k" und is (war) Kanone.
dis Flag ist im englischen ein "Fähnchen"
;) nicht ernst, bitte
Hi,
danke für die Rückmeldungen.
> Für beide Fälle: ADC-Complete-Interrupt verwenden.
Sollte die Konvertierung nicht automatisch starten?
1) Auto-Triggering mit Compare Match A: die Konvertierung sollte mit der
Interruptserzeugung des Timers gestartet werden.
2) Auto-Triggering mit Free-Running: nachdem der AD-Wandler einmal
gestartet wird, sollte der AD-Wander frei and kontinuierlich laufen.
Warum sollte die ADC-Complet-Interrupt aufgerufen werden?
Viele Grüeße,
sebas
PS: sorry, aber ich lerne Deutsch nur seit 2 Jahre. Deswegen ist meine
Sprache nicht ganz richtig.
Sebastian O. schrieb: > Ich wäre sehr dankbar, wenn jemand mir einen Vorschlag geben könnte. Woher weißt du eigentlich so genau, welches Flag wann und warum nicht mehr gesetzt wird? Ich rate mal: Aus dem Simulator Dann lass dir gesagt sein, dass der Simulator so manches Problem hat und nicht alle Details des realen Chips korrekt nachbildet.
Gast
#1804495
Hi
>Warum sollte die ADC-Complet-Interrupt aufgerufen werden?
An irgend einer Stelle musst du den AD-Wert ja auslesen. Da bietet sich
der Interrupt an. Und im 1.Fall kannst dort gleic das
Timer-Interrupt-Flagzurück setzen.
MfG Spess
Hi, > An irgend einer Stelle musst du den AD-Wert ja auslesen. Da bietet sich > der Interrupt an. Und im 1.Fall kannst dort gleic das > Timer-Interrupt-Flagzurück setzen. in beiden Fälle wird die Interrupt-Routine nie aufgerufen, obwohl das Bit ADIE vom Register ADCSRA gesetzt wird. Das bedeutet, dass der AD-Wandler läuft überhaupt nicht, aber ich verstehe das nicht. Grüße sebas
Gast
#1804944
nicht lachen: sei() ? Ich habe auch Probleme mit dem free running modus. Probier mal deine ISR ab zu specken, z.B. nur led togglen. Dann schauen, wie oft die led togglet. Bei mir gibt es aktuell, dass der free running modus nur funktioniert, wenn ich jeden zweiten ADC-Wert verwerfe. Ich denke das liegt am channel wechsel (bei mir). Auch mal deaktiveren. Wie debuggst du?
Hi > nicht lachen: sei() ? im Code für die Auto-Triggering mit Compare Match A hatte ich es schon. Der Interrupt für ADC wird nie aufgerufen. Mit Free-Running wird die Routine nicht aufgerufen, aber es wird ein Reset erzeugt. Wieso denn? Sollte ich der Watchdog Timer ausschalten? > Bei mir gibt es aktuell, dass der free running modus nur funktioniert, > wenn ich jeden zweiten ADC-Wert verwerfe. Ich denke das liegt am channel > wechsel (bei mir). Auch mal deaktiveren. Ich verwende immer den gleichen Kanal (ADC3), so verstehe ich auch nicht, warum ich werte verwerfen muss. > Wie debuggst du? Ich debbuge mit Debugging von AVR Studio 4. Zurzeit habe ich die Leiterplatte noch nicht fertig. Deswegen simuliere ich nur. Grüße, Sebastian
Gast
#1804989
Hi >in beiden Fälle wird die Interrupt-Routine nie aufgerufen, obwohl das >Bit ADIE vom Register ADCSRA gesetzt wird. Das bedeutet, dass der >AD-Wandler läuft überhaupt nicht, aber ich verstehe das nicht. Ein kleines Testprogramm (Assembler) mit Autotrigger durch Timer0 läuft bei mir im Simulator problemlos. MfG Spess
Hi, > Ein kleines Testprogramm (Assembler) mit Autotrigger durch Timer0 läuft > bei mir im Simulator problemlos. hast du mit meinem C-Code probiert? Wäre es empfehlenswert, mit Assembler statt C zu programmieren? Grüße, Sebas
Gast
#1804999
Hi >hast du mit meinem C-Code probiert? Nein. Ich benutze kein C. >Wäre es empfehlenswert, mit Assembler statt C zu programmieren? Ehe grössere Dikussionen aufkommen: Nimm das, was du am besten kannst. Bei dir hängt es allerdings nicht nur an der Programmiesprache. MfG Spess
Gast
#1805003
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
Warum nicht ADC abfragen an Stelle von ADCH? Ärger vermeiden:
1 | |
2 | |
3 | |
4 | |
Datenblatt attiny25 Kommentar in deinem Code, nicht nachgeprüft:
1 | |
f_adc_max = 200kHz. Bei mir gibt es im Code auch noch ein ADCSC, bei dir nicht. Ohne funktioniert es nicht
1 | |
2 | |
3 | |
UND: Im Simulator funktioniert der ADC nicht. Habe ich nicht selbst überprüft, aber an x Stellen gelesen.
Gast
#1805014
Hi >UND: Im Simulator funktioniert der ADC nicht. Habe ich nicht selbst >überprüft, aber an x Stellen gelesen. AVR Studio Hilfe: Analog to Digital Converter (ADC) Analog input is not supported. However, based on the ADC Prescaler Select bits (ADPS), the ADIF flag is set after the correct number of cycles. The ADC completion interrupt is also simulated correctly. The ADC Data register (ADCH/ADCL) can be manually set e.g in the I/O view. Zum Simulieren langt es. Im Simulator2 kannst du sogar über ein Stimuli-File ADCL/H auf bestimmte Werte setzen. MfG Spess
Hi > Warum nicht ADC abfragen an Stelle von ADCH? Ärger vermeiden: Weil es nur für meine Applikation notwendig ist. Wichtig ist es nur, ob der Eigang die Spannungsreferenz erreicht hat. > Kommentar in deinem Code, nicht nachgeprüft: >
1 | |
> f_adc_max = 200kHz. Es wird auch gesagt, dass für niedrige Auflösung eine Frequenz bis 1 MHz vewerdet werden kann. > Bei mir gibt es im Code auch noch ein ADCSC, bei dir nicht. Ohne > funktioniert es nicht >
1 | |
2 | |
3 | |
4 | |
>
In meinem Code wird folgendes geschrieben:
ADCSRA |= (1<<ADSC);
// Start the conversion
Sorry, aber ich weiss nicht, was ich noch prüfen kann. Gibt es noch eine
Stelle, die geprüft werden müsste?
Danke.
Gast
#1805178
Hallo Sebastian, in deinem zweiten Code Abschnitt wird der ADC nicht gestartet. Darauf habe ich mich bezogen. Was du noch tun kannst: Ganz allgemein alle Fehlerquellen ausschalten. Also erstmal den normalen Modus an's laufen bringen, dann Dinge wie f = 1MHz testen. Am Ende Code der bei mir läuft, vielleicht hilft dir das. @spess Danke, wusste ich nicht. Ich habe bis jetzt nur gegenteiliges gehört.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
Hi, na ja, meine Einstellungen sind gleich. Ich werde nochmal alles prüfen. Vielen Dank. sebas
Hi, ich habe nochmal den Code für Free-Running Funktion angeschaut. Die Interrupt-Routine wird angerufen, aber das Bist ADSC wird nicht mehr gesetzt. Ich habe probiert, das Bit ADSC manuell zu setzen. In diesem Fall läuft der AD-Wander mit falscher Free-Running Funktion, weil manuell das Bit setzten muss. In diesem Fall würde ich Single Conversion Mode verwenden, da die gleiche Funktionalität hat. Grüsse, sebas
Gast
#1805341
Hi >Die Interrupt-Routine wird angerufen, aber das Bist ADSC wird nicht mehr >gesetzt. Warum auch? Wird nur für die erste Wandlung gebraucht. >Ich habe probiert, das Bit ADSC manuell zu setzen. In diesem >Fall läuft der AD-Wander mit falscher Free-Running Funktion, weil >manuell das Bit setzten muss. In diesem Fall würde ich Single Conversion >Mode verwenden, da die gleiche Funktionalität hat. Ich habe es auch probiert. Das angehängte läuft wunderbar im Simulator2. MfG Spess
Hi, ich habe die zwei Coden mit Simulator2 und die Interrupt-Routine des AD-Wandlers wird aufgerufen. Das bedeute, dass die Konvertierung gemacht wird. Trotzdem bleibt das Bit ADSC gelöst. Wie kann das möglich sein? Grüsse, sebas
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.