.include "m8def.inc" ;Definitionsdatei einbinden .def temp = r18 .def skipT1 = r22 .def skipT2 = r23 .def skipCan = r24 .def skipsoll = r25 .equ CLOCK = 4000000 .equ BAUD = 19200 .equ UBRRVAL = CLOCK/(BAUD*16)-1 .equ Treset=0 ;definition der interrupthandler .org 0x000 rjmp main ; Reset Handler .org INT0addr rjmp int0_handler ; IRQ0 Handler main: ; Hauptprogramm ; Baudrate einstellen ldi temp, LOW(UBRRVAL) out UBRRL, temp ldi temp, HIGH(UBRRVAL) out UBRRH, temp ; Stackpointer initialisieren ldi temp, LOW(RAMEND) out SPL, temp ldi temp, HIGH(RAMEND) out SPH, temp ldi temp, 0xFF ;0xFF ins Arbeitsregister r16 laden out DDRB, temp ;Inhalt von r16 ins IO-Register DDRB ausgeben ldi temp, 0b11111100 ;0b11111100 in r16 laden out PORTB, temp ;r16 ins IO-Register PORTB ausgeben ;Schleife für ersten Messwert mit Interruptbehandlung an INT0 ldi temp, 0b00000000 ;Port D als Input definiert out DDRD, temp ldi skipT2, 0b00000001 ldi skipCan, 0b00000010 ldi skipsoll, 0b00000010 ldi temp, 0b00000011 ;MCUCR auf only rising edge-interrupt out MCUCR, temp ldi temp, 0b01000000 ;INT0 aktivieren out GICR, temp sei ;SREG Interrupt enable loop: rjmp loop ;endlosschleife int0_handler: cp skipCan,skipsoll breq counter_an cp skipT2,skipsoll breq T2_lesen fertsch: reti T2_lesen: in r19,TCNT1L ;Timerwert speichern in r20,TCNT1H ldi temp,0x00 ;Timer rücksetzen und löschen out TCCR1B,temp ;(Achtung Highbyte und Lowbytereihenfolge beachten) ldi temp,HIGH(Treset) out TCNT1H,temp ldi temp,LOW(Treset) out TCNT1L,temp rcall ausgabe ldi skipsoll, 0b00000010 rjmp fertsch counter_an: ldi r16, 0b00000001 out TCCR1B, r16 ;Timer/Counter1 an ldi skipsoll, 0b00000001 rjmp fertsch ;Ausgabe Pulsdauer y1(r16:r17) und y2(r19:r20) ausgabe: rcall receive_loop ;Schleife zum Sendestart mov temp,r19 rcall serout mov temp,r20 rcall serout ret serout: sbi UCSRB,TXEN ;TX aktivieren sbis UCSRA,UDRE ;Warten bis UDR für das nächste ;Byte bereit ist rjmp serout out UDR, temp ;Übertragung temp cbi UCSRB,TXEN ;TX deaktivieren ret receive_loop: sbi UCSRB,RXEN sbis UCSRA, RXC ;warten bis ein Byte angekommen ist rjmp receive_loop in temp, UDR test: sbic UCSRA, RXC rjmp test cbi UCSRB,RXEN ret