Hallo,
habe noch zufällig irgendwelchen ADC-Code für den 90S4433 gefunden, den ich mal zum Test geschrieben habe.
Es hat definitiv funktioniert, allerdings wurde der Code danach noch etwas modifiziert. Ich kann also keine Funktionsgarantie geben.
Allerdings ist das ganze nicht wirklich schwer. Das meiste findet in der ISR statt (Ergebnis in r18:r17), allerdings habe ich die Displayausgabe auskommentiert.
Das sollte Dir einen groben Überblick verschaffen. Das Lesen des Datenblattes ist natürlich immer Pflicht.
Code:
.include "4433def.inc"
.CSEG
.org 0x0000 ; code segment start
; Interrupt vectors
rjmp RESET ; 0x00 external reset
rjmp NO_INTERRUPT ; 0x01 external int0
rjmp NO_INTERRUPT ; 0x02 external int1
rjmp NO_INTERRUPT ; 0x03 timer1 capture event
rjmp NO_INTERRUPT ; 0x04 timer1 compare match
rjmp NO_INTERRUPT ; 0x05 timer1 overflow
rjmp NO_INTERRUPT ; 0x06 timer0 overflow
rjmp NO_INTERRUPT ; 0x07 SPI serial transfer complete
rjmp NO_INTERRUPT ; 0x08 UART, Rx complete
rjmp NO_INTERRUPT ; 0x09 UART data register empty
rjmp NO_INTERRUPT ; 0x0a UART, Tx complete
rjmp ADC_INTERRUPT ; 0x0b ADC conversion complete
rjmp NO_INTERRUPT ; 0x0c EEPROM ready
rjmp NO_INTERRUPT ; 0x0d Analog comparator
;--------------------------------------------------------------------
; ISRs
;--------------------------------------------------------------------
RESET:
rjmp main
ADC_INTERRUPT:
in r20, SREG
push r16
push r17
push r18
in r17, ADCL
in r18, ADCH
; skip 2 LSB
; asr r18
; ror r17
; asr r18
; ror r17
; display output
; mov r16, r18
; rcall lcd_printdec ; print high byte
; mov r16, r17
; rcall lcd_printdec ; print low byte
; ldi r16, ' '
; rcall lcd_data
; start next conversion
sbi ADCSR, 6
pop r18
pop r17
pop r16
out SREG, r20
reti
NO_INTERRUPT:
reti
;--------------------------------------------------------------------
; MAIN
;--------------------------------------------------------------------
main:
ldi r16, low(RAMEND) ; initialise stack pointer
out SPL, r16
sei ; global interrupt enable
; analog input 0
ldi r16, 0x00
out ADMUX, r16
; enable, start dummy conversion, no free run, interrupt, factor 128
ldi r16, 0b11011111
out ADCSR, r16
loop:
rjmp loop
Jens
Lesezeichen