ATmega32 ADC von Quarz abhängig?

Gast #2545519
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
}
Gast
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".
Gast
>     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.
Gast
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
Gast
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?
Gast
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
Gast
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.
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.