Svym zpusobem púotrebuju podprogram, kde po stisku tlacitka (je jich 17 program na rozpoznavani mam hotovy) se odesle po seriove lince 8bajtů z paměti EEPROM. tzn. tlacitko 1 - pamet eeprom 00 - 07hex, tlacitko 2 - pamet eeprom 08 - 0Fhex. Dekuji za pomoc!
administrator: přejmenováno z "Pic 16F88 … seriova linka"
V jakém jazyce to potřebuješ, myslím tím ASM, C nebo jiném.
Pokud nezáleží na velikosti obsazení paměti, tak si vytvoř 17 podprogramů které budeš volat tlačítky 1-17. V každém podprogramu načteš postupně 8 bytů z eeprom a odešleš do txreg.
Bude to asi nejednoduší na psaní a pochopení.
Potrebuji to v asm…mam uz jeden podprogram ktery vysle jeden bajt…ale potrebuji abych jich poslal celkem 8 tedy 64bitu. Nejlepší by byla smyčka která by tento podprogram 8x zopakovala ale nějak mi to nejde…
vipada to cca takto…predvedu na jednom tlacitku…
t1 movlw 0x0C ;nacti kombinaci do stradace
subwf zak5,w ;odecti registr od stradace
btfss zero ;porovnej jestli je nula
goto t2 ;kdyz ne tak jdi dál
movlw 0x0F ;nacti kombinaci do stradace
subwf zak6,w ;odecti registr od stradace
btfss zero ;porovnej jestli je nula
goto t2 ;kdyz ne tak jdi dál
call cti ;podprogram pro cteni z eeprom
bank0
bcf status,5
bcf status,6
movwf txreg
return
cti movlw d'8'
c call ctii
movwf txreg
incf eadr,f
subwf eadr, w
btfss zero
goto c
e return
ctii bank3
bsf status,5
bsf status,6
bsf eecon1,0
bank2
bcf status,5
bsf status,6
movf eedata,w
bank0
bcf status,5
bcf status,6
return
Když si tlačítku 1 - 17 přiřadíš čísla 0 - 16, pak to vynásobíš x8, budeš mít přímo adresu pro EEPROM, vyčti z ní 8x data do 8 registrů které pak 8x po sobě pošleš přes txreg do serivé linky. Nebo pomocí smyčky s využitím FSR a INDF, to jde i s EEPROM.
Nebo to můžeš ve smyčce číst z EEPROM a hned to poslat 8x po sobě.
Tento zápis musí stačit.
Po zapsání do registru TXREG dojde k automatickému odesílání dat. Musí jen počkat na jeho dokončení PIR1.TXIF až bude v log1 může zapsat další.
Je to stejné jako u I2C (tu znáš), akorát tam zapisuješ data do SSPBUF.
movf Tlacitko,w ;cilso tlacitka do W 0-16
movwf TMP1 ;presun do reg pro nasobeni x8
call NASOB8 ; Tlacitko x * 8 = adresa w EEP
call Nacti_a_posli
goto START
Nacti_a_posli
banksel EEADR ; vyber banky
MOVwF EEADR ; Data Memory Address
banksel TMP0 ; vyber banky
movlw .8
movwf TMP0 ; pocet cyklu k nacteni a odeslani
Nacti_a_posli_1
call Cteni_EPP ;precti data z EPP
banksel TXREG
movwf TXREG ;data jsou v W,tak presun do odesilaciho regu
banksel PIR1 ; vyber banky
btfss PIR1,TXIF ; pocka na odeslani
goto $-1 ; neni hotovo
Hraju si s tím teď už asi týden a skoro to znám na spaměť, proto ty reakce.
Jasně nikdo není dokonalý ani já ne, jen že to zrovna vím. Za týden už bych asi taky hledal v datasheetu.
Edit: koukám že jsi zrušil i čekání na odeslání… proč ?
Tak úplně jinak. Teď nemusím na nic čekat a čeká se jen na TXIF, který se nastavuje po odeslání. Čekat na oba dva příznaky by nemuselo fungovat.
Znám s I2C a určitě v tom nebude velkej rozdíl. Sice jde o I2C,ale taky jsem kdysi čekal na “všechny” možné příznaky a dělalo to pěknej bordel. Nakonec jsem zjistil, že stačí čekat na xyIF a funguje to dobře. Sice to neřeší kolize, multimaster, ale ten jsem ještě neměl možnost řešit, tak mi to stačí s IFama
btfsc TXSTA,TSR ; pockat na odeslani
goto $-1 ; jeste ne? NE,tak pockej
Na co testovat dva, když stačí jeden TXIF. Že nejde nulovat TXIF, jsem se dočetl až v datasheetu. Zase jsem o něco chytřejší
Správně by mělo být TXSTA.TRMT, ale to je jedno. Toho jsem si zase nevšiml já, že to tam máš. Hlavně aby se chlapec ozval, jestli mu to od tebe chodí. Taky bych mu to napsal, ale v asm už asi ne.