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)
Ich glaube, du musst die Wert per IN zurücklesen. So etwa in adc_l, ADCL ; gemessenen Wert einlesen in adc_h, ADCH
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.