ATMega2560: ADC läuft von alleine?!

Gast #4094913
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?
Gast #4094929
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
Gast #4094956
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
Gast #4094979
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)?
Gast #4094987
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]
Gast #4094998
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
Gast #4095010
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...
Gast #4095018
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
#4095024
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.
Gast #4095041
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
Gast #4095170
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren