Forum: Mikrocontroller und Digitale Elektronik ADC nur nach Reset?


von Thomas_F (Gast)


Lesenswert?

Ich arbeite gerade das ADC Tutorial durch und stehe vor folgendem 
Problem.

Der Wert, den das ADCL/ADCH Register liefert ändert sich nicht, wenn ich 
den Transistor ändere, der als Eingabe dient. Lediglich, wenn ich den mC 
resette, ändert sich der Wert ... warum?

Hat jmd eine Lösung dafür?

Vielen Dank!

von Johannes M. (johnny-m)


Lesenswert?

Liest Du die Register ADCL und ADCH in der richtigen Reihenfolge aus? 
Wartest Du auch wirklich, bis der ADC mit der Wandlung fertig ist, bevor 
Du den Wert ausliest?

Außerdem ist es ziemlich sinnfrei, den Code, mit dem das Problem 
auftritt, nicht zu posten, aber zu vermuten, dass hier Hellseher sitzen, 
die den Code telepathisch auf Deinem Rechner lesen können...

von Thomas_F (Gast)


Lesenswert?

... hm ... schön wärs ...

... ich lese in der Richtigen Reihenfolge ein und warte auch wirklich 
...

Hier mal mein Code:

.include "m8def.inc"

RESET:
  ldi r16, 0b11111111
  out PORTB, r16

  ldi r16, 0b11111111
  out DDRB, r16


  ldi r17, (1<<REFS0)  ; interne Referenz AVCC (5V) und Pin PC0
  out ADMUX, r17
  ldi r17, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)
  out ADCSRA, r17    ; ADVC aktivieren und Vorteiler = 128


MAIN:
  sbi ADCSRA, ADSC  ; ADC starten


  wait_ADC_finish:  ; warten, bis ADC fertig
    sbic ADCSRA, ADSC
  rjmp wait_ADC_finish

  in r17, ADCL
  com r17
  out PORTB, r17


rjmp MAIN

von Johannes M. (johnny-m)


Lesenswert?

Hä? Du liest ADCH überhaupt nicht ein. Das macht keinen Sinn. Und kann 
auch nicht funktionieren. ADCH MUSS immer ausgelesen werden! Ansonsten 
werden beide Register (ADCH und ADCL) gesperrt und der ADC kann keinen 
neuen Wert hineinschreiben. Du bekommst also genau einen Wert geliefert 
(und zwar nur das Low-Byte) und danach liest Du immer denselben Wert 
aus.

von Thomas_F (Gast)


Lesenswert?

hm ... wie du sagtest ... vielen Dank!
1
...
2
rjmp wait_ADC_finish
3
4
  in r17, ADCL
5
  in r18, ADCH  
6
  com r17
7
  out PORTB, r17
8
...


aber kann ich das auslesen von ADCH nicht irgendwie umgehen?

von Johannes M. (johnny-m)


Lesenswert?

> aber kann ich das auslesen von ADCH nicht irgendwie umgehen?
Nein. Ich frage mich allerdings, was der Sinn darin ist, nur das 
Low-Byte auszulesen.

von Spess53 (Gast)


Lesenswert?

Hi

Kleiner Auszug aus dem Datenblatt:

'If the result is left adjusted and no more than 8-bit precision is 
required, it is sufficient to read ADCH. Otherwise, ADCL must be read 
first, then ADCH, to ensure that the content of the Data Registers 
belongs to the same Conversion. Once ADCL is read, ADC access to Data 
Registers is blocked.'

D.h.: wenn du das ADLAR-Bit setzt, reicht es das ADCH-Register zu lesen. 
Du hast dann aber nur eine Auflösung von 8 Bit.

MfG Spess

von Thomas_F (Gast)


Lesenswert?

Vielen Dank für die Antworten!

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.