www.mikrocontroller.net

Forum: Compiler & IDEs Mega16 ADC @ 16Mhz


Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann es sein dass der ADC bei 16Mhz nur schrott ausspuckt??


  ADMUX=(1<<6)|(1<<7);
  ADCSRA=(1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
  ADCSRA|=(1<<ADIE);
  ADCSRA|= (1<<ADEN) | (1<<ADSC);

SIGNAL(SIG_ADC) {
  char cOutText[100];
  int nADCValue;
  nADCValue=(ADCH<<8)|ADCL;
  sprintf(cOutText,"measured%d : %d\r\n",(ADMUX&7),nADCValue);
  SendZTString0(cOutText);
  ADCSRA|=(1<<ADSC);
  if ((ADMUX&7)==7)
    ADMUX^=7;
  else
    ADMUX++;
}

das sollte doch gehn oder???
ich mein ist doch nicht im sinne des erfinders wenn ein adc immer das
gleiche ausspuckt... und es kommt immer auf allen kanälen der gleiche
wert raus...


73 de oe6jwf / hans

Autor: mthomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moeglicherweise "verschluckt" sicht die ISR wg. der relative langen
Ausfuehrungszeit der Ausgaberoutinen. Testweise koennte man die
Ergebnisse der ADC im ISR in globale Variable/Feld ablegen (volatile!)
und dann in der Hauptschleife ausgeben. Den ADC-Takt testweise auch mal
auf moeglichst langsam einstellen hilft vielleicht auch.
HTH, Martin

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
langsamer gehts ned...und die isr kommt an... es geht auch nicht im
single conversion mode wenn das zeug im main nach dem init kommt...

73 de oe6jwf/hans

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nach eingehendem studio des datenblattes (5 zeilen mal nicht
übersprungen ;) weis ich jetzt was los war...

nADCValue=(ADCH<<8)|ADCL; darf nicht sein...

nADCValue=ADCL;
nADCValue|=(ADCH<<8);

geht... ADCL MUSS zuerst gelesen werden und DANN MUSS ADCH reingeholt
werden... sonnst werden keine werte aktualisiert...

73 de oe6jwf / hans

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andere Merkwürdigkeiten:

>  ADMUX=(1<<6)|(1<<7);

Die Benutzung der Bitnamen ist sicher sinnvoller. ;-)

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

Hat so keinen Sinn.  Alles außer dem ADEN kann in eine Anweisung,
dann wird aus dem ADEN am Ende auch ein einzelnes SBI (und der
Rest zu einem OUT).

>  if ((ADMUX&7)==7)
>    ADMUX^=7;

Besser ist es, ADMUX gleich wieder auf den Dir ja bekannten Wert
zu setzen -- das read/modify/write wird hier ziemlich aufwendig
und setzt letztlich nur Werte, die Du ohnehin bereits vorab kennst.

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.