Publikační činnost - opravy


Rád bych poděkoval všem, kteří mi zaslali své připomínky a upozornili na chyby v mých publikacích. Nelitovali času a podělili se o své velmi cenné poznatky, ke kterým se museli mnohdy velmi svízelně propracovávat. Usnadní tím práci ostatním a publikace se stanou jejich zásluhou ještě cennějším pomocníkem.


Mikrořadiče PIC16CXX a vývojový kit PICSTART



Programování mikrokontrolérů PIC16CXX



Komunikace mikrokontroléru s okolím 1


...... Velmi jsem se zaradoval, kdyz jsem v knihkupectvi BEN objevil Vasi knihu, protoze jsem si potrebne rutiny mohl prohlednout jiz naprogramovane. Seriova komunikace chodila temer okamzite, s I2C komunikaci byly nasledujici problemy.

1) Rutiny pro I2C komunikaci
Start a Stop sekvence nemaji na svem zacatku prednastaveny hodnoty SDA a SCL. Po skonceni programu rxd ci txd je stav signalu SCL = 0, SDA = 1. Ma-li pak nasledovat Stop sekvence, musi byt SCL=0, SDA=0. Pro Start sekvenci SCL=1, SDA=1
Proto by myslim bylo vhodne prednastaveni umistit na zacatek techto rutin.

Pri cteni ACK priznaku v rutine txd pred ctenim signalu SDA neni zaruceno aby SDA bylo v log 1. Byl-li posledni bit predeslych dat 0, nacte se taktez 0 z lachte portu a ne z pinu.

2) Parazitni kapacity v PVKpro
Tenhle problem se mi dlouho nedarilo lokalizovat a pomohl mi az dvoukanalovy digitalni pametovy osciloskop. Zde se z LED diody a LED v sedmisegmentovkach splu s pull-up odpory brany B, tvori RC clanek s Tau asi 5us. Proto pri prepinani pinu z vystupu na vstup (z 0 do 1), nabehne log 1 az za pomerne dlohou dobu. To v zadnem pripade neodpovida standartu I2C, kde na nabeznou hranu je povolena pouha 1us. Proto cekani pomoci 3 nopu je naprosto nedostacujici a signal kolikrat do log 1 nestaci dobehnout. Problem lze vyresit zmensenim pull-up odporu v PVKpro, nebo zarazenim podstatne delsich cekani. Pri smycce s 10ti nopy uz vse behalo dobre.
Z toho vyplyva, ze v tomto zapojeni PVKpro neni schopno po I2C sbernici komunikovat 100kbs, ale podstatne pomaleji.

V zaveru bych si dovolil upozornit na preklep na strane 136 ve 4. odstavci je zminena minimalni doba 4.7 ms. Spravne by melo byt 4.7 us

Martin Blazik


Pan Zdeněk Záliš poslal funkční verzi programu pro práci s teplotními čidly DALLAS
;**************************************************************
; DALLAS casovani jednovodicove sbernice
;**************************************************************
; fosc = 4 MHz
; rychlost prenosu dat priblizne 16 kB/sec
;..............................................................
; DS I/O vyvod je RB0
; nakonfigurovanim I/O vyvodu jako vystupu je tento
; vyvod nastaven do nuly
; je-li vyvod ve funkci vstupu, jednicka na nem je nastavena
; pomoci PULL-UP rezistoru
; !!proto musi byt pred pouzitim tohoto podprogramu prislusne
; bity datoveho registru nastaveny do nuly!!
;.............................................................. ; pri operacich s DSxxxx je po dobu RESET sekvence, vyslani bytu
; a precteni bytu zakazano preruseni
;***************************************************************
; Definice symbolu
;**************************************************************
TMP1 equ 10h
PSW equ 11h
T_RDS equ 12h
BitSds equ 13h
f equ 1
z equ 2
SWR equ 03h
PortA equ 05h
PortB equ 06h
CtBit equ 14h
TMP equ 15h
CRC equ 16h
T_RDAT equ 17h
TEMPL equ 18h
TEMPH equ 19h
CtByte equ 1Ah
#define RP0 SWR,5
#define C SWR,0
#define DS PortB,0
#define Presen PSW,0
;**************************************************************
org 00h
goto Start
;**************************************************************
; Cekaci smycky pro casovani DALLAS sbernice
; ******* strana 117-119 ******* Komunikace 1 **********
;**************************************************************
; cekej min. 480 mikrosekund
; konstanta 9eh pro fosc = 4 MHz RESET pulz (482 mikrosekund)
;**************************************************************
cek480 movlw 9eh
goto cek
;**************************************************************
; cekej 405 mikrosekund - po teto dobe mohou byt po PRESENC
; vysilana data
; konstanta 83h pro fosc = 4 MHz (406 mikrosekund)
;**************************************************************
cek405 movlw 83h
goto cek
;**************************************************************
; cekej 60 mikrosekund - cekani na PRESENC pulz
; Presenc pulz testuj v dobe 15 mikrosekund po tomto cekani
; konstanta 11h pro fosc = 4 MHz (cteni za 61 mikrosekund)
;**************************************************************
cek60 movlw 11h
goto cek
;**************************************************************
; cekej 46 mikrosekund - cekani na dalsi cteni dat
; konstanta 0eh pro fosc = 4 MHz(46 mikrosekund)
;**************************************************************
cek46 movlw 0eh
;..............................................................
cek movwf TMP1
cek1 decfsz TMP1,f
goto cek1
return
;**************************************************************
; Vyslani RESET a cteni PRESENCE pulzu po jednovodicove DALLAS
; sbernici
; Pokud PRESENCE pulz prisel, nastavi se ve stavovem slovu programu PSW
; bit PRESEN
;.......................................
; vysle reset, ktery tva 487 mikrosekund
; ceka 65 mikrosekund a po te precte datovou linku
; (PRESENC pulz = 0)
;*************************************************************
resds bsf RP0 ;prace s TRIS registry
bcf DS ;vystup
bcf RP0 ;*vysli reset pulz
bcf DS ;*
call cek480
bsf DS ;ukonci reset pulz
bsf RP0 ;*prace s datovymi registry
bsf DS ;vstup
bcf RP0 ;*
call cek60 ;cekej 60 mikrosekund
bsf Presen ;precti presence pulz
btfsc DS
bcf Presen
;................................
call cek405 ;pockej 405 mikrosekund
;................................
return
;**************************************************************
; Precti byte z DSxxxx do T_RDS registru
; po jednovodicove DALLAS sbernici
;.................................
; odstartuje se cteni pulzem dlouhym 5 mikrosekund
; pote se uvolni sbernice a po deseti mikrosekundach se precte
; datova sbernice (bit dat)
; data se ctou po bytech vzdy od LSB
;**************************************************************
rdds movlw 08h ;nastav pocet ctenych bitu
movwf BitSds
;...............................
rdb1 bsf RP0
bcf DS
bcf RP0 ;*nastav vystup do nuly
bcf DS ;*
;...............................
goto rdb2 ;cekej 5 mikrosekund
rdb2 bsf RP0 ;*!!!pro fosc = 4 MHz!!!
bsf DS ;uvolni datovou linku
bcf RP0
;...............................
goto rdb3 ;cekej 10 mikrosekund
rdb3 goto rdb4
rdb4 goto rdb40 ;!!!pro fosc = 4 MHz!!!
rdb40 bcf C
nop ;*
;...............................
btfsc DS ;datovy bit do C bitu
bsf C
;................................
rrf T_RDS,f ;presun datovy bit do T_RDS
call cek46 ;cekej, az bude mozne cist dalsi bit
decfsz BitSds,f
goto rdb1
;...............................
movfw T_RDS
return
;***************************************************************
; Vysli byte dat ulozeny v T_RDS registru
; po jednovodicove DALLAS sbernici
;...................................
; zapis jednicky - pulz dlouhy 5 mikrosekund
; zapis nuly - pulz dlouhy 60 mikrosekund
; data jsou zapisovana po bytech vzdy od LSB
;**************************************************************
wrds movwf T_RDS
;................................
movlw 08 ;nastav pocet vysilanych bitu
movwf BitSds
bsf RP0 ;vyber TRIS registry
bcf DS ;*
bcf RP0 ;*
wrb1 rrf T_RDS,f ;jako prvni je vysilany LSB
bcf DS ;nastav vystup do nuly
btfss C
call cek60
goto wrb10 ;!!!pro fosc = 4 MHz!!!
wrb10 bsf DS ;nastav vystup do jednicky
btfsc C
call cek60
decfsz BitSds,f
goto wrb1
bsf RP0 ;*
bsf DS ;*
bcf RP0 ;nastav banku 0
;...............................
return
;...............................
;**************************************************************
; ;**************************************************************
; Odstartování převodu
;...............................
; pokud nepřijde presenc puls, ukončí se podprogram
;**************************************************************
convt call resds ;reset/presence
btfss Presen
return ;nepřišel presence puls
;............................
movlw 0cch ;skip rom
call wrds
;............................
movlw 044h ;convert temperature
call wrds
return
;**************************************************************
; Čtení teploty z čidla
;.......................................
; teplota se uloží do TEMPH a TEMPL
; správnost čtení je kontrolována výpočtem CRC
; Pokud nepřijde PRESENC puls ukončí se podprogram a do W se
; uloží 01h
; Jsou-li data správně přečtená, nastaví se do W hodnota 00h
; nejsou-li data správně přečtená, nastaví se do W hodnota 01h
;**************************************************************
rdt call resds ;reset/presence
btfss Presen
retlw 01h ;nepřišel presence puls od čidla
;............................
movlw 0cch ;skip rom
call wrds
;............................
movlw 0beh ;read scratchpad
call wrds
;............................
clrf CRC ;inicializace CRC
call rdds ;temperature LSB
movfw T_RDS ;do TEMPL
movwf TEMPL call vypcrc call rdds ;temperature MSB
movfw T_RDS ;do TEMPH
movwf TEMPH
call vypcrc
;.............................
movlw 07h ;data slouží pouze pro
movwf CtByte ;výpočet CRC
;.............................
rdt1 call rdds
call vypcrc
decfsz CtByte,f
goto rdt1
;.............................
movfw CRC ;kontrola CRC=0?
btfss SWR,z
retlw 01h ;špatně přečtená data
retlw 00h ;přečtená data jsou OK
;**************************************************************
; Vypocet CRC
;..............................................................
; podprogram provede pripocteni dat z bytu T_RDS k CRC
; Na zacatku vypoctu musime nastavit CRC na 00h
;**************************************************************
vypcrc movlw 08h ;pocet pripoctenych bitu 8
movwf CtBit
movfw T_RDS ;T_RDS do TMP1
movwf TMP
;..............................................................
vypcr0 rrf TMP,f ;LSB do C
bc vypcr3 ;C=1
btfsc CRC,7
goto vypcr4 ;CRC(7)=1,C=0
vypcr1 bcf C ;CRC(7).XOR.C=0
rlf CRC,f
vypcr2 decfsz CtBit,f
goto vypcr0
return
;..............................................................
vypcr3 btfsc CRC,7
goto vypcr1 ;CRC(7).XOR.C=0
vypcr4 movlw 18h ;CRC(7).XOR.C=1
xorwf CRC,f ;CRC.XOR.18h
bsf C
rlf CRC,f
goto vypcr2
;**************************************************************
Start call convt ;preved teplotu
call cek405
call rdt
goto Start
;**************************************************************
end
Děkuji.





zpet.gif (983 bytes)   Zpět na hlavní stránku