Forum: Mikrocontroller und Digitale Elektronik ATMega2560: ADC läuft von alleine?!


von Bronco (Gast)


Lesenswert?

Hallo zusammen,

ich hab einen ATMega2560, AtmelStudio 6.1 und ein JTAGICE3.
Ich möchte den ADC im SingleConversion-Mode betreiben.

Sowohl im Init als auch in der ISR benutze ich folgende Zeile:
1
ADCSRA = (1<<ADEN) | (1<<ADSC) | (1<<ADIF) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
ADATE ist also nicht gesetzt, sondern ich will die Wandlung explizit per 
ADSC starten.

Soweit die Theorie.

Das seltsame ist nun:
Auch wenn ich die Zeile so ändere, dass ADSC nicht auf 1 gesetzt wird, 
läuft trotzdem die Wandlung los und der Interrupt kommt zyklisch.
1
ADCSRA = (1<<ADEN) | (1<<ADIF) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
Das klingt für mich nach "Free Running"-Mode.
Wenn ich aber mit dem Debugger in der ISR anhalte und mir ADSCRA ansehe, 
dann steht da 0x8F drinn, d.h. weder ADSC noch ADATE gesetzt?!

Hat jemand eine Idee?

von Sauger (Gast)


Lesenswert?

moin,

könnte damit zusammenhängen das am ADIF Flag rumgefummelt wird. Normal 
wird dieses durch die Hardware, nach Abschluss einer Wandlung, gesetzt.

MfG

von spess53 (Gast)


Lesenswert?

Hi

>Wenn ich aber mit dem Debugger in der ISR anhalte und mir ADSCRA ansehe,
>dann steht da 0x8F drinn, d.h. weder ADSC noch ADATE gesetzt?!

An der Stelle wäre ADSC ja auch schon wieder gelöscht. Zeig deinen 
kompletten Quelltext.

MfG spess

von spess53 (Gast)


Lesenswert?

Hi

>könnte damit zusammenhängen das am ADIF Flag rumgefummelt wird. Normal
>wird dieses durch die Hardware, nach Abschluss einer Wandlung, gesetzt.

1<<ADIF löscht ADIF.

MfG Spess

von Bronco (Gast)


Lesenswert?

spess53 schrieb:
> An der Stelle wäre ADSC ja auch schon wieder gelöscht.

Sicher?

Ich zitiere aus dem Datenblatt:
1
In Free Running mode, a new conversion will be started immediately after the conversion completes, while ADSC remains high.

von spess53 (Gast)


Lesenswert?

Hi

>Ich zitiere aus dem Datenblatt:

>In Free Running mode, ...

Ich denke ADATE ist nicht gesetzt. Und im Single Conversion- und 
Autotrigger-Mode ist ADSC nur während der Conversation auf High.

MfG Spess

von Paul B. (paul_baumann)


Lesenswert?

Bronco schrieb:
> ich hab einen ATMega2560, AtmelStudio 6.1 und ein JTAGICE3.

Vielleicht ist das Problem die Version 6.1 vom Atmel-Studio? Ich habe 
diesen Rotz nach einer Woche des Herumärgerns wieder gelöscht, nachdem 
der
gleiche (Assembler) Quelltext in AVR-Studio 4.16 genau das machte, was 
ich auch geschrieben habe.

Neuer ist nicht unbedingt besser.

MfG Paul

von spess53 (Gast)


Lesenswert?

Hi

Nachtrag: Und im Autotrigger Mode muss ADSC mindestens einmal gesetzt 
werden um das Autotriggern zu starten.

MfG Spess

von Bronco (Gast)


Lesenswert?

Ich hab den ADC-Code extrem vereinfacht, hab aber immer noch das gleiche 
Problem:
1
void Init(void)
2
{
3
 ADCSRA = (1<<ADEN) |  (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);  
4
 DDRA |= 0x80;   
5
}
6
7
ISR(ADC_vect)
8
{
9
  PORTA ^= 0x80; 
10
}

Der PortA7 toggelt mit ca. 230µs, was der berechnten Wandelzeit (128 / 
8MHz * 14,5 = 232µs) entspricht.

Und die gewandelten Werte (im alten Code) entsprechen auch angelegten 
Spannungen.

Was ich nicht verstehe:
- Warum läuft der ADC überhaupt los (kein ADSC gesetzt)?
- Warum wandelt er zyklisch (kein ADATE gesetzt)?

von Bronco (Gast)


Lesenswert?

PS: Disassembly  besagt:
[avrarm]
  ADCSRA = (1<<ADEN) |  (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | 
(1<<ADPS0);
00000097  LDI R24,0x8F    Load immediate
00000098  STS 0x007A,R24    Store direct to data space
  DDRA |= 0x80;
0000009A  SBI 0x01,7    Set bit in I/O register
0000009B  RET     Subroutine return
[/avrarm]

von spess53 (Gast)


Lesenswert?

Hi

>Warum läuft der ADC überhaupt los (kein ADSC gesetzt)?

Macht er nicht.

> Warum wandelt er zyklisch (kein ADATE gesetzt)?

Macht er auch nicht.

ADCs haben kein geheimes Eigenleben.

Nochmal: Zeig dein komplette Programm.

>Der PortA7 toggelt mit ca. 230µs, was der berechnten Wandelzeit (128 /
>8MHz * 14,5 = 232µs) entspricht.

Es sind aber nur 13,5 ADC-Takte ->216µs.

MfG Spess

von Bronco (Gast)


Lesenswert?

spess53 schrieb:
> Nochmal: Zeig dein komplette Programm.
Kann ich leider nicht, gehört der Firma und die ist da kritisch...

> Es sind aber nur 13,5 ADC-Takte ->216µs.
Ich dachte immer, es wären 13 + 1,5 Sample&Hold...
Naja, ehrlich sagt hatte ich gar nicht so genau auf's Oszi geschaut...

von Ingo L. (corrtexx)


Lesenswert?

Bis du sicher nicht doch irgendwo den ADC zu starten? Manchmal sieht man 
den Wald vor lauter Bäumen ja nicht.

: Bearbeitet durch User
von spess53 (Gast)


Lesenswert?

Hi

>Kann ich leider nicht, gehört der Firma und die ist da kritisch...

Dann mach halt ein Testprogramm mit dem ADC. Ich benutze zwar nicht den 
ATMega2560 sondern 'nur' den ATMega1281, aber eins weiß ich genau: mit 
den gezeigten Codezeilen wird weder der ADC gestartet noch macht er 
Autotrigger.

MfG Spess

von Uwe (de0508)


Lesenswert?

Hallo,

meine Erklärung zum aktivem Start der ADC-Wandlung findet sich im 
Datenblatt:

S.277 Starting a Conversion
A conversion can thus be triggered without causing an interrupt. 
However, the Interrupt Flag must be cleared in order to trigger a new 
conversion at the next interrupt event.

von Peter D. (peda)


Lesenswert?

Idle mode. If the ADC is enabled, a conversion starts automatically
when this mode is entered.

Stromsparen immer nur, wenn nötig und immer erst, wenn alles andere 
perfekt läuft, hinzufügen.

von spess53 (Gast)


Lesenswert?

Hi

>meine Erklärung zum aktivem Start der ADC-Wandlung findet sich im
>Datenblatt:

>S.277 Starting a Conversion
>A conversion can thus be triggered without causing an interrupt.
>However, the Interrupt Flag must be cleared in order to trigger a new
>conversion at the next interrupt event.

Das steht im  aktuellen Datenblatt auf S.270. Und das heißt, das wenn 
Autotrigger ohne ADC-Interrupt verwendet wird, ADIF manuell 
zurüchzusetzen ist. Dürfte hier kaum das Problem sein.

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

>Idle mode. If the ADC is enabled, a conversion starts automatically
>when this mode is entered.

An der Stelle hätte ich als letztes gesucht. Mal sehen, was der TO dazu 
sagt.

MfG Spess

von Bronco (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Idle mode. If the ADC is enabled, a conversion starts automatically
> when this mode is entered.

Volltreffer! Das hätte ich jetzt auch nicht gedacht!

von Bronco (Gast)


Lesenswert?

Danke!

von Ingo (Gast)


Lesenswert?

Peter kam, sah und siegte

von S. Landolt (Gast)


Lesenswert?

Und er hat nicht die Attitüde eines Caesar.
Aber auch mit Spess hätte man den Sieg errungen, nur ein bisschen 
später:
> Dann mach halt ein Testprogramm mit dem ADC.
Damit vielleicht aber auch früher, wenn nämlich schon im Vorfeld das 
Programm auf das Wesentliche reduziert worden wäre; wohlgemerkt das 
Programm, nicht der hier vorgestellte Teil, den man selbst für 
wesentlich hält.

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.