mikrocontroller.net

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


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);
    }

Autor: Kachel - Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Matthias Lipinsky (lippy)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.