Forum: Mikrocontroller und Digitale Elektronik ADC Wert ändert sich nicht


von devil13 (Gast)


Lesenswert?

Guten Abend,

ich versuche mich gerade durch das Mikrocontroller Tutorial hier zu 
arbeiten. Bis her komme ich auch gut vorran :)

Bin gerade beim ADC angelangt 
(http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC)

Und hier komme ich irgendwie nicht mehr weiter.
Habe ein 10k Poti wie in der Testschaltung an PC0 angeschlossen.

Weder mit dem Testprogramm, noch mit einem selbstgeschriebenem Programm 
bekomme ich einen Wert.

Der Wert der mir über RS232 ausgegeben wird, schwankt start zwischen 
60-200 und ändert sich nicht in Abhängigkeit des Potis.

Den Atmega 8 programmiere ich mit dem Evaluationboard V2.01 von Pollin. 
Wollte mal fragen, ob bereits jemand ein ähnliches Problem hatte oder ob 
jemand eine Idee hat, was ich falsch gemacht haben könnte.

Wenn es helfen würde, kann ich gerne mein Programm hier posten, aber ich 
dachte, da das Beispielbrogramm auch nicht läuft, dass das nicht daran 
liegt.

Das hier ist meine Initialisierung des ADC
ldi    r16,  (1<<REFS0) | (1<<ADLAR)
out    ADMUX,  r16
ldi    r16,  (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)
out    ADCSRA,  r16  ; 16 MHz / 128 = 125kHz)


Meinem Messgerät nach liegen übrigends am Pin PC0 je nach Potistellung 
zwischen 0 und 5 V an ...

Vielen Dank

von Michael D. (etzen_michi)


Lesenswert?

Kannst du ggf. doch mal deinen gesamten Code hochladen?

Und messe mal wie sauber die Spannung an Pin20 AVCC ist.

Den 100nF an ARef kannste auch mal überprüfen.

von devil13 (Gast)


Lesenswert?

Klar, gerne :)


Also die Spannung am Pin Aref = Avcc = Vcc = 5.02 V ... ohne 
Schwankungen oder sowas ...


Und hier der Quellcode


.include "m8def.inc"


.equ F_CPU = 16000000              ; Systemtakt in Hz
.equ BAUD  = 9600                ; Baudrate

; Berechnungen
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; clever runden
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))    ; Reale Baudrate
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille

.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))    ; max. +/-10 Promille 
Fehler
  .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit 
zu hoch!"
.endif






init:
  ; Stackpointer initialisieren
     ldi  r16,  HIGH(RAMEND)
  out  SPH,  r16
  ldi  r16,  LOW(RAMEND)
  out  SPL,  r16


  ; Baudrate einstellen und Senden aktivieren
      ldi     r16,  LOW(UBRR_VAL)
      out     UBRRL,  r16
      ldi     r16,  HIGH(UBRR_VAL)
      out     UBRRH,  r16
       ldi     r16,  (1<<URSEL)|(3<<UCSZ0)  ; Frame-Format: 8 Bit
      out     UCSRC,  r16
      sbi     UCSRB,  TXEN

  ; ADC initialisieren
  ldi  r16,  (1<<REFS0) | (1<<ADLAR)
  out  ADMUX,  r16
; ADC0 (Kanal 0), interne Referenzspannung Vcc (5V), linksbündig

  ldi  r16,  (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)
  out  ADCSRA,  r16
; Vorteiler 128 (damit Samplefrequenz zwischen 50kHz und 200 kHz ... 16 
MHz / 128 = 125kHz)


not_pressed:
  sbis  PIND,  2  ; skip if bit set (PD2)
  rjmp  not_pressed


  rcall  sample_adc ; Wert in r16 laden
  rcall  serout_r16 ; ausgeben

pressed:
  sbic  PIND,  2  ; skip if bit cleared (PD2)
  rjmp  pressed


  rjmp not_pressed


;-------------------------------------------------------------


sample_adc:
  sbi  ADCSRA,  ADSC ; ADC starten

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

   ; ADC einlesen
  in  r16,  ADCL ; zuerst LOW Byte lesen
  in  r16,  ADCH ; dann gesperrte High Byte


  ret


serout_r16:
      push  r16

  rcall  bcd

  mov  r16,  r19
  rcall   serout
  mov  r16,  r18
  rcall   serout
  mov  r16,  r17
  rcall   serout
  ldi     r16,  13
      rcall   serout
      rcall   sync

  pop  r16

  ret

serout:
      sbis    UCSRA,  UDRE  ; Warten bis UDR bereit

      rjmp    serout
      out     UDR,  r16
      ret

;-----------------------------------------------
; Dec TO Ascii
; input: R16
; output: (R19:R18:R17)
;-----------------------------------------------
bcd:
  mov  r17,  r16
  ldi  r19,  -1 + '0'
_bcd1:
  inc  r19
  subi  r17,  100
  brcc  _bcd1
  ldi  r18,  10 + '0'
_bcd2:
  dec  r18
  subi  r17,  -10
  brcs  _bcd2
  sbci  r17,  -'0'

  ret

; kleine Pause zum Synchronisieren des Empfängers, falls 
zwischenzeitlich das Kabel getrennt wurde
sync:
      ldi     r16,  0
sync_1:
      ldi     r17,  0
sync_loop:
      dec     r17
      brne    sync_loop
      dec     r16
      brne    sync_1
      ret

von devil13 (Gast)


Lesenswert?

Achso ... und den 100 nF Kondensator habe ich auch zwischen ARef und GND 
angeschlossen ... weder mit, noch ohne bekomme ich richtige Messwerte.

Ich habe mein Programm auch so gehabt, dass 256 Messwerte wie im 
Beispiel gemittelt werden ... brachte aber auch keine Änderung. Ich 
bekomme übrigends genau die gleichen Messwerte, wenn ich das Poti ganz 
weglasse ... und das finde ich sehr komisch ...

von Gerd (Gast)


Lesenswert?

Richtiger Kanal?

von µC Bastler (Gast)


Lesenswert?

devil13 schrieb:
> Also die Spannung am Pin Aref = Avcc = Vcc = 5.02 V ...

Seit wann wird Aref an VCC angeschlossen. Da gehört nur ein Kondensator 
ran (-> Datenblatt: "The voltage reference
may be externally decoupled at the AREF pin by a capacitor for better 
noise performance.")

von devil13 (Gast)


Lesenswert?

Das habe ich zuerst auch gedacht ... ist aber an PC0 angeschlossen ... 
habe gerade mal mit meinem Messgerät direkt an das Beinchen des Atmega 
durchgeklingelt ... scheinbar besteht keine Verbindung ... habe 
ebenfalls von Pollin den Streifen-/Punktrasterplatienenadapter und sonst 
eigentlich keine zusätzlichen Sachen verschaltet. Mir ist bereits 
schonmal aufgefallen, dass ich zum Programmieren immer das 
Verbindungskabel abziehen muss (habe das Kabel aus einem alten Computer 
... war dort nen IDE Kabel) ... kann es damit zusammen hängen?

von devil13 (Gast)


Lesenswert?

µC Bastler schrieb:
> Seit wann wird Aref an VCC angeschlossen. Da gehört nur ein Kondensator
> ran (-> Datenblatt: "The voltage reference
> may be externally decoupled at the AREF pin by a capacitor for better
> noise performance.")

Habe ich nicht ... dort liegen aber die gleichen Spannungen an ... 
sorry, wenn das missverständlich war

von Michael D. (etzen_michi)


Lesenswert?

devil13 schrieb:
> habe gerade mal mit meinem Messgerät direkt an das Beinchen des Atmega
> durchgeklingelt ... scheinbar besteht keine Verbindung

Also Fehler gefunden ...

von devil13 (Gast)


Lesenswert?

Michael D. schrieb:
> Also Fehler gefunden ...

Jan, aber was für ein Quatsch ... Auf dem 
Streifen-/Punktrasterplatienenadapter von Pollin steht PC0 ... 
entspricht aber nicht der gleichen Leitung wie auf den Evaluation Board 
... voll dumm und ich glaube das wäre dann auch einer der Sachen, die 
ich ausgeschlossen hätte, weil ich davon ausgehen würde, dass die sowas 
Fehlerfrei verkaufen ... naja ... für die, die irgendwann das gleiche 
Problem haben, PC0 geht übrigends an den mit PA0 beschrifteten Pin.

Das Programm funktioniert jetzt wunderbar :)


Eine Frage habe ich dennoch:
Warum kann muss ich jedes mal zum Programmieren das IDE Kabel abziehen 
... es ist übrigends auch egal, ob das Kabel nur so dran hängt oder 
etwas an das Kabel angeschlossen ist ... versteh das irgendwie nicht, 
weil der Kabelanschluss ja eigentlich in der Luft hängt und es somit 
doch egal sein müsste, ob es dran hängt oder nicht?!?


Vielen Dank, für eure Hilfe!

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.