; ; hello interrupts ; ; interrupt driven hello mic .include "tn45def.inc" ; ; definitions ; .equ tx_pin = PB2; transmit pin .equ led1 = PB0; .equ led2 = PB1; .equ nloop = 200 ; number of samples between framing .def status_reg = R16 ; status register storage between interrupts .def temp = R17 ; temp! .def temp1 = R18 ; .def bit_count = R19 ; .def buffer = R20 ; .def reload = R21 ; .def txbyte = R22; ; baud rate settings .equ C = 1 .equ R = 1 .equ N = 96 ; bit positions in status register .equ BUSY=7; busy-flag (internal - read only) ; ; code segment ; .cseg .org $0000 rjmp reset .org OVF0addr rjmp timer0_overflow .org ACIaddr reti ; ; UART transmitter ; uart_init: ldi temp, R out TCCR0A, temp ret putchar: ser bit_count ; Erase bit counter mov buffer, txbyte ; Copy transmit data to buffer ldi temp, 1<7) is set rjmp timer0_stopb ; jump to stop-bit part sbrc buffer, 0 ; if LSB in buffer is 1 sbi PORTB, tx_pin ; set transmit to 1 sbrs buffer, 0 ; if LSB in buffer is 0 cbi PORTB, tx_pin ; set transmit to 0 lsr buffer ; shift buffer right out SREG, status_reg ; restore SREG reti timer0_stopb: sbi PORTB, tx_pin ; Generate stop-bit sbrs bit_count, 0 ; if bit_count == 8 (stop-bit) rjmp timer0_ret ; jump to exit timer0_ret: out SREG, status_reg ; reti ; ; spinner delays ; eight_bit_delay: ldi temp, 255 ebd_loop: dec temp brne ebd_loop ret sixteen_bit_delay: ldi temp, 255 sbd_loop: ldi temp1, 255 sbd_loop1: dec temp1 brne sbd_loop1 dec temp brne sbd_loop ret ; ; Main program ; reset: sbi DDRB, tx_pin sbi PORTB, tx_pin sbi DDRB, led1; sbi PORTB, led1; sbi DDRB, led2; sbi PORTB, led2; rcall uart_init sei loop: ldi txbyte, 1 rcall putchar ldi txbyte, 1 rcall putchar ldi txbyte, 2 rcall putchar ldi txbyte, 3 rcall putchar ldi txbyte, 5 rjmp loop