PIC 16F88 - odesílání 8B paketů přes sériovou linku

Dobrej

Potrebuju helpnout s jednim programkem…

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!

:arrow_right: administrator: přejmenováno z "Pic 16F88 … seriova linka"

Zase nějaké školní cvičení že ? Takhle se nic nenaučíte když to za vás vyřeší někdo jiný.

nn pracuji na projektu…a nejak jsem se zasekl…potrebuju s nim trosku pomoct…

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ě.

podtreboval bych ten poslední způsob co tu zminujes…nad nim jsem uvazoval, ale nemohu to nejak udelat…nemuzes mi napsat zdrojak? dekuji

Tímhle posíláš data na seriovou linku? Nic víc? Se ptám, protože jsem se seriovou linkou nikdy nedělal.

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.

V MPLABu to jede,ale do svého programu si to už musíš vsunout sám. Není tam nastavení a INIT procesoru.
A nauč se používat soubor INCLUDE.

[code] cblock 0x20
TMP0
TMP1
Tlacitko ;cislo tlacitka 0 - 16
endc

org	0x00

START

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

banksel		EEADR		;vyber banky
incf		EEADR,f		;+1 
banksel		TMP0
decfsz		TMP0,f
goto		Nacti_a_posli_1	
return

NASOB8
movlw .7
movwf TMP0
movf TMP1,W ;*1
; ------------------------
addwf TMP1,F ; CISLO + CISLO -> CISLO
decfsz TMP0,F
goto $-2 ; TMP3 jeste neni 0
; ------------------------
movf TMP1,w
return
Cteni_EPP
; BANKSEL EEADR ; Select Bank of EEADR
; to read
BANKSEL EECON1 ; Select Bank of EECON1
BCF EECON1, EEPGD; Point to Data memory
BSF EECON1, RD ; EE Read
BANKSEL EEDATA ; Select Bank of EEDATA
MOVF EEDATA, W ; W = EEDATA
return
[/code]

Zase jsi mě předběhl :slight_smile::-):-):slight_smile:

Oprav si to, příznak TXIF nelze nulovat softwarově.

Opraveno. :smiley: :smiley: :smiley: Nikdo není dokonalý, ale stačí si přečíst datasheet, což se mi původně nechtělo :smiley: :smiley: :open_mouth:

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. :smiley:

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 :slight_smile:

Takhle jsi to měl i před tím ne ? akorát tam byl navíc řádek bcf PIR1.TXIF který je k ničemu, jaký druhý příznak máš na mysli.

Jinak takto nějak by to mělo fungovat.

Tehle myslím

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ší :smiley: :smiley:

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.

Teď nechápu, jak je možné, že mi to MPLAB přeložil s tím TSR. Ale jinak máš pravdu.

Měl jsi to napsat v C a pak sem hodit asm, docela by mě zajímalo, co by C vypotilo ze sebe :slight_smile::-):-):slight_smile:

EDIT: Tak s tím TSR mi to MPLAB nepřeložil. Asi jsem to přehlídnul. :frowning: :bulb:

S TXSTA,TRMT to už přeložit jde. Možná by to zdendii mohl pak zkusit, co bude lepší, stabilnejší a spolehlivější. Jestli TXIF nebo TRMT. nebo oba.

Navrhuji testovat jen PIR1.TXIF.

takze takhle je to oki? :slight_smile:) hned jak se dostanbu k programatoru tak zkusim…dik moc za ochotu