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.