Gast
#4450
Hallo!
ich habe ein Minimalprogramm
für eine AD-Wandlung mit dem 10bit-ADC
des 8535 eingetippt und gebe nun
in einer Schleife die gewandelten Werte von Pin AD0 mit 9600bd auf der
seriellen SS aus.
Leider scheinen die bits zu klemmen:
Will heißen, dass es in der Anzeige Sprünge von mehr als 1bit gibt, wenn
ich die Spannung ganz langsam am ADC-Pin hochdrehe.
An der seriellen Ausgabe liegt es nicht:
Wenn ich temp am Ende jedesmal eins hoch-
zähle, so wird das korrekt ausgegeben.
An der Hardware liegt es wohl auch nicht:
Wenn ich das Bascom-Demo für den ADC
laufen lasse, so kommen mit derselben
Hardware alle bits sauber hintereinander
ohne Lücken.
Was ist also verkehrt an dem winzigen
Assemblerprogramm?
Die anhängende Datei enthält den kompletten
Code, den ich zum Test verwendet hatte.
Viel Code darin ist überflüssig. Er wird
jedoch nicht benutzt. Hier der Auszug.
; ADC init: ADC ein,warte noch,free run,
; INT aus,full speed
ldi temp,0b10100000
out ADCSR,temp
ldi temp,0x00
out ADMUX,temp ;Eingang AD0
sbi ADCSR,ADSC ;StartADC im free run
loop_adc:
;hole aktuellen ADC-Wert
in temp,ADCL ; ADC lo
in temp1,ADCH ; ADC hi
push temp ;
; obere 2 bit
mov temp,temp1 ; obere 2bit
rcall hexascii
rcall serout
; untere 8 bit
; erst oberes Halbbyte
pop temp ; lo-byte
push temp ;
swap temp ;
andi temp,0b00001111 ;
rcall hexascii
rcall serout
pop temp ;
push temp
andi temp,0b00001111 ;
rcall hexascii
rcall serout
; sende CR
ldi temp,0x0d
rcall serout
pop temp
;inc temp
rcall delay100ms
rjmp loop_adc ;
;--- schicke Zeichen auf serielle SS raus
; Zeichen aus: temp
; veraendert: SREG
serout:
sbis USR,UDRE ; UDR leer?
rjmp serout
out UDR,temp
ret
;--- hex to Ascii-Wandlung -------
; Zeichen aus: temp
; veraendert: SREG
hexascii:
cpi temp,0x0a ;
brsh buchstabe ;
;add temp,0x30 ; aus 0-9 wird 30-39
subi temp,-48
ret
buchstabe:
;add temp,55 ; aus a wird 65
subi temp,-55
ret