;; Software-UART mit 38 kHz IR-ASK auf dem AtTiny15 ;; Überträgt den Spannungswert an PB2 über PB0 als IR-Ausgabeanschluß ;; Die Abtastrate ist ungefähr 1.8 Hz, die Baudrate wie in den Konstanten angegeben. ;; Geschwindigkeit auf 1200 baud ;; Wie Abtastrate setzen? => ADC Interrupt nutzen, aber nur alle ... Zyklen senden. .include "tn15def.inc" .equ Pout = 1 ; output pin .equ clock = 1600000 ; cpu clock speed .equ baud = 1200 ; desired baud rate .equ f0 = 38000 ; IR ASK send frequency .equ T0stop = 0 .equ T0run = 2 ; T0 runs with clock/8 speed .equ preload = 255-clock/(baud*8) ; preload for timer 0 for Tbit .equ T1run = 0b10010101 ; clear-on-compare, no pwm, toggle oc1a, clock speed .equ T1val = clock/f0 ; clock values for OCR1A compare .equ cal = 0x5e ; Kalibrationsbyte .def data = r16 ; data register .def bitcount = r17 ; bit counter .def tmp = r18 ; general temporary register .def zero = r0 ; zero-value .def T0preload = r19 .def wait0 = r1 .def wait1 = r2 .org 000 rjmp RESET .org 005 rjmp TIMER0 .org 008 rjmp ADC RESET: ldi tmp,cal out osccal,tmp ; kalibrieren sbi DDRB,Pout ; Pout as output cbi PORTB,Pout ; Pout = 0 (inaktiv) ldi tmp,0b00000010 out TIMSK,tmp ldi tmp,0b00100001 ; ADC left-adjust from PB2 out ADMUX,tmp ldi tmp,0b11101111 out ADCSR,tmp ldi T0preload,preload ldi tmp,T1val out OCR1A,tmp ; load time value for ASK frequency ldi tmp,0b00100000 out MCUCR,tmp ; enable sleep mode sei ;enable interrupts l0: sleep rjmp l0 send_data: ldi bitcount,10 out TCNT0,T0preload ldi tmp,T0run out TCCR0,tmp ldi tmp,T1run out TCCR1,tmp ; set start bit ret TIMER0: out TCNT0,T0preload dec bitcount brne T0chkst out TCCR0,zero ; stop Timer0 reti T0chkst: cpi bitcount,1 brne T0send out TCCR1,zero ; activate stop-bit reti T0send: ldi tmp,0 sbrs data,0 ldi tmp,T1run out TCCR1,tmp lsr data reti ADC: dec wait0 brne ADC_end in data,ADCH rcall send_data ADC_end: reti