jak na user commands PC->PIC

Milan Kratochvíl milan.krata@quick.cz
Pondělí Červen 7 11:00:49 CEST 2004


>> -----Original Message-----
>> From: Cizek Milan [mailto:cizek.milan@seznam.cz]
>> Sent: Monday, June 07, 2004 12:27 AM
>> To: '[HWnews]'
>> Subject: RE: jak na user commands PC->PIC
>>
>>
>> Ahoj, predem diky za vsechny reakce.
>>
>> > -----Original Message-----
>> > From: hw-list-bounces@mailman.nethouse.cz
>> > On Behalf Of Danhard
>>
>> > 2) Jenourovnovy buffer pevne max. delky, nejjednoduseji pres
>> > neprime adresovani - ukazatel pole, je zapotrebi hlidat aby
>> > nepretekl max. prideleny prostor, po zpracovani zpravy se
>> > nastavi na zacatek, po dobu zpracovani zpravy zablokovat
>> prijem znaku.
>>
>> Na tomhle vlastne stojim, nevim totiz, jak naimplementovat
>> zmineny buffer,
>> jake prikazy pouzit, jak ho adresovat... Nebyl by nejaky
>> ukazkovy prikladek,
>> pripadne odkaz na tuto tematiku?
>>
>> Ja si to predstavuji tak, ze delka prikazu bude promena, kazda zadana
>> sekvence pak bude ukoncena napr. CRLF, cimz se prejde k
>> rozpoznavani. Jedine
>> co bych asi v tuto chvili zvladl je nadefinovat si blok
>> promenych a v kodu
>> vzdy precist znak z portu, dat do W, z W do promene atd.
>> treba 8x po sobe,
>> coz neni prilis efektivni.
>>
>> Z tohoto co popisujete soudim, ze se to da udelat daleko
>> lepe, nastavit
>> nejaky pointer na zacatek v RAM, precist do nej znak a pak
>> ho inkrementovat,
>> stale dokola, osetrit preteceni... Jak se tohle da udelat v asm?


Neco jsem napsal pro 16f877 cca pred pul rokem ale je to dost narocne na
pamet.
Prog.. je psán pro 19200br na RS485 a pokud skonci prijem zacne
vysilat.(timeout "timer0")
Trochu jsem ten kod procistil od casti netykajici se ser.buff.
Promenne v bance 0 jsem ponechal kvůli umisteni promene bool01 a
nasledujicich...
Buff. lze udelat libovolne velikosti ale musi byt jen v jedne bance
jinak jak je vydet tak buff. jsou 2. Pro TX a pro RX.
preruseni nevadi ale pozor na peclive ulozeni vsech menicich-se promennych!

Pripadnou kritiku prosim primo na muj mail protoze jsem pouze zacatecnik ale
rad se poucim abych nedelal dalsi chyby!

Ahoj Milan




;*****************************************************************
;*            BY MILAN KRATOCHVÍL ML.                            *
;*****************************************************************



 list p=16f877, R=DEC
 include "p16f877.inc"
 __CONFIG _CP_OFF  & _PWRTE_ON & _BODEN_ON & _WDT_OFF & _HS_OSC & _LVP_OFF;
& _WRTE_OFF

  cblock 20h ; definice proměnných v bance 0




TIMEOUT   ; TimeOut Sériového portu

BLIK_W   ; proměnné pro blikání
BLIK_WW   ; proměnné pro blikání

CRC_RX   ; crc pro příjem
CRC_TX   ; crc pro vysílání

N1   ; jednotky při zobrazení a také pomocná
N10   ; desítky při zobrazení a také pomocná
N100   ; stovky při zobrazení a také pomocná
KOLIK   ; výmluvná pomocná proměnná




AKCE_485_RX  ; akce kterou má dělat nebo dělá program
   ; při volání příjmu ser. portu

AKCE_485_TX  ; akce kterou má dělat nebo dělá program
   ; při volání příjmu ser. portu

AKCE_IDF   ; akce kterou má dělat nebo dělá program
   ; při porovnávání identifikace

;BUDE_AKCE_485_TX  ; příští akce kterou požaduji udělat jako odpověď na
příští dotaz


RX_485_ADRESA ; adresa se kterou chce komunikovat pc
RX_485_PRIKAZ ; příkaz který posílá
RX_485_KOLIK ; počet bytů které ještě pošle

CAS_IN1  ; čas proti rušení na vstupu od favorita
CAS_IN2  ; čas proti rušení na vstupu od favorita
CAS_IN3  ; čas proti rušení na vstupu od favorita


IDF_NUM   ; znak přijatý od identifikace
IDF_RX   ; znak právě přijímaný od identifikace
IDF_BIT   ; počet bitů pro příjem znaku identifikace
; buff pro zapamatování poslední identifikace
IDF_KOLIK_RX  ; počet bytů pro příjem identifikace
IDF_KOLIK  ; ukazuje kam se má uložit přijatý byt  (po malé úpravě to
ukazuje i IDF_KOLIK_RX)
IDF_BYT_HI  ; HI část přijatého bytu
IDF_BYT_TMP  ; LO+pracovní část přijatého bytu
IDF_POCET  ; počet uložených identifikací
IDF_POCET_POR  ; počet uložených identifikací pro kontrolování

TX_485_BUF  ; počet znaků v bufferu
TX_485_TMP  ; znak pro zápis do bufferu
TX_485_POC  ; míso kde se bude číst
TX_485_POZ  ; míso kam se bude zapisovat

TX_485_BUF_00
TX_485_BUF_01
TX_485_BUF_02
TX_485_BUF_03
TX_485_BUF_04
TX_485_BUF_05
TX_485_BUF_06
TX_485_BUF_07
TX_485_BUF_08
TX_485_BUF_09
TX_485_BUF_10
TX_485_BUF_11
TX_485_BUF_12
TX_485_BUF_13
TX_485_BUF_14
TX_485_BUF_15
TX_485_BUF_16
TX_485_BUF_17
TX_485_BUF_18
TX_485_BUF_19


RX_485_BUF  ; počet znaků v bufferu
RX_485_TMP  ; znak pro zápis do bufferu
RX_485_POC  ; míso kde se bude číst
RX_485_POZ  ; míso kam se bude zapisovat

RX_485_BUF_00
RX_485_BUF_01
RX_485_BUF_02
RX_485_BUF_03
RX_485_BUF_04
RX_485_BUF_05
RX_485_BUF_06
RX_485_BUF_07
RX_485_BUF_08
RX_485_BUF_09
RX_485_BUF_10
RX_485_BUF_11
RX_485_BUF_12
RX_485_BUF_13
RX_485_BUF_14
RX_485_BUF_15
RX_485_BUF_16
RX_485_BUF_17
RX_485_BUF_18
RX_485_BUF_19


nic_79
nic_80
nic_81
nic_82
nic_83

; Následující proměnné jsou přístupné ve všech bankách

bool01   ; registr pro proměnné typu boolean
bool02   ; registr pro proměnné typu boolean
bool03   ; registr pro proměnné typu boolean
;bool04   ; registr pro proměnné typu boolean
;bool05   ; registr pro proměnné typu boolean
;bool06   ; registr pro proměnné typu boolean
;boolN1   ; registr pro proměnné typu boolean pro nastavovací parametry
branky
nic_84
nic_85
nic_86
nic_87
nic_88
nic_89
nic_90
nic_91
nic_92
TMP_PCLATH  ; pomocný registr pro uchování dat při přerušení
TMP_S   ; pomocný registr pro uchování dat při přerušení
TMP_FSR   ; pomocný registr pro uchování dat při přerušení
TMP_W   ; pomocný registr pro uchování dat při přerušení
  endc




;intstop macro
;  bcf BYL_INT_GIE  ; nuluj ...
;  btfsc INTCON,GIE  ; pokud není povolené přerušení poskoč
;  bsf BYL_INT_GIE  ; nastav ...
;  bcf INTCON,GIE  ; zakaž přerušení
; endm
;
;intgo macro
;  btfsc BYL_INT_GIE  ; pokud bylo přerušení zakázáno tak poskoč
;  bsf INTCON,GIE
; endm

bank0 macro
  bcf STATUS,RP0
  bcf STATUS,RP1
 endm

bank0to1 macro
  bsf STATUS,RP0
 endm

bank1to0 macro
  bcf STATUS,RP0
 endm

bank1to3 macro
  bsf STATUS,RP1
 endm

bank1 macro
  bcf STATUS,RP1
  bsf STATUS,RP0
 endm

bank2 macro
  bcf STATUS,RP0
  bsf STATUS,RP1
 endm

bank3 macro
  bsf STATUS,RP1
  bsf STATUS,RP0
 endm



NASTAV_VYSILANI macro
  bsf SMER_485_PC ; přepni na 485-ce
  bcf RCSTA,CREN ; zakazuji příjem
 errorlevel  -302              ; suppress message 302 from list file
  bank0to1
  bsf TXSTA,TXEN ; povoluji vysílání
  bank1to0
 errorlevel  +302              ; suppress message 302 from list file
  endm
NASTAV_PRIJEM macro
  bcf SMER_485_PC ; přepni na 485-ce
 errorlevel  -302              ; suppress message 302 from list file
  bank0to1
  movlw H_TXSTA  ; zakazuji vysílání
  movwf TXSTA  ; OK
 errorlevel  +302              ; suppress message 302 from list file
  bank1to0
  movlw H_RCSTA  ; povoluji příjem
  movwf RCSTA  ; OK
  endm
; přepínání pro ukazatele ve FSR
FSR_HI  macro
  bsf STATUS,IRP
  endm
FSR_LO  macro
  bcf STATUS,IRP
  endm










#define VEL_BUFF_485 d'20'  ; velikost ser. buferu
#define TX_485_FULL bool01,0 ; ukazatel že je plný buffer pro TX Ser. portu
#define RX_485_FULL bool01,1 ; ukazatel že je plný buffer pro RX Ser. portu
#define TX_485_CHAR bool01,2 ; ukazatel že je znak v buffer pro TX Ser.
portu
#define RX_485_CHAR bool01,3 ; ukazatel že je znak v buffer pro RX Ser.
portu
#define VYSILA_485 bool01,4 ; Ukazatel že právě maká ser port

#define ANO_NE  bool01,7 ;

#define SMER_485_PC PORTA,0  ; řídí směr posílání dat
     ; 0 povoluje příjem zakazuje vysílání
     ; 1 zakazuje příjem povoluje vysílání



#define START_ZNAK_PAKETU 0xFD ; znak ktrým začínáme komunikační paket s PC


#define TIMER0 INTCON,T0IE  ; přerušení pro časovač TMR0
#define IDF_PRERUS INTCON,INTE ; přerušení pro časovač drát
#define TIMER1 PIE1,TMR1IE  ; přerušení pro časovač TMR1



#define H_INTCON b'01011000' ; konfigurace přerušení
#define H_PIE1 b'00110000' ; konfigurace přerušeí
#define H_PIE2 b'00000000' ; konfigurace přerušení
#define H_T1CON  b'00000101' ; KONFIG.ČASOVAČE
#define H_T2CON  b'00000110' ; KONFIG.ČASOVAČE
#define H_SSPCON b'00000000' ; konfigurace SSPCON
#define H_CCP1CON b'00000000' ; konfigurace SSPCON
#define H_RCSTA b'10010000' ; konfigurace RCsta (RX)
#define H_CCP2CON b'00000000' ; konfigurace SSPCON
#define H_ADCON0 b'11000001' ; AD převodník
#define H_OPTION_REG b'10000111'
#define H_TIMEOUT d'200'
#define H_TRISA b'11111011' ; portA 4-0, vstupu, vystupu
#define H_TRISB b'00100001' ; portB 7-0, 2vstupu, 6vystupu
#define H_TRISC b'10111111' ; portC 7-0, 7vstupu, 1vystupu
#define H_TRISD b'00000000' ; portD 7-0, 0vstupu, 8vystupu
#define H_TRISE b'00000000' ; portE 7-0, 0vstupu, 3vystupu
#define H_SSPADD b'00000000' ; konfigurace SSPSTAT
#define H_SSPSTAT b'00000000' ; konfigurace SSPSTAT
#define H_TXSTA b'00000100' ; konfigurace TXsta
#define H_SPBRG d'64'  ; konfigurace SPBRG = rychlost přenosu na 19200
#define H_ADCON1 b'00001110' ; AD převodník
#define H_EECON1 b'00000000'


;********************     Reset procesoru     ********************

RESET  org 0x00  ; zacatek programu
  clrf PCLATH  ; vymaž ukazatel programové adresy
  bsf PCLATH,3  ; nastav na PAGE 3 protože jdeš tak daleko
  bsf PCLATH,4  ; OK
 errorlevel  -306              ; suppress message 302 from list file
  goto INIT  ; skok na pocatecni inicializaci
 errorlevel  +306              ; suppress message 302 from list file

  org 0x04  ; adresa preruseni
  movwf TMP_W  ; ulozit W
  movf STATUS,W  ; ulozit STATUS a přepnout na banku 0
  bank0   ; |
  movwf TMP_S  ; OK
  movfw PCLATH  ; ulož pclath
  movwf TMP_PCLATH ; OK
  clrf PCLATH  ; nuluj pclath
  movfw FSR  ; ulož FSR
  movwf TMP_FSR  ; OK
  bcf STATUS,IRP ; nuluj stav ukazatele pro FSR obnoví se při obnovování
STATUS registru
  goto PRERUS  ; uložení hotovo tak jdi na provedení programů.
;  ------------------------





;  ------------------------
;******************** skoky závislé na hodnotách *****************
;  ------------------------
;*********************   Začátek programu   ********************
;********************   tělo programu       ********************
Start

....... program

Start01  btfsc RX_485_CHAR ; pokud NENÍ nic v buff poskoč
  goto .... výběr a obsloužení znaku z buff
Start02  btfss TX_485_FULL ; pokud JE buff plný poskoč
  goto ... zápis znaků do buff.

....... program

  goto Start

;********************   konec těla programu   *******************

;********************   těla podprogramů   ********************
Dej_485_RX btfss RX_485_CHAR ; test zda je nějaký znak v buferu
  return   ; není tak se vrať
;  intstop   ; zakáže přerušení
  bcf RX_485_FULL ; nuluj příznak plného bufferu
  banksel RX_485_POZ
  movlw RX_485_POZ ; ulož adresučtení-1 registru do FSR
  movwf FSR  ; OK
  movf RX_485_POC,W ; přičti pozici kde se čte
  addwf FSR,F  ; do FSR   OK
  decfsz RX_485_POC,F ; odečti na ukazateli a poskoč pokud je nulový
  goto D_485_R_01
  movlw VEL_BUFF_485 ; zapiš velikost bufferu do
  movwf RX_485_POC ; OK
D_485_R_01 decf RX_485_BUF,F ; odečti na počtu znaků
  skpnz   ; a poskoč pokud není 0
  bcf RX_485_CHAR ; nuluj příznak znaků v buferu
  FSR_HI
  movf INDF,W  ; čti místo a pošli ho ve W zpět
  FSR_LO
  bank0
;  intgo   ; povolí přerušení
  return   ; návrat

Dej_485_TX btfss TX_485_CHAR ; test zda je nějaký znak v buferu
  return   ; není tak se vrať
;  intstop   ; zakáže přerušení
  bcf TX_485_FULL ; nuluj příznak plného bufferu
  banksel TX_485_POZ
  movlw TX_485_POZ ; ulož adresučtení-1 registru do FSR
  movwf FSR  ; OK
  movf TX_485_POC,W ; přičti pozici kde se čte
  addwf FSR,F  ; do FSR   OK
  decfsz TX_485_POC,F ; odečti na ukazateli a poskoč pokud je nulový
  goto D_485_T_01
  movlw VEL_BUFF_485 ; zapiš velikost bufferu do
  movwf TX_485_POC ; OK
D_485_T_01 decf TX_485_BUF,F ; odečti na počtu znaků
  skpnz   ; a poskoč pokud NENí 0
  bcf TX_485_CHAR ; nuluj příznak znaků v buferu
  FSR_HI
  movf INDF,W  ; čti místo a pošli ho ve W zpět
  FSR_LO
  bank0
;  intgo   ; povolí přerušení
  return

Uloz_485_TX ; intstop   ; zakáže přerušení
  banksel TX_485_TMP
  movwf TX_485_TMP ; ulož do tmp pozice
  movlw TX_485_POZ ; ulož adresuzápisu-1 registru do FSR
  movwf FSR  ; OK
  movf TX_485_POZ,W ; přičti pozici kde se zapisuje
  addwf FSR,F  ; do FSR   OK
  movf TX_485_TMP,W ; ulož znak
  FSR_HI
  movwf INDF  ; OK
  FSR_LO
  decfsz TX_485_POZ,F ; odečti na ukazateli a poskoč pokud je nulový
  goto U_485_T_01
  movlw VEL_BUFF_485 ; zapiš velikost bufferu do
  movwf TX_485_POZ ; OK
U_485_T_01 incf TX_485_BUF,F ; přičti na počtu znaků
  movf TX_485_BUF,W ; test zda je buff. plný FULL
  banksel bool01  ; přepne na banku 0
  xorlw VEL_BUFF_485 ; xor w a konstanty velikosti bufferu
  skpnz   ; pokud se w a ... rovnají je vísledkem 0 když ne poskoč
  bsf TX_485_FULL ; nastavuji příznak plného buff.
  bsf TX_485_CHAR ; nastav příznak znaků v buferu
;  intgo   ; povolí přerušení
  btfsc TIMER0  ; pokud není timer poskoč
  return   ; je ... tak skoč
  btfsc VYSILA_485 ; pokud nevysila ser port poskoč
  return   ; je ... tak skoč
  banksel TX_485_BUF
  movfw TX_485_BUF
  bank0
  sublw d'1'
  skpnc
  return
U_485_T_03 bcf INTCON,GIE
  call Dej_485_TX ; dej mi znak
  NASTAV_VYSILANI
  movwf TXREG  ; dej ho do ...
  bsf VYSILA_485
  bsf INTCON,GIE
  return


;********************   konec těl podprogramů   ********************



;********************         Přerusení       ********************

PRERUS  ; zálohování se provádí na začátku
; testy které přeušení to bylo
  btfsc PIR1,RCIF ; test ser RX portu
  goto Byl_485_RX
  btfsc PIR1,TXIF ; test ser TX portu
  goto Byl_485_TX
;... případně nějaká další přerušení

  btfss TIMER0  ; pokud je povolen časovač poskoč
  goto PRERUSERR  ; protože není povolen timer0 přeskoč ho
  btfsc INTCON,T0IF ; test na timer
  goto Byl_TMR0
PRERUSERR ; btfsc PIR1,ADIF ; test na AD prev.
 ; goto Byl_AD

; protože jsi došel sem tak je nějaké nepoužité přerušení tak smaž všechny a
pokračuj
  clrf PIR1
  clrf PIR2
  movlw H_INTCON
  movwf BLIK_W
  bcf BLIK_W,7
  movf BLIK_W,W
  movwf INTCON

; zakončovasí procedura pro ukončení přerušení
INT_END  bank0
  movfw TMP_PCLATH
  movwf PCLATH
  movfw TMP_FSR
  movwf FSR
  movfw TMP_S  ; obnova STATUS
  movwf STATUS  ; OK
  swapf TMP_W,F  ; obnova W
  swapf TMP_W,W  ; OK

  retfie   ; navrat z preruseni
;  -------------------------------


Byl_485_RX bcf PIR1,RCIF ; nuluj znak přerušení
  movf RCREG,W  ; přečti ..
Uloz_485_RX ;
  banksel RX_485_TMP
  movwf RX_485_TMP ; ulož do tmp pozice
  movlw RX_485_POZ ; ulož adresuzápisu-1 registru do FSR
  movwf FSR  ; OK
  movf RX_485_POZ,W ; přičti pozici kde se zapisuje
  addwf FSR,F  ; do FSR   OK
  movf RX_485_TMP,W ; ulož znak
  FSR_HI
  movwf INDF  ; OK
  FSR_LO
  decfsz RX_485_POZ,F ; odečti na ukazateli a poskoč pokud je nulový
  goto U_485_R_01
  movlw VEL_BUFF_485 ; zapiš velikost bufferu do
  movwf RX_485_POZ ; OK
U_485_R_01 incf RX_485_BUF,F ; přičti na počtu znaků
  movf RX_485_BUF,W ; test zda je buff. plný FULL
  banksel bool01  ; přepne na banku 0
  xorlw VEL_BUFF_485 ; xor w a konstanty velikosti bufferu
  skpnz   ; pokud se w a ... rovnají je vísledkem 0 když ne poskoč
  bsf RX_485_FULL ; nastavuji příznak plného buff.
  bsf RX_485_CHAR ; nastav příznak znaků v buferu
  movlw H_RCSTA  ; nuluj případné chyby při přenosu
  movwf RCSTA  ; OK
  movfw TIMEOUT  ; nastavení timeoutu do časovače TMR0 (musí být banka 0)
  movwf TMR0  ; OK
  bcf INTCON,T0IF ; zruš příznak timeoutu (časovače)
  bsf TIMER0  ; zapni časovač
  goto INT_END

Byl_485_TX bcf PIR1,TXIF ; nuluj znak přerušení
  btfss TX_485_CHAR ; test zda je nějaký znak v buferu
  goto Byl_485_TX_01 ; není
  bsf VYSILA_485 ; nastav příznak
  call Dej_485_TX ; dej mi znak
  NASTAV_VYSILANI
  movwf TXREG  ; dej ho do ...
  goto INT_END
Byl_485_TX_01 btfsc VYSILA_485
  goto Byl_485_TX_02
  NASTAV_PRIJEM
  goto INT_END
Byl_485_TX_02 bcf VYSILA_485 ; zruš příznak
  movlw d'255'
  movwf TXREG  ; dej ho do ...
  goto INT_END

Byl_TMR0  bcf INTCON,T0IF ; zruš příznak
  bcf TIMER0  ; vypni časovač
  movfw TIMEOUT  ; nastavení timeoutu do časovače TMR0 (musí být banka 0)
  movwf TMR0  ; OK
  btfss TX_485_CHAR ; pokud jsou znaky ve vys. buf tak poskoč
  goto INT_END  ; nejsou
  goto Byl_485_TX ; jsou tak jdi na vysílání



;-------------------------------
;************************************ konec přerušení
********************************


;**************************************************************
 ORG 0x1817
;;; tady musí začínat inity ostatních programů
;******************** Inicializace procesoru  ********************
 errorlevel  -302              ; suppress message 302 from list file
INIT  bcf STATUS,RP1 ; nastaveni BANKY 0
  bcf STATUS,RP0 ; nastaveni BANKY 0
;  ------------------------
  clrf PORTA  ; prednastaveni PORTu A
  clrf PORTB  ; prednastaveni PORTu B
  clrf PORTC  ; prednastaveni PORTu C
  clrf PORTD  ; prednastaveni PORTu D
  clrf PORTE  ; prednastaveni PORTu E

;        ------------------------
  bcf INTCON,GIE ; zakaž všechna přerušení
  FSR_HI
  movlw 0xEF
  movwf FSR
  movlw d'96'
  movwf TMP_W
MAZ_B3  clrf INDF
  decf FSR,F
  decfsz TMP_W,F
  goto MAZ_B3
  movlw 0x6F
  movwf FSR
  movlw d'96'
  movwf TMP_W
MAZ_B2  clrf INDF
  decf FSR,F
  decfsz TMP_W,F
  goto MAZ_B2
  FSR_LO
  movlw 0xEF
  movwf FSR
  movlw d'80'
  movwf TMP_W
MAZ_B1  clrf INDF
  decf FSR,F
  decfsz TMP_W,F
  goto MAZ_B1
  movlw 0x7E
  movwf FSR
  movlw d'95'  ; 95 protože je 96-tý vynulován chodem programu
  movwf TMP_W
MAZ_B0  clrf INDF
  decf FSR,F
  decfsz TMP_W,F
  goto MAZ_B0



  bank0to1   ; nastaveni BANKY 1


  movlw H_TRISA
  movwf TRISA

  movlw H_TRISB
  movwf TRISB

  movlw H_TRISC
  movwf TRISC

  movlw H_TRISD
  movwf TRISD

  movlw H_TRISE
  movwf TRISE

  movlw H_ADCON1
  movwf ADCON1

  movlw H_PIE1
  movwf PIE1

  movlw H_PIE2
  movwf PIE2

  movlw H_OPTION_REG
  movwf OPTION_REG

  movlw H_TXSTA
  movwf TXSTA

  movlw H_SPBRG
  movwf SPBRG

  movlw H_SSPSTAT
  movwf SSPSTAT

  movlw H_SSPADD
  movwf SSPADD

  clrf PR2  ; nuluj počet při kterém vyvolá přerušení tmr2




;        ------------------------

  bank1to3

  movlw H_EECON1
  movwf EECON1

  banksel TX_485_POC

  movlw VEL_BUFF_485 ; zapiš velikost bufferu do
  movwf TX_485_POC ; míso kde se bude číst
  movwf TX_485_POZ ; míso kam se bude zapisovat
  movwf RX_485_POC ; míso kde se bude číst
  movwf RX_485_POZ ; míso kam se bude zapisovat
     ; vynuluj



  bank0   ; !!!!!!!!!!!!!!!!!!!!!!!! BANK0 !!!
  movlw H_TIMEOUT
  movwf TIMEOUT  ; nastavení timeoutu do časovače TMR0 (musí být banka 0)
  movwf TMR0  ; OK

  movlw H_T1CON
  movwf T1CON

  movlw H_T2CON
  movwf T2CON

  movlw H_SSPCON
  movwf SSPCON

  movlw H_CCP1CON
  movwf CCP1CON

  movlw H_CCP2CON
  movwf CCP2CON

  movlw H_ADCON0
  movwf ADCON0

  movlw H_RCSTA
  movwf RCSTA



  clrf PORTA  ; prednastaveni PORTu A
  clrf PORTB  ; prednastaveni PORTu B
  clrf PORTC  ; prednastaveni PORTu C
  clrf PORTD  ; prednastaveni PORTu D
  clrf PORTE  ; prednastaveni PORTu E

   ; NASTAV_PRIJEM macro
  bcf SMER_485_PC ; přepni na 485-ce
  bank0to1
  movlw H_TXSTA  ; zakazuji vysílání
  movwf TXSTA  ; OK
  bank1to0
  movlw H_RCSTA  ; povoluji příjem
  movwf RCSTA  ; OK


  movlw H_485_TX_START_AKCE
  movwf AKCE_485_TX
  movlw H_485_RX_START_AKCE
  movwf AKCE_485_RX

  clrf PIR1
  clrf PIR2
  movlw H_INTCON
  movwf INTCON
  bsf INTCON,GIE
 errorlevel  +302              ; suppress message 302 from list file


  clrf PCLATH
 errorlevel  -306              ; suppress message 302 from list file
  goto Start
 errorlevel  +306              ; suppress message 302 from list file

;********************   konec INITu
*****************************************



;*****************************************************************
;*            BY MILAN KRATOCHVÍL ML.                            *
;*****************************************************************
         end




Další informace o konferenci Hw-list