So hier wie von Sternthaler gewünscht erstmal der grundlegende Code für IR-Kollision in Assembler. Die _Inits am Start und die Inc-Dateien ganz oben sind selbst geschriebene Makros um nicht jedes mal die LED's ,Stack etc zu initialisieren. Programm funktioniert wie folgt: Sobald IR anschlägt gehen die Back LED's an. Sendeleistung müsste hier im Programm eingestellt werden,hatte noch keine Zeit mich weiter damit zu befassen (es ist Prüfungszeit).
Der Code:
Code:
.include "m8def.inc" ;Deklaration für Atmega8
.include "Stack.inc" ;Inc-Datei für Stack
.include "UART.inc" ;Inc-Datei für UART
.include "Motor.inc" ;Inc-Datei für die Motoren
.include "BackLED.inc" ;Inc-Datei für Back LED's
.def temp0=R16 ;Benennung der
.def temp1=R17 ;Arbeitsregister
.def temp2=R18
.def temp3=R19
.def temp4=R20
.def temp5=R21
.def temp6=R22
.def temp7=R23
.def temp8=R24
.def temp9=R25
.CSEG ;Program-Flash
rjmp Start ;Sprung
reti ;rjmp EXT_INT0 ; IRQ0 Handler
reti ;rjmp EXT_INT1 ; IRQ1 Handler
reti ;rjmp TIM2_COMP ; Timer2 Compare Handler
rjmp TIM2_OVF ; Timer2 Overflow Handler
reti ;rjmp TIM1_CAPT ; Timer1 Capture Handler
reti ;rjmp TIM1_COMPA ; Timer1 CompareA Handler
reti ;rjmp TIM1_COMPB ; Timer1 CompareB Handler
reti ;rjmp TIM1_OVF ; Timer1 Overflow Handler
reti ;rjmp TIM0_OVF ; Timer0 Overflow Handler
reti ;rjmp SPI_STC ; SPI Transfer Complete Handler
reti ;rjmp USART_RXC ; USART RX Complete Handler
reti ;rjmp USART_UDRE ; UDR Empty Handler
reti ;rjmp USART_TXC ; USART TX Complete Handler
reti ;rjmp ADC ; ADC Conversion Complete Handler
reti ;rjmp EE_RDY ; EEPROM Ready Handler
reti ;rjmp ANA_COMP ; Analog Comparator Handler
reti ;rjmp TWSI ; Two-wire Serial Interface
Start:
Stack_Init temp0 ;Initialisierung als Makro
Uart_Init temp0 ;Initialisierung als Makro
Pwm_Init temp0 ;Initialisierung als Makro
Motor_Init temp0 ;Initialisierung als Makro
LED_Init temp0 ;Initialisierung als Makro
;--------------------------------------------------------------------------------
in temp0,ddrd ;PD1 als Ausgang
ori temp0,0b00000010 ;nach dem Read-Modify-Write
out ddrd,temp0 ;Prinzip
cbi portd,1 ;PD1 auf LOW
;-------- seriell interface programmed in boot routine and already running -------
; prepare 36kHz for IR - Communication using 8-bit timer 2
ldi temp0,(1 << WGM20) | (1 << WGM21) | (1 << COM20) | (1 << COM21)| (1 << CS20)
out TCCR2, temp0 ;Timer2 Einstellungen
ldi temp0,0xF7 ;einzustellender Wert für die PWM
out OCR2,temp0 ;in das Output Compare Register
in temp0, TIMSK ;Timer2
ori temp0, (1<<TOIE2); ;Overlow Interupt
out TIMSK, temp0 ;enable
sei ;global Interupts enable
loop: SWITCH_LEFT_BACKLED_OFF
SWITCH_RIGHT_BACKLED_OFF
sbic pind,0 ;Abfrage des Empfängers auf Null,da dieser auf LOW
rjmp loop ;gezogen wird bei Empfang
SWITCH_LEFT_BACKLED_ON
SWITCH_RIGHT_BACKLED_ON
rjmp loop
TIM2_OVF: ;Interupt Service Routine für den Overflow des Timers2
push temp0
in temp0,sreg
push temp0
in temp0,tcnt2
subi temp0,-0x25
out tcnt2,temp0
pop temp0
out sreg,temp0
pop temp0
reti
Für Fragen stehe ich jederzeit zur Verfügung!
Lesezeichen