.nolist .include "tn2313def.inc" ; Define device ATtiny2313 .list ; ***Konstanten*** .equ F_CPU = 10000000 .equ F_ICR = 256 .equ PWM = F_CPU/F_ICR .equ BAUD = 31250 .equ BRC = (F_CPU/16/BAUD)-1 ; ***Defs*** .def rsreg = r15 .def rmp = r16 .def rbuf2 = r17 .def rudr = r18 .def rudr2 = r19 .def rudr3 = r20 .def rdaten = r21 .def rpkl = r22 .def rpkh = r23 .def rbuf = r24 .def rflag = r25 .def rZero = r0 .def rp1l = r3 .def rp1h = r4 .def rp2l = r5 .def rp2h = r6 .def rp3l = r7 .def rp3h = r8 .def rp4l = r9 .def rp4h = r10 ; ***SRAM*** .dseg .org SRAM_START .cseg .org 000000 ;Vectorinit rjmp Main ; Reset vector reti ; INT0 reti ; INT1 reti ; ICP1 reti ; OC1A reti ; OVF1 ersatz! ; rjmp time ; OVF1 reti ; OVF0 rjmp uartrx_isr ; URXC reti ; UDRE reti ; UTXC reti ; ACI reti ; PCI reti ; OC1B reti ; OC0A reti ; OC0B reti ; USI_START reti ; USI_OVF reti ; ERDY reti ; WDT ;ISRs here uartrx_isr: in rsreg, SREG ;nur bei flag 0 cpi rflag, 0 brne uartrx_isr2 ;Falls nich, Daten rein in rudr, UDR ldi rflag, 1 out SREG, rsreg reti uartrx_isr2: ;nur bei flag 1 cpi rflag, 1 brne uartrx_isr3 ;Falls nich, Daten rein in rudr2, UDR ldi rflag, 2 out SREG, rsreg reti uartrx_isr3: ;nur bei flag 2 cpi rflag, 2 brne uartrx_isr ;Falls nich, Daten rein in rudr3, UDR ldi rflag, 0 out SREG, rsreg reti ;uartrx_clr: ; in rudr, UDR ; clr rudr2 ; clr rudr3 ; out SREG, rsreg ; reti ;Grade obsolet, bei Timerinterrupt ;time: ;Daten aus dem Flash holen ; lpm rmp, Z+ ; ;OCR1A schreiben, erst H, dann L ; out OCR1AH, r2 ; out OCR1AL, rmp ; reti ;Main prog Main: ;init Stack pointer ldi rmp,Low(RAMEND) out SPL,rmp ;init Zero register ldi rmp, 0 mov rZero, rmp ;DDB init sbi DDRB, DDB3 ;UART RX init ldi rmp, HIGH(BRC) out UBRRH, rmp ldi rmp, LOW(BRC) out UBRRL, rmp ldi rmp, (1< 5 mal lsr mov rmp, rp1h lsr rmp lsr rmp lsr rmp lsr rmp lsr rmp ;Position der Daten auf der LUT ldi ZH, HIGH(daten*2) ldi ZL, LOW(daten*2) add ZL, rmp adc ZH, rZero ; Lade Daten aus Lookup table lpm rmp, Z ;OCR1A schreiben, erst H, dann L ;Interrupts ausmachen vorher cli out OCR1AH, rZero out OCR1AL, rmp sei ;Poll for keyon cpi rudr, 0x90 breq keyon cpi rudr2, 0x90 breq keyon2 cpi rudr3, 0x90 breq keyon3 ;poll for keyoff cpi rudr, 0x80 breq keywhich cpi rudr2, 0x80 breq keywhich2 cpi rudr3, 0x80 breq keywhich3 rjmp loop2 ;rjmp loop loop2: ;wait for TOV1 in rmp, TIFR sbrs rmp, TOV1 rjmp loop2 ;clear TIFR out TIFR, rmp rjmp loop keyon: ;clr rudr ; Erster Key? mov rbuf, rudr2 ;clr rudr2 mov rbuf2, rbuf cp rbuf, rZero brne playkey rjmp loop2 keyon2: ;clr rudr2 mov rbuf, rudr3 ;clr rudr3 mov rbuf2, rbuf cp rbuf, rZero brne playkey rjmp loop2 keyon3: ;clr rudr3 mov rbuf, rudr ;clr rudr mov rbuf2, rbuf cp rbuf, rZero brne playkey rjmp loop2 keywhich: cp rbuf2, rudr2 breq keyoff rjmp loop2 keywhich2: cp rbuf2, rudr3 breq keyoff rjmp loop2 keywhich3: cp rbuf2, rudr breq keyoff rjmp loop2 keyoff: ldi rpkl, 0 ldi rpkh, 0 mov rp1l, rZero mov rp1h, rZero ;clr rudr ;clr rudr2 ;clr rudr3 rjmp loop2 playkey: ldi ZH, HIGH(keys*2) ldi ZL, LOW(keys*2) ;Welche Daten? Ein C4 ist Taste 49 bei ;einem Midikeyboard, in meiner Tabelle ;ist das aber Taste 40... aus rudr2 ;kommt direkt die Tastenzahl ;9 abziehen subi rbuf, 9 ;verdoppeln da Woerter statt bytes lsl rbuf ;nun springen zum richtigen Arraypunkt add ZL, rbuf adc ZH, rZero ;laden in phasensummanden lpm rpkl, Z+ lpm rpkh, Z ;clr rudr ;clr rudr2 ;clr rudr3 rjmp loop2 ;hier mein 8bit Dreieckston daten: .db 0, 30, 60, 90, 120, 90, 60, 30 ; Hier die Phasendelta Tabelle hz/pwm ; 88 Eintraege fuer 88 Klaviertasten keys: .dw 23,24,26,27,29,31,33,35,37,39,41,44,46,49,52,55 .dw 58,62,65,69,73,78,82,87,92,98,104,110,116,123,130,138 .dw 146,155,164,174,185,196,207,219,233,246,261,277,293,310,329,348 .dw 369,391,414,439,465,493,522,553,586,621,658,697,738,782,829,878 .dw 930,985,1044,1106,1172,1241,1315,1394,1476,1564,1657,1756,1860,1971,2088,2212 .dw 2344,2483,2631,2787,2953,3128,3314,3511