Forum: Mikrocontroller und Digitale Elektronik ATmega32 ADC von Quarz abhängig?


von Leon (Gast)


Lesenswert?

Hallo zusammen,

Ich beobachte folgende komische Sache.
Hab nen AT32 hier wo ich den Kanal 1 des ADC auslese. Bei einer Frequenz 
von 8Mhz klappt das auch alles ohne Problem, sobald ich aber auf 16Mhz 
gehe bekomme ich als ADC-Wert immer nur 1023. Weiß jemand woran das 
liegen könnte?
1
int main(void)
2
{
3
  Init_ADC();
4
  
5
  while(1)
6
    {  
7
    
8
    put_number(ADCW, 40, 32, 3, 0, font_6x8);
9
    _delay_ms(5);
10
    ADCSRA |= (1<<ADSC);
11
    }
12
}
13
14
ISR(ADC_vect)
15
{  
16
  
17
  if(ADCW/4  > (OCR2 + 10))
18
    OCR2 += 1;
19
  else if(OCR2 > 30)
20
    OCR2 -= 1;
21
  
22
}
23
24
25
void Init_ADC(void)
26
{
27
  ADMUX = 0x01;
28
  ADCSRA = 0x88;  
29
}

von Krapao (Gast)


Lesenswert?

Der ADC soll laut Datenblatt nur in einem bestimmten ADC-Frequenzfenster 
betrieben werden. Du bist anscheinend mit dem Haupttakt 8 MHz "drin" und 
mit 16 MHz "draus".

von Krapao (Gast)


Lesenswert?

>     ADCSRA |= (1<<ADSC);

Gehört in diesem Fall logisch gesehen auch nicht in Hauptschleife.

von Krapao (Gast)


Lesenswert?

>     put_number(ADCW, 40, 32, 3, 0, font_6x8);

dito auch nicht das Auslesen des ADC-Wertes. An dieser Stelle wisst du 
noch nicht ob eine ADC Messung abgeschlossen ist.

Du kannst aber mit dem Konzept eines Signalvariable (Flag) arbeiten, so 
wie es im Artikel Interrupt beschrieben ist.

von Leon (Gast)


Lesenswert?

Hab put_number(OCR2, 40, 32, 3, 0, font_6x8) jetzt in die ISR vom 
AD-Wandler gepackt, dann sollte es doch stimmen, aber das Problem ist 
noch immer das Gleiche

von Leon (Gast)


Lesenswert?

ADCW statt OCR2, sry

von Krapao (Gast)


Lesenswert?

Das ist Teufel mit Beelzebub ausgetrieben.

Nicht umsonst steht im Artikel Interrupt sinngemäß ISR so knapp wie 
möglich halten. Du machst das Gegenteil, wenn du die längliche 
Ausgabefunktion dort rein packst.

Den Datenblattabschnitt zur ADC Taktfrequenz hast du noch nicht gelesen?

von Leon (Gast)


Lesenswert?

Ja gut aber wenn ich z.B. folgendes machen:
1
ISR(ADC_vect)
2
{  
3
  
4
  if(ADCW/4  > (OCR2 + 10))
5
    OCR2 += 1;
6
  else if(OCR2 > 30)
7
    OCR2 -= 1;
8
9
  put_number(ADCW, 40, 32, 3, 0, font_6x8);
10
  ADCSRA |= (1<<ADSC);  
11
}
sollte es doch eig. funktionieren, tut es aber nicht. Hier hab ich ja 
auch keine Probleme dass die IST währenddesse nochmal aufgerufen wird

von Krapao (Gast)


Lesenswert?

Die Ausgabe ist auch nur ein Teilaspekt deines Codes. Deine neue Lösung 
bringt erst massive Probleme, wenn du weitere IRQs mit ihren ISRs hast.

Der wichtigere Teil ist die korrekte Benutzung des ADC laut Datenblatt.

von Leon (Gast)


Lesenswert?

Hmm lag glaub ich am µC, hab mal nen anderen  AT32 genommen und da 
gehts:/
Aber trotzdem vielen Dank für die Hilfe und den Hinweis mit den Flags, 
werd ich in Zukunft mal drauf achten

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.