Forum: Mikrocontroller und Digitale Elektronik kleines Problemchen bei ADC-Messung...


von Florian (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich baue gerade mit einem Tiny15L einen Temperaturfühler mit
Segmentanzeige. Und da ich für diesen µC keinen C-Compiler gefunden
habe, bin ich gerad dabei das ganze in Assembler umzusetzen.

Der nun doch schon relativ große geratene Quellcode funktioniert bisher
recht gut, jedoch liegt da irgendwie ein Problem beim Auslesen des ADCs
vor. Die ADCH/ADCL-Register gibt mir nämlich stehts denn selben wert,
binär:01000001xx bzw. dezimal in 8-Bit umgewandel:65 auf das Abzeige.
Egal ob ich den zu testenden ADCPin auf GND oder VCC leg.

Ich bin mir ziemlich sicher das es nur irgendeine Kleinigkeit sein
kann, evtl. lese ich das ADCL/ADCH falsch aus!? Oder ist der ADC
hinüber? ..mir qualmt der Kopf.

hier der relevanten Teil des Quellcodes..
Vielleicht kann mir da jemand einen kleinen Ratschlag geben.

-----------------------------------------------

;IDE : AVRStudio V4.09
;µC  : ATtiny15L

.def temp   = r18  ;Temporär-Register
.def Ziffer0  = r20  ;Ziffernspeicher
.def Ziffer1   = r21  ;Ziffernspeicher
.def Ziffer2    = r22  ;Ziffernspeicher
.def temp_H   = r23  ;ADCH-Buffer
.def temp_L  = r24  ;ADCL-Buffer



  ;----ADC-Initialisierung--- (hier Funktioniert was nicht)

  ldi temp,0x00       ;ADC abschalten
  out ADCSR,temp
  ldi temp,0b00000011 ;Aref=Vcc ;ADChannel=(ADC3/PB4)
  out ADMUX,temp
  ldi temp,0b10000011 ;ADMux-Enable, Prescaler eingestellt
  out ADCSR,temp



        ;---ADC-Messung--
  cli ;IRQs deaktivieren

  ldi temp, ADCSR  ;ADC-Starten
  ori temp,0b01000000
  out ADCSR, temp

  warteADC:
  sbic ADCSR, ADSC
        rjmp warteADC

  ldi temp_L,ADCL
  ldi temp_H,ADCH

        ;ldi temp_H,0b00000011  ;konstante Testwert funktionieren
  ;ldi temp_L,0b11111100  ;komischerweise




        ;hier zur Vollständigkeit meine Umwandlung in 8Bit-
        ;Dezimalzahlen, funktioniert wunderbar mit Testwerten

  ;--Umwandlung--
        lsr temp_L
  lsr temp_L
  lsl temp_H
  lsl temp_H
  lsl temp_H
  lsl temp_H
  lsl temp_H
  lsl temp_H

  andi temp_L,0b00111111
  andi temp_H,0b11000000
  add temp_H,temp_L

  ;8-Bit in Dezimal umwandeln --> in Ziffer[2..0] speichern
  ldi Ziffer0,0x00
  ldi Ziffer1,0x00
  ldi Ziffer2,0x00

  Dezimal2:   ;
  sbci temp_H,100
  inc Ziffer2
  brcc Dezimal2
  dec Ziffer2
  ldi temp,100
  add temp_H,temp

  Dezimal1:
  sbci temp_H,10
  inc Ziffer1
  brcc Dezimal1
  dec Ziffer1

  Dezimal0:
  ldi temp,11
  add temp_H,temp
  mov Ziffer0, temp_H

        ;nun sind die drei Dezimalzahl in Ziffer[2..0] (Maximalwert
255)

von Werner A. (Gast)


Lesenswert?

Ich glaube, du musst die Wert per IN zurücklesen. So etwa

in adc_l, ADCL     ; gemessenen Wert einlesen
in adc_h, ADCH

von Andreas F. (Gast)


Lesenswert?

Hallo,

da war ich etwas langsamer,

ersetz mal alle diese LDI durch IN

  ldi temp, ADCSR  ;ADC-Starten (hier Funktioniert was nicht)
  ori temp,0b01000000
  out ADCSR, temp

  warteADC:
  ;ldi temp,ADCSR
  ;andi temp,0b01000000
  ;cpi temp,0
  ;brne warteADC
     sbic ADCSR, ADSC
     rjmp warteADC


  ;  --Umwandlung--
  ldi temp_L,ADCL ;10-Bit ADC in 8-Bit umwandeln (ab hier FUNKTIONIERT
alles es kommt aber stets 065 als ADC-Messwert)
  ldi temp_H,ADCH

viele Grüße

Andi

von Florian (Gast)


Lesenswert?

Hallo,

wer hätte es geglaubt: es funktioniert. Vielen vielen dank, ihr seit
die Besten!!



PS: Sorry das das Thread so lang wurde..

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.