.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\tn2313def.inc" ; REGISZTEREK DEFINIÁLÁSA .def felbit =r0 .def vettbyteL =r1 .def vettbyteH =r2 ;.def =r3 ;.def =r4 ;.def =r5 ;.def =r6 ;.def =r7 ;.def =r8 ;.def =r9 ;.def =r10 ;.def =r11 ;.def =r12 ;.def =r13 ;.def =r14 ;.def =r15 .def vetel =r16 .def kuldeni =r17 .def valtozo =r18 .def IT_valtozo =r19 .def IT_valtozo2 =r20 .def bitek =r21 ;.def =r22 ;.def =r23 ;.def =r24 ;.def =r25 ; MEGSZAKÍTÁS UGRÓTÁBLA rjmp RESET rjmp EXT_INT0 rjmp EXT_INT1 rjmp T1_CAPT1 rjmp T1_COMPA rjmp T1_OVF rjmp T0_OVF rjmp UART_RX rjmp UART_UDRE rjmp UART_TX rjmp ANA_COMP rjmp PCINT rjmp T1_COMPB rjmp T0_COMPA rjmp T0_COMPB rjmp USI_START rjmp USI_OVF rjmp EE_READY rjmp WDT_OVF ; ALAPBEÁLLÍTÁS KEZD RESET: ldi valtozo, low(RAMEND) ; A STACK a RAM tetején lesz out SPL, valtozo ldi valtozo, 13 ; EXT_INT0 minden élre aktív, EXT_INT1 pozitív élre aktív (nem használjuk) out MCUCR, valtozo ldi valtozo, 64 ; Általános IT engedélyezése out GIMSK, valtozo in valtozo, UCR sbr valtozo, 8+16+128 ; B_TXEN : 8, B_RXEN : 16, B_RXCIE : 128 out UCR, valtozo ; Az adás, a vétel, és a vétel IT engedélyezve in valtozo, UBRR sbr valtozo, 12 ; 4 MHz órajel esetén 19200 Baud -> 12, 9600 Baud -> 25 out UBRR, valtozo ldi valtozo, 0 ; 0. időzítő/számláló: áll out TCCR0A, valtozo out TCCR0B, valtozo out TCNT0, valtozo ; A számláló értéke 0 ldi valtozo, 2 ; Megszakítás regiszterben timer0 OVerFlow engedélyezve -> 2 out TIMSK, valtozo cbi DDRD, 2 ; Ide jön a távirányító jele, ezért bemenet ldi valtozo, $60 ; A RAM elején tároljuk a vett adatokat mov XL, valtozo ; X a beérkezett adatokra mutat, vétel megszakítás használja clr XH ldi valtozo, $80 ; A RAM közepén tároljuk a vett adatokat mov YL, valtozo ; Y a kiolvasó mutatója, adatfeldolgozás használja (jelenleg nem használt) clr YH ldi kuldeni, 'S' ; Bekapcsoláskor bejelentkezik a PC felé. rcall EGYBYTEKULD ; Elküldi: "Start" + $0A + $0D ldi kuldeni, 't' rcall EGYBYTEKULD ldi kuldeni, 'a' rcall EGYBYTEKULD ldi kuldeni, 'r' rcall EGYBYTEKULD ldi kuldeni, 't' rcall EGYBYTEKULD rcall SORVEGE sei ; Most már mehet az IT ; EDDIG ALAPBEÁLLÍTÁS ; FŐPROGRAM KEZD LOOP : rjmp LOOP ; Elölről kezdi a ciklust, amiből csak a megszakítás lépteti ki ; EDDIG FŐPROGRAM ; VÉTEL INTERRUPT UART_RX: ; Soros porton érkezett egy adat in vetel, SREG ; Az állapotregiszter elmentése push vetel in vetel, UDR ; A vett karaktert elhelyezem st X+, vetel ; az X által mutatott helyre, majd X-et növelem eggyel cpi vetel, 13 ; Sorvége (13) érkezett? breq FOGAD ; Igen, Feldolgozni az eddigieket ; Nem, jöhet a következő adat pop vetel ; Az állapotregiszter visszatöltése out SREG, vetel reti ; Visszatérés a megszakításból ; EDDIG FOGAD EGY KARAKTERT ; FOGAD EGY ADATSORT, AMI ENTERREL VAN ZÁRVA FOGAD: ; Itt dolgozza fel a kapott adatsort. ; Most nem csinálunk semmit sem... FOGADVEGE : ; Itt folytatja az adatsor feldolgozása után ldi vetel, $60 ; A RAM elején tároljuk a vett adatokat mov XL, vetel ; X a beérkezett adatokra mutat clr XH pop vetel ; Az állapotregiszter visszatöltése out SREG, vetel reti ; Visszatérés a megszakításból ; EDDIG VÉTEL INTERRUPT ; EGY BYTE KÜLDÉSE EGYBYTEKULD: ; Elküldi amit kell in valtozo, USR ; UART státuszregisztere andi valtozo, 32 ; Adósor üres? breq EGYBYTEKULD ; Vár, amíg nem adhat out UDR, kuldeni ; Elküldi az adatot ret ; EDDIG EGY BYTE KULDÉSE ; "Kocsivissza" + "Soremelés" karakterek küldése SORVEGE: ldi kuldeni, 10 rcall EGYBYTEKULD ldi kuldeni, 13 rcall EGYBYTEKULD ret ; EDDIG "Kocsivissza" + "Soremelés" karakterek küldése ; Megszakítás érkezett, váltott a bemeneten a jelszint EXT_INT0: in IT_valtozo, SREG ; Az állapotregiszter elmentése push IT_valtozo in IT_valtozo, TCNT0 ; Hol tart a számláló cpi IT_valtozo, 0 ; 0? breq EXT_INT0_ELSO ; Igen, tehát áll a számláló, vagyis ez a legelső él ; Nem, az adatfolyam közepén tartok cpi IT_valtozo, 83 ; Rövidebb impulzus? brlo FELEGY ; Igen, tehát "1" bit egyik fele ; Nem, tehát "0" bit sbrc felbit, 0 ; Volt "1" bit első fele? rjmp EXT_INT0_VEGE ; Igen, akkor hiba történt ; Nem. Tehát rendben inc bitek ; Érvényes bit érkezett, növelem a beérkezett bitek számát cpi bitek, 8 ; Első 7 bit? (0-6) brlo NULLA_ALSO ; Igen. ; Nem, a második 7 bit (7-13) lsl vettbyteH ; Eltolom balra a magasabb byte bitjeit, a jobb szélére "0" érkezik rjmp EXT_INT0_VEGE ; Várom a következőt NULLA_ALSO: ; Az első 7 bit valamelyike lsl vettbyteL ; Eltolom balra az alacsonyabb byte bitjeit, a jobb szélére "0" érkezik rjmp EXT_INT0_VEGE ; Várom a következőt FELEGY: ; "1" bit egyik fele sbrc felbit, 0 ; Jött már "1" bit fele? rjmp EGY ; Igen, megvan a teljes "1" bit ; Nem, ez még csak az első fele volt inc felbit ; Megjegyzem, hogy megjött az "1" első fele rjmp EXT_INT0_VEGE ; Várom a következőt EGY: ; Ez már az "1" bit második fele volt clr felbit ; Törlöm az "1" bit felének jelzését inc bitek ; Érvényes bit érkezett, növelem a beérkezett bitek számát cpi bitek, 8 ; Első 7 bit? (0-6) brlo EGY_ALSO ; Igen. ; Nem, a második 7 bit (7-13) lsl vettbyteH ; Eltolom balra a magasabb byte bitjeit inc vettbyteH ; a jobb szélére "1"-et írok rjmp EXT_INT0_VEGE ; Várom a következőt EGY_ALSO: ; Az első 7 bit valamelyike lsl vettbyteL ; Eltolom balra az alacsonyabb byte bitjeit inc vettbyteL ; a jobb szélére "1"-et írok rjmp EXT_INT0_VEGE ; Várom a következőt EXT_INT0_VEGE: ; Az EXT_INT0 rutin lezárása clr IT_valtozo ; Nullázom a számlálót out TCNT0, IT_valtozo pop IT_valtozo ; Az állapotregiszter visszatöltése out SREG, IT_valtozo reti ; Visszatérés a megszakításból EXT_INT0_ELSO: ; Az adatsor első éle érkezett clr bitek ; Eddig jött 0 darab bit clr felbit ; Eddig nem jött "1" bit fele sem clr vettbyteL ; A vett byte-ok tartalmának törlése clr vettbyteH ldi IT_valtozo, 3 ; A számláló elindítása. Az előosztó: a belső órajelet 1/64-ed részére osztja. out TCCR0B, IT_valtozo pop IT_valtozo ; Az állapotregiszter visszatöltése out SREG, IT_valtozo reti ; Visszatérés a megszakításból T0_OVF: ; Ha túlcsordult a számláló cli ; Tiltom a további megszakítást, biztos, ami biztos alapon in IT_valtozo, SREG ; Az állapotregiszter elmentése push IT_valtozo clr IT_valtozo ; Leállítom az időzítőt out TCCR0B, IT_valtozo out TCNT0, IT_valtozo ; Nullázom a számlálót cpi bitek, 13 ; Bejött egy híján az összes bit? brlo T_OVF_HIBA ; Nem, Akkor valami hiba történt lsl vettbyteH ; Igen, akkor megvan az utolsó is, balra tolom a magasabb byte-ot sbrc felbit, 0 ; Jött korábban "1" bit fele? inc vettbyteH ; Igen, beírom a jobb szélső helyre az "1"-et mov kuldeni, vettbyteL ; Átküldöm a PC-nek az alacsonyabb byte-ot rcall EGYBYTEKULD mov kuldeni, vettbyteH ; Átküldöm a PC-nek a magasabb byte-ot rcall EGYBYTEKULD rcall SORVEGE ; Elküldöm a "kocsivissza" + "soremelés" karaktereket T_OVF_HIBA: ; Ide ugrik, ha hiba volt, és nem küld semmit el pop IT_valtozo ; Az állapotregiszter visszatöltése out SREG, IT_valtozo sei ; Most már jöhet az újabb megszakítás reti ; Visszatérés a megszakításból ; A nem használt megszakítások, ha mégis érkeznének, azonnal lezárulnak ;EXT_INT0: EXT_INT1: T1_CAPT1: T1_COMPA: T1_OVF: ;T0_OVF: ;UART_RX: UART_UDRE: UART_TX: ANA_COMP: PCINT: T1_COMPB: T0_COMPA: T0_COMPB: USI_START: USI_OVF: EE_READY: WDT_OVF: reti