Díval jsem se do toho Errata strana 3, ale nejsem z toho moc moudrý. UART proste po INIT zapnu (jak TX, tak RX) a zapnu přerušení pouze na RX.
WD jsem zatím nezapínal. Jediné přerušení je pouze pro příjem. Časování je z neefektivních čekacích smyček, protože mám v programu na všechno dost času.
Stále mi nejde přetáhnout či jinak vložit ten zdroják. Má cca 23kb a nejde mi vložit ani jako TXT. Tak alespoň nějaké kousky …
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CBLOCK 0x20 ; blok promenych
TMP0 ; temp casovacu
TMP1 ; temp casovacu
TMP2 ; temp casovacu
TMP3 ; temp casovacu
TMP5 ; priznaky
CAS1_BYTE ; max cas prijmu dalsiho byte
CAS2_BYTE ; max cas prijmu dalsiho byte
TMP10 ; stav prijmu byte
ADRESA ; adresa modulu po nacteni pinu
CISLO ; pomocne cislo
CAS1 ; pomocny pro blik a adresy
CAS3
CAS4 ; cas drzeni stavu byte_2 po stisku tlacitka
CAS5 ; cas drzeni stavu byte_2 po stisku tlacitka
BYTE_START
BYTE_ADRESA
BYTE_1
BYTE_2
BYTE_CRC
CRC
BYTE_TLACITKA
CAS5_EE
ENDC
;---------------
CBLOCK 0x70 ; blok promenych pro vsechny banky
W_SAVE ; temp ulozeni pri preruseni
STA_SAVE ; temp ulozeni pri preruseni
PCL_SAVE ; temp ulozeni pri preruseni
FSR_SAVE ; temp ulozeni pri preruseni
ENDC
;*************************************************************
;**************************************************************
; DEFINICE PRIZNAKU
#define P_BYTE0 TMP10,0 ; priznak prijmu BYTE0
#define P_BYTE_START TMP10,1 ; priznak prijmu BYTE1 = START_BYTE
#define P_BYTE_ADRESA TMP10,2 ; priznak prijmu BYTE2 = ADRESA
#define P_BYTE_1 TMP10,3 ; priznak prijmu BYTE3 = ADRESA OD KOHO
#define P_BYTE_2 TMP10,4 ; priznak prijmu BYTE4 = HODNOTA
#define P_BYTE_CRC TMP10,5 ; priznak prijmu BYTE7 = CRC
#define BLIK_3 TMP10,6 ; priznak pro blik z dotazu RX
#define STISKNUTO TMP5,0 ; priznak, ze bylo stisknuto tlacitko
;*************************************************************
; DEFINICE PINU
#define SMER PORTB,0 ; vystup SMER pro RS485
#define RX PORTB,1 ; vstup RX data pro RS485
#define TX PORTB,2 ; vystup TX data pro RS485
#define LED1 PORTB,3 ; vystup LED1, beh programu a stavy
#define TL1 PORTB,4 ; vstup TL1
#define TL2 PORTB,5 ; vstup TL2
#define TL3 PORTB,6 ; vstup TL3
#define TL4 PORTB,7 ; vstup TL4
#define TLRST PORTA,0 ; vstup TLRST
#define LED2 PORTA,1 ; vystup LED2, stavova pokoj
#define ADR1 PORTA,2 ; vstup ADRESA1
#define ADR2 PORTA,3 ; vstup ADRESA2
#define ADR4 PORTA,4 ; vstup ADRESA4
#define ADR8 PORTA,5 ; vstup ADRESA8
;#define X1 PORTA,6 ; vstup X-tal
;#define X2 PORTA,7 ; vstup X-tal
;*************************************************************
; org 0x2007 ; adresa konfigurace PIC16F628A
LIST P=16F648A;R=DEC
#include “P16F648A.INC” ; Include header file
; Pro 4MHz krystal
__CONFIG _CP_OFF & _PWRTE_ON & _BODEN_ON & _WDT_OFF & _XT_OSC & _LVP_OFF & _MCLRE_OFF
;*************************************************************
ORG 0x0000 ; zacatek programu
GOTO INIT ; skok na pocatecni inicializaci
ORG 0x0004
GOTO PRERUS
;*************************************************************
; INICIALIZACE
;*************************************************************
INIT
; ------------------------
BSF STATUS,RP0 ; nastaven BANKY 1
MOVLW b'11111101' ; portA vstupy a vystupy
MOVWF TRISA
MOVLW b'11110010' ; portB vstupy a vystupy
MOVWF TRISB
MOVLW b'10000111' ; PULL-UPy ON, 1:256
MOVWF OPTION_REG
MOVLW b'00000000' ; preruseni OFF
MOVWF INTCON
MOVLW b'00001000' ; osc. 4 MHz,
MOVWF PCON
BCF STATUS,RP0 ; Bank 0
MOVLW 0x07 ; vypni komparatory
MOVWF CMCON
CLRF PORTA
CLRF PORTB
CLRF PCLATH
CLRF FSR
CLRF STATUS
CLRF FSR
CLRF W_SAVE ; temp ulozeni pri preruseni
CLRF STA_SAVE ; temp ulozeni pri preruseni
CLRF PCL_SAVE ; temp ulozeni pri preruseni
CLRF FSR_SAVE ; temp ulozeni pri preruseni
CLRF TMP0 ; casovaci smycky
CLRF TMP1 ; casovaci smycky
CLRF TMP2 ; casovaci smycky
CLRF TMP3 ; casovaci smycky
CLRF TMP5 ; priznaky
CLRF CAS1_BYTE ; max cas prijmu dalsiho byte
CLRF CAS2_BYTE
CLRF TMP10 ; stav prijmu byte
CLRF ADRESA ; adresa modulu po nacteni pinu
CLRF CISLO ; pomocne cislo
CLRF CAS1 ; pomocny pro blik adresy
CLRF CAS3
CLRF CAS4 ; 20 ms x 256 x 12 = 61,44 sec
CLRF CAS5 ;
; CLRF POCET_BYTE
CLRF BYTE_START
CLRF BYTE_ADRESA
CLRF BYTE_1
CLRF BYTE_2
CLRF BYTE_CRC
CLRF CRC
CLRF BYTE_TLACITKA
CLRF CAS5_EE
CALL NACTI_CAS5_EE
MOVF CAS5_EE,W
MOVWF CAS5
CALL ADRESA_MODULU ; nacti adresu na jumperech
MOVF ADRESA,W
MOVWF CAS1
MOVLW .255 ; nastav cas pro prijem
MOVWF CAS1_BYTE ; 9us x 256 = 1,529 ms
MOVLW .10 ; nastav cas pro prijem
MOVWF CAS2_BYTE ; 10 x 1,529 = 15,373ms
CALL CEK1S
CLRW
XORWF ADRESA,W
BTFSC STATUS,Z
GOTO INIT_0 ; adresa 0
BLIKEJ_ADRESU
BSF LED1 ; zablika adresu
BSF LED2
CALL CEK500MS
BCF LED1
BCF LED2
CALL CEK500MS
DECFSZ CAS1,F
GOTO BLIKEJ_ADRESU
GOTO INIT_1
INIT_0 ; adresa 0
BSF LED1
BSF LED2
CALL CEK2S
BCF LED1
BCF LED2
INIT_1
CALL NASTAV_CAS1
BSF STATUS,RP0 ; nastaven BANKY 1
; BCF TXSTA,BRGH ; BRGH=0
MOVLW b’00100010’ ; povoleni vysilani
MOVWF TXSTA ; vysilani povoleno
; MOVLW .12 ; 4 800 BPS PRI 4MHZ XTAL A BRGH=0
MOVLW .25 ; 2 400 BPS PRI 4MHZ XTAL A BRGH=0
; MOVLW .51 ; 1 200 BPS PRI 4MHZ XTAL A BRGH=0
; MOVLW .103 ; 600 BPS PRI 4MHZ XTAL A BRGH=0
; MOVLW .207 ; 300 BPS PRI 4MHZ XTAL A BRGH=1
MOVWF SPBRG ; vloz hodnotu rychlosti do BRGH
BCF STATUS,RP0 ; Bank 0
MOVLW b'10010000' ; povoleni USART a asynchroniho rezimu ,
MOVWF RCSTA ; 8bit, asynchron mod
BSF STATUS,RP0 ; banka registru 1
MOVLW b'00100000'
MOVWF PIE1 ; zapni preruseni z RX
BCF STATUS,RP0 ; banka registru 0
CLRF TXREG ; vynuluj vysilaci registr
CLRF RCREG ; vynuluj prijimaci registr
MOVLW b'00010000'
MOVWF PIR1 ; vynuluj priznak prijmu
MOVLW b'11000000' ; zapni globalni preruseni a z periferii
MOVWF INTCON
GOTO MAIN ; skoc na MAIN
;********************************************************************
PRERUS ; prerus, uloz registry
BCF INTCON,GIE ; vypni globalni preruseni
BCF INTCON,PEIE ; vypni preruseni z periferii
BSF STATUS,RP0 ; nastaveni BANKY 1
BCF PIE1,RCIE ; vypni preruseni z RX
BCF STATUS,RP0 ; nastaven BANKY 0
MOVWF W_SAVE ; zalohuj registry
MOVF STATUS,W
CLRF STATUS
MOVWF STA_SAVE
MOVF PCLATH,W
MOVWF PCL_SAVE
MOVF FSR,W
MOVWF FSR_SAVE
BTFSS PIR1,RCIF ; over, zda byl prijem
GOTO KONEC_PRERUSENI ; nebyl
GOTO PRIJEM
; ********************************************************************
KONEC_PRERUSENI ; konec preruseni, obnoveni registru
CLRF TMP10
CLRF BYTE_START
CLRF BYTE_ADRESA
CLRF BYTE_1
CLRF BYTE_2
CLRF BYTE_CRC
CLRF STATUS
MOVF FSR_SAVE,W
MOVWF FSR
MOVF PCL_SAVE,W
MOVWF PCLATH
MOVF STA_SAVE,W
MOVWF STATUS
SWAPF W_SAVE,F
SWAPF W_SAVE,W
MOVLW b'10010000' ; povoleni USART a asynchroniho rezimu ,
MOVWF RCSTA ; 8bit, asynchron mod
BSF STATUS,RP0 ; banka registru 1
MOVLW b'00100000'
MOVWF PIE1 ; zapni preruseni z RX
BCF STATUS,RP0 ; banka registru 0
CLRF RCREG ; vynuluj prijimaci registr
CLRF TXREG
MOVLW b'00010000'
MOVWF PIR1 ; vynuluj priznak prijmu
MOVLW b'11000000' ; zapni globalni preruseni a z periferii
MOVWF INTCON
RETFIE
;*************************************************************