LC-HC
08.10.2005, 20:32
Hi, ich hab mal was am ATmega8 ausprobiert und komm da im mom. nicht so richtig weiter. Den Code hab ich mit gepostet. Zur Funktion soviel: nachdem ein Wert überschritten worden ist, soll ein Portbit gesetzt werden. Es tut sich aber überhaupt nichts. Danke für alle tips und anregungen.
Hier der code:
.include "AVR.H"
;----------------------------------------------------------------------
; Reset and Interrupt vector ; VNr. Beschreibung
rjmp main ; 1 POWER ON RESET
reti ; 2 Int0-Interrupt
reti ; 3 Int1-Interrupt
reti ; 4 TC2 Compare Match
reti ; 5 TC2 Overflow
reti ; 6 TC1 Capture
reti ; 7 TC1 Compare Match A
reti ; 8 TC1 Compare Match B
reti ; 9 TC1 Overflow
reti ; 10 TC0 Overflow
reti ; 11 SPI, STC Serial Transfer Complete
reti ; 12 UART Rx Complete
reti ; 13 UART Data Register Empty
reti ; 14 UART Tx Complete
rjmp onADC ; 15 ADC Conversion Complete
reti ; 16 EEPROM Ready
reti ; 17 Analog Comparator
reti ; 18 TWI (I²C) Serial Interface
reti ; 19 Store Program Memory Ready
;----------------------------------------------------------------------
; Start, Power ON, Reset
main: ldi r16,lo8(RAMEND)
out SPL,r16
ldi r16,hi8(RAMEND)
out SPH,r16
; Hier Init-Code eintragen.
;--------ADC Init-------------------------------
ldi r16,0
out ADMUX,r16 ; ADC kanal 0 = PortC.0
ldi r16,0b11011101
out ADCSRA,r16 ; ADC enable, Interrupt enable, run-mode
;--------PORT Init-------------------------------
ldi r16,0b00000010
out DDRC,r16 ; PORTC.1 als ausgang
;+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++
mainloop: wdr
rcall wait
rcall wait
mov r20,r25 ; ADC Wert holen
cpi r20,0b00000010 ; falls ADC Wert höher als 2
brge mainloop ; die led an
sbi PORTC,1
rjmp mainloop
;+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++
onADC: cli ; Interrupts sperren
in r25,ADCH ; ADC 8 Bit Daten holen
sbi ADCSRA,6 ; nächste Wandlung starten
sei ; Interrupts wieder zulassen
reti
wait: push r24
ldi r24,0x13 ;hier delay einstellen
w1: subi r24,0x01
rcall wait20ms
brcc w1
pop r24
ret
wait20ms: ldi r16,255
ldi r17,104
w20ms: dec r16
brne w20ms
dec r17
brne w20ms
ret
Hier der code:
.include "AVR.H"
;----------------------------------------------------------------------
; Reset and Interrupt vector ; VNr. Beschreibung
rjmp main ; 1 POWER ON RESET
reti ; 2 Int0-Interrupt
reti ; 3 Int1-Interrupt
reti ; 4 TC2 Compare Match
reti ; 5 TC2 Overflow
reti ; 6 TC1 Capture
reti ; 7 TC1 Compare Match A
reti ; 8 TC1 Compare Match B
reti ; 9 TC1 Overflow
reti ; 10 TC0 Overflow
reti ; 11 SPI, STC Serial Transfer Complete
reti ; 12 UART Rx Complete
reti ; 13 UART Data Register Empty
reti ; 14 UART Tx Complete
rjmp onADC ; 15 ADC Conversion Complete
reti ; 16 EEPROM Ready
reti ; 17 Analog Comparator
reti ; 18 TWI (I²C) Serial Interface
reti ; 19 Store Program Memory Ready
;----------------------------------------------------------------------
; Start, Power ON, Reset
main: ldi r16,lo8(RAMEND)
out SPL,r16
ldi r16,hi8(RAMEND)
out SPH,r16
; Hier Init-Code eintragen.
;--------ADC Init-------------------------------
ldi r16,0
out ADMUX,r16 ; ADC kanal 0 = PortC.0
ldi r16,0b11011101
out ADCSRA,r16 ; ADC enable, Interrupt enable, run-mode
;--------PORT Init-------------------------------
ldi r16,0b00000010
out DDRC,r16 ; PORTC.1 als ausgang
;+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++
mainloop: wdr
rcall wait
rcall wait
mov r20,r25 ; ADC Wert holen
cpi r20,0b00000010 ; falls ADC Wert höher als 2
brge mainloop ; die led an
sbi PORTC,1
rjmp mainloop
;+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++
onADC: cli ; Interrupts sperren
in r25,ADCH ; ADC 8 Bit Daten holen
sbi ADCSRA,6 ; nächste Wandlung starten
sei ; Interrupts wieder zulassen
reti
wait: push r24
ldi r24,0x13 ;hier delay einstellen
w1: subi r24,0x01
rcall wait20ms
brcc w1
pop r24
ret
wait20ms: ldi r16,255
ldi r17,104
w20ms: dec r16
brne w20ms
dec r17
brne w20ms
ret