Forum: Mikrocontroller und Digitale Elektronik ADC beim ATtiny88


von Oliver (Gast)


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:
1
#include <ioavr.h>
2
#include <intrinsics.h>
3
4
int main( void )
5
{
6
  ADCSRA_ADEN = 1;
7
  ADCSRA_ADPS2 = 1;
8
9
  ADCSRB_ADTS2 = 0;
10
  ADCSRB_ADTS1 = 0;
11
  ADCSRB_ADTS0 = 0;
12
13
  DDRC = 0x00;
14
  PORTC = 0x00;
15
  DDRD = 0xFF;
16
17
  for (;;)
18
  {
19
    ADCSRA_ADSC = 1;
20
    while(ADCSRA_ADSC);
21
    PORTD = ADCL;
22
  }
23
24
  return 0;
25
}

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

von Johannes M. (johnny-m)


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.

von Oliver (Gast)


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...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

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.