http://danyk.cz/avr_rdo.html
код ПЕРЕДАТЧИКА
Спойлер
Код: Выделить всё
; Vysilac 4-kanaloveho radioveho dalkoveho ovladani
; Modulace sirkou pulzu
; CPU 1,2 MHz
; DANYK
; http://danyk.cz/avr_rdo.html
.NOLIST
.INCLUDE "tn13def.inc"
.LIST
; --- !!! ZDE SE NASTAVUJE 7-bitove ID zarizeni !!! ----------------
.EQU ID=0b1001001
; ------------------------------------------------------------------
;.DEF POS3=R13 ;posuvne registry
.DEF POS1=R14 ;posuvne registry
.DEF POS2=R15 ;posuvne registry
.DEF REG=R16 ;pracovni registr
.DEF REG2=R17 ;pracovni registr 2
.DEF CYKLY=R18 ;pocitadlo vysilacich cyklu
.DEF BITY=R19 ;pocitadlo odeslanych bitu
.DEF DATA1=R20 ;data
.DEF DATA2=R21 ;data
;.DEF DATA3=R22 ;data
.EQU SMER=DDRB ;rizeni smeru
.EQU PORT=PORTB ;port
.EQU PINY=PINB ;port
.CSEG ;kodový segment
.ORG 0
RJMP START
.ORG PCI0addr
RJMP TLACITKO
START:
;nastavi portB
LDI REG,0b00010000
OUT SMER,REG
LDI REG,0b00001111
OUT PORT,REG
LDI REG,0b00100000 ; povoli preruseni PCINT
OUT GIMSK,REG ;
LDI REG,0b00001111 ; povoli preruseni PCINT na 0,1,2,3
OUT PCMSK,REG ;
LDI REG,0b00110000 ;povoli uspani (sleep) a nastavi mod power down
OUT MCUCR,REG
;vypne analog. komparator - neni nikdy vyuzit (setri energii)
LDI REG,0b10000000
OUT ACSR,REG
SEI
SMYCKA:
SLEEP
RJMP SMYCKA
TLACITKO:
IN REG2,PINY
ANDI REG2,0b00001111
CPI REG2,0b00001111
BREQ NENE
RCALL ZAKODUJ
RJMP TLACITKO
NENE:
LDI REG,0b00001111
OUT PORT,REG
RETI
ZAKODUJ: ; zakodovani dat (stav tlacitek v REG2 ... 0-0-0-0-TL4-TL3-TL2-TL1)
;vytvori inverzi
MOV DATA2,REG2
SWAP DATA2
COM REG2
ANDI REG2,0b00001111
OR DATA2,REG2
LDI REG,ID
LSL REG
MOV DATA1,REG
;spocita paritni bit (REG) z dolni pulky REG2 a z REG
EOR REG2,REG
SWAP REG
EOR REG2,REG
MOV REG,REG2
LSR REG2
LSR REG2
EOR REG,REG2
MOV REG2,REG
LSR REG2
EOR REG,REG2
ANDI REG,1
;prida paritni bit
OR DATA1,REG
RCALL VYSILEJ
RET
;Vysila s pouzitim inverzniho kontrolniho kodu
;Kodovani delkou pulzu (dlouhy = 1)
;Zacina se MSB
VYSILEJ:
LDI CYKLY,5 ;pocet vzorku v jednom vysilacim impulzu
VYSILEJ_DAL:
MOVW POS1,DATA1
;MOV POS3,DATA3
LDI BITY,16
DALSI_BIT:
SBRS POS2,7
RCALL KRATKA_1
SBRC POS2,7
RCALL DLOUHA_1
RCALL KRATKA_0
LSL POS1
ROL POS2
;ROL POS3
DEC BITY
BRNE DALSI_BIT
RCALL KRATKA_0
RCALL KRATKA_0
RCALL KRATKA_0
RCALL KRATKA_0
DEC CYKLY
BREQ DOVYSILEJ
RJMP VYSILEJ_DAL
DOVYSILEJ:
RET
;Krátká mezera
KRATKA_0:
LDI REG,80 ;x 2,5us
CEKEJ_K0:
DEC REG
BRNE CEKEJ_K0
RET
;Krátký impulz
KRATKA_1:
SBI PORT,4
LDI REG,40 ;x 2,5us
CEKEJ_K1:
DEC REG
BRNE CEKEJ_K1
CBI PORT,4
RET
;Dlouhý impulz
DLOUHA_1:
SBI PORT,4
LDI REG,160 ;x 2,5us
CEKEJ_D1:
DEC REG
BRNE CEKEJ_D1
CBI PORT,4
RETкОД ПРИЕМНИКА
Спойлер
Код: Выделить всё
; Prijimac 4-kanaloveho radioveho dalkoveho ovladani
; kodovani delkou pulzu
; ATtiny13A / 13 / 13V, CPU 1,2 MHz
; DANYK
; http://danyk.cz/avr_rdo.html
.NOLIST
.INCLUDE "tn13def.inc"
.LIST
; --- !!! ZDE SE NASTAVUJE 7-bitove ID zarizeni !!! ----------------
.EQU ID=0b1001001
; ------------------------------------------------------------------
.DEF VYST1_P=R12 ;predchozi stav prijimace bitu
.DEF VYST2_P=R13 ;predchozi stav prijimace bitu 2
.DEF VYST1=R14 ;posuvny registr prijimace bitu
.DEF VYST2=R15 ;posuvny registr prijimace bitu 2
.DEF REG=R16 ;pracovni registr
.DEF REG2=R17 ;pracovni registr 2
.DEF STAV=R18 ;registr stavu vstupu
.DEF PRODLEVA=R19 ;prodleva do dalsi reakce
.DEF KOPIE1=R20 ;kopie vystupu
.DEF KOPIE2=R21 ;kopie vystupu 2
.DEF BITY=R22 ;pocitadlo bitu
.DEF ZALOHA=R23 ;zalohuje casomiru
.DEF PRETEK=R24 ;pretekani casovace
.EQU SMER=DDRB ;rizeni smeru
.EQU PORT=PORTB ;port
.EQU PINY=PINB ;port
.CSEG ;kodový segment
.ORG 0
RJMP START
.ORG PCI0addr
RJMP SIGNAL
.ORG OC0Aaddr
RJMP CAS_VYPRSEL
START:
LDI REG,LOW(RAMEND)
OUT SPL,REG
;nastavi portB
LDI REG,0b00001111
OUT SMER,REG
LDI REG,0b00000000
OUT PORT,REG
; NASTAVENI CASOVACU
LDI REG,0b00000010 ; nastavi čítač na nulovani pri dosazeni porovnavane...
OUT TCCR0A,REG ; ...hodnoty (tzv. CTC), OC0 nevyuzit
LDI REG,0b00000010 ; preddeleni 8
OUT TCCR0B,REG ;
LDI REG,255 ; nastavi porovnavanou hodnotu
OUT OCR0A,REG ;
LDI REG,0b00000100 ; povoli preruseni OCIE0A
OUT TIMSK0,REG ;
LDI REG,0b00100000 ; povoli preruseni PCINT
OUT GIMSK,REG ;
LDI REG,0b00010000 ; povoli preruseni PCINT na 4
OUT PCMSK,REG ;
LDI REG,0b00110000 ;povoli uspani (sleep) a nastavi mod power down
OUT MCUCR,REG
;vypne analog. komparator - neni nikdy vyuzit (setri energii)
LDI REG,0b10000000
OUT ACSR,REG
CLR BITY
SEI
SMYCKA:
SLEEP
RJMP SMYCKA
SIGNAL:
IN STAV,PINY
SBRS STAV,4
RJMP SESTUPNA
; Nabezna hrana _- !!!!!!!!!!!!!!
; ------------------------------------------------------------------
IN ZALOHA,TCNT0
CLR REG
OUT TCNT0,REG
CPI ZALOHA,64
BRLO KONEC_HRAN
RCALL KONTROLA
RJMP KONEC_HRAN
; Sestupna hrana -_ !!!!!!!!!!!!!
; ------------------------------------------------------------------
SESTUPNA:
IN REG,TCNT0
CPI REG,8 ;Prah delky zakmitu / kratkeho pulzu
BRLO ZAKMIT
CLR REG2
OUT TCNT0,REG2
CPI REG,128 ;Prah delky dlouheho pulzu / prilis dlouheho pulzu
BRLO NE_KONEC_SNIMKU
CLR VYST1
CLR VYST2
CLR BITY
RJMP KONEC_HRAN
NE_KONEC_SNIMKU:
LSL VYST1
ROL VYST2
INC BITY
CPI REG,32 ;Prah kratkeho pulzu / dlouheho pulzu
BRLO KRATKY_P
INC VYST1
KRATKY_P:
ZAKMIT_KONEC:
KONEC_HRAN:
LDI REG,0b00100000 ;povoli uspani (sleep) a nastavi mod idle
OUT MCUCR,REG
RETI
ZAKMIT:
ADD REG,ZALOHA
OUT TCNT0,REG
RJMP ZAKMIT_KONEC
CAS_VYPRSEL:
;kontrola spravnosti prenosu
RCALL KONTROLA
INC PRETEK
CPI PRETEK,40
BRLO VYPRSENI_NE
CLR PRETEK
CLR PRODLEVA
LDI REG,0b00110000 ;povoli uspani (sleep) a nastavi mod power down
OUT MCUCR,REG
VYPRSENI_NE:
RETI
KONTROLA:
CPI BITY,16 ;nesedi-li pocet bitu, zahodi kod
BRLO CHYBA_BITY
CP VYST1_P,VYST1 ;nejsou-li 2 po sobe jdouci kody stejne, nereaguje
CPC VYST2_P,VYST2
BRNE CHYBA_RUZNE
RCALL PRIJEM
CHYBA_BITY:
CLR VYST1
CLR VYST2
CHYBA_RUZNE:
MOVW VYST1_P,VYST1
CLR BITY
RET
PRIJEM:
CPI PRODLEVA,0
BRNE NEREAGUJ
;kontrola ID zarizeni
MOV REG,VYST1
LSR REG
CPI REG,ID
BRNE NEREAGUJ
MOVW REG,VYST1
ANDI REG,0b11111110
;spocita paritni bit (REG) z dolni pulky REG2 a z REG
EOR REG2,REG
SWAP REG
EOR REG2,REG
MOV REG,REG2
LSR REG2
LSR REG2
EOR REG,REG2
MOV REG2,REG
LSR REG2
EOR REG,REG2
ANDI REG,1
;porovna paritni bit
MOV REG2,VYST1
ANDI REG2,1
CP REG2,REG
BRNE NEREAGUJ
;porovna inverzi
MOV REG,VYST2
MOV REG2,VYST2
SWAP REG2
COM REG2
CP REG,REG2
BRNE NEREAGUJ
MOV KOPIE1,VYST2
ANDI KOPIE1,0b00001111
IN REG,PORT
CPI KOPIE1,0b00000001
BREQ TL0
CPI KOPIE1,0b00000010
BREQ TL1
CPI KOPIE1,0b00000100
BREQ TL2
CPI KOPIE1,0b00001000
BREQ TL3
RJMP NEREAGUJ
TL0:
SBRC REG,0
CBI PORT,0
SBRS REG,0
SBI PORT,0
RJMP KONEC_TL
TL1:
SBRC REG,1
CBI PORT,1
SBRS REG,1
SBI PORT,1
RJMP KONEC_TL
TL2:
SBRC REG,2
CBI PORT,2
SBRS REG,2
SBI PORT,2
RJMP KONEC_TL
TL3:
SBRC REG,3
CBI PORT,3
SBRS REG,3
SBI PORT,3
RJMP KONEC_TL
KONEC_TL:
LDI PRODLEVA,1
NEREAGUJ:
RETЯ попытался повторить и даже скинул в протеус.
Будут благодарен если знатоки по русски откоментируют asm код
Добавлено after 4 minutes 36 seconds:
Но в железе работает как то криво. Передатчик беспрерывно передает сигнал. А почему пока так и не понял.
аХотя в протеусе все отлично.


