Forum: Mikrocontroller und Digitale Elektronik Probleme mit ADC und 14.7456 MHz Quarz


von Gast (Gast)


Lesenswert?

Nabend,

habe ein Programm geschrieben mit dem ich einfach nur eine Spannung am 
PA1 eines ATmega32 messen möchte. Sollange der µc im STK500 läuft, 
funktioniert alles so wie es soll. In der Platiene in dem ich ihn 
betreiben möchte, bekomme ich auf dem Display an der Stelle wo der wert 
des ADC's stehen sollte nur laufende Zahlen angezeigt. Ich geh davon aus 
das ich bei der Inizialiierung die Taktfrequenz nicht richig eingestellt 
habe.

Da ich den µC auf der Plaiene mit nem 14.7456MHz Quarz takte habe ich 
nen Teilungsfaktor von 128 gewählt sprich in C wie folgt eingegeben.

ADCSRA = (1<<ADEN) | (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0) ;

Ist das soweit richtig?

Bin für jede Hilfe dankbar.

Der gesammte Code sieht wie folgt aus:

#include <avr/io.h>
#include "lcd-routines.h"


uint16_t ReadChannel(uint8_t mux)
{
  uint8_t i;
  uint16_t result;

  ADMUX = 0x00;                      // Kanal waehlen
  ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen

  ADCSRA = (1<<ADEN) | (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0) ;    // 
Frequenzvorteiler
                               // setzen auf 8 (1) und ADC aktivieren 
(1)

  /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man 
liest
     also einen Wert und verwirft diesen, um den ADC "warmlaufen zu 
lassen" */
  ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung
  while ( ADCSRA & (1<<ADSC) ) {
     ;     // auf Abschluss der Konvertierung warten
  }
  result = ADCW;  // ADCW muss einmal gelesen werden,
                  // sonst wird Ergebnis der nächsten Wandlung
                  // nicht übernommen.

  /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden 
Wandlungen */
  result = 0;
  for( i=0; i<4; i++ )
  {
    ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
    while ( ADCSRA & (1<<ADSC) ) {
      ;   // auf Abschluss der Konvertierung warten
    }
    result += ADCW;        // Wandlungsergebnisse aufaddieren
  }
  ADCSRA &= ~(1<<ADEN);             // ADC deaktivieren (2)

  result /= 4;                     // Summe durch vier teilen = arithm. 
Mittelwert

  return result;
}

int main(void){

    lcd_init();
  uint16_t adcval;
  uint16_t x;


 while(1)
    {

  set_cursor(4,4);
    adcval = ReadChannel(1);
  x=adcval/0.4;
  send_int(x);
  set_cursor(9,4);
  lcd_string("mV");

    }
}

void send_int(uint16_t zahl){
       char Buffer[20];  //umwandlung von Dezimal in ASCII
       itoa(zahl, Buffer, 10 );

       lcd_string(Buffer);
    }

von Kachel - Heinz (Gast)


Lesenswert?

> Sollange der µc im STK500 läuft,
> funktioniert alles so wie es soll.

Demnach scheint Dein Programm zu funktionieren.

> In der Platiene in dem ich ihn
> betreiben möchte, bekomme ich auf dem Display an der Stelle wo der wert
> des ADC's stehen sollte nur laufende Zahlen angezeigt.

Hast Du auf Deiner Plati(e)ne auch alle drei 
100nF-Keramik-Abblock-Kondensatoren (an VCC, AVCC und AREF jeweils gegen 
GND) vorgesehen?

Und dazu eine Drossel zwischen VCC und AVCC?

Falls die zu messende Spannung etwas hochohmig ist, hilft ein C von etwa 
10nF am ADC-Eingang gegen GND.

> Ich geh davon aus
> das ich bei der Inizialiierung die Taktfrequenz nicht richig eingestellt
> habe.

Das scheint richtig zu sein (C ist aber nicht mein Ding), allerdings 
setze ich auch adsc gleich mit aden und dem Vorteiler.

KH

von Gast (Gast)


Lesenswert?

> Hast Du auf Deiner Plati(e)ne auch alle drei
> 100nF-Keramik-Abblock-Kondensatoren (an VCC, AVCC und AREF jeweils gegen
> GND) vorgesehen?

> Und dazu eine Drossel zwischen VCC und AVCC?


Ja habe ich!

Ich denke, dass das Problem in der hohen Frequenz des Quarzes liegt, und 
damit das ich die Voreinstellungen nicht richtig vorgenommen oder 
zumindest was vergessen habe.

Weiß nur momentan keine Lösung.

Trotzdem danke!

von Matthias L. (Gast)


Lesenswert?

Wenn du den Code entsprechend der Regeln formatierst, gucke ich ihn mir 
vielleicht mal an...

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.