mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC beim ATtiny88


Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich möchte ein einfaches kleines Test-Programm für den ATtiny88 
schreiben, welches mir den per AD-Wandler geandelten Wert eines Kanals 
auf Port D ausgibt. Ich programmiere mit dem IAR Studio. Der ATtiny 
läuft mit dem internen Oszillator (8MHz und CLKDIV eingeschaltet, also 
Systemtakt 1MHz).

Der Code:
#include <ioavr.h>
#include <intrinsics.h>

int main( void )
{
  ADCSRA_ADEN = 1;
  ADCSRA_ADPS2 = 1;

  ADCSRB_ADTS2 = 0;
  ADCSRB_ADTS1 = 0;
  ADCSRB_ADTS0 = 0;

  DDRC = 0x00;
  PORTC = 0x00;
  DDRD = 0xFF;

  for (;;)
  {
    ADCSRA_ADSC = 1;
    while(ADCSRA_ADSC);
    PORTD = ADCL;
  }

  return 0;
}

Das Problem ist nun folgendes: Wenn ich mit dem IAR Studio über die 
OneWire Schnittstelle debugge und dabei das Programm von Hand 
durchsteppe, also Schritt für Schritt, dann funktioniert alles. Lasse 
ich es aber einfach laufen, dann werden die LEDs (welche an PORTD sind) 
genau ein mal am Anfang angesteuert, danach passiert gar nichts mehr 
wenn ich die Spannung variere.
Mache ich etwas bei der Initialisierung des ADCs falsch oder liegt sonst 
wo ein Fehler?

Oliver

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oliver wrote:
>     PORTD = ADCL;
Erstens ist es ziemlich unsinnig, nur das Low-Byte einzulesen, und 
zweitens ist es sogar falsch, da grundsätzlich nach dem Auslesen von 
ADCL auch ADCH ausgelesen werden muss. Das Auslesen von ADCL sperrt 
die ADC-Datenregister so lange, bis ADCH ausgelesen wird.

Wenn Du nur 8 Bit Auflösung brauchst, dann setze das Bit ADLAR in ADMUX 
und lese nur das High-Byte aus. Genau dafür gibt es das ADLAR.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bingo! Wenn nur alles immer so einfach wäre. Natürlich ist es unsinnig 
nur das Low-Byte auszulesen, da es ja aber nur ein erstes Test-Programm 
war, um den ADC kennenzulernen, dachte ich mir das passt schon. Nun, 
wenn ich das High-Byte auch noch auslese funktioniert alles. Super, 
vielen Dank! Und jetzt sehe ichs auch im Datenblatt. Und das wo ich doch 
sonst auch immer der erste bin der RTFM schreit...

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oliver wrote:
> Bingo! Wenn nur alles immer so einfach wäre. Natürlich ist es unsinnig
> nur das Low-Byte auszulesen, da es ja aber nur ein erstes Test-Programm
> war, um den ADC kennenzulernen, dachte ich mir das passt schon.

Setze ADLAR und lies nur das Highbyte aus.

Davon abgesehen: erstens sind deine IAR-spezifischen Bitzuweisungen
leider unportabel (damit erschwerst du anderen, das Problem
nachzuvollziehen), zweitens ist es reichlich uneffektiv, wenn du
ganze Registerzuweisungen durch Setzen oder Löschen einzelner Bits
vornimmst.

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.