PIC16F877A a PIC16F627A zlobí UART

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
walleyman
Příspěvky: 35
Registrován: 27 kvě 2008, 00:00
Bydliště: Jičín

PIC16F877A a PIC16F627A zlobí UART

#1 Příspěvek od walleyman »

Zdravím, nedaří se mi rozchodit komunikaci mezi těmito dvěma procesory, dle následujících zdrojáků, mám vyzkoušeno, že normálně UART funguje, ovšem když použiju tyto kódy, tak nic. Jedná se o obousměrnou komunikaci, kde se posílají data z AD prevodu, 16f627 vyšle číslo kanálu, pic16f877 přijme, provede příslušný ad převod a odešle dva Byty informací. Ty 16f627 přijme a uloží do paměti. Toto funguje, pouze když se ptám jen na jeden kanál. Když chci přenášet více kanálů za sebou, oba dva procesory jakoby umřou ... mohl by se někdo prosím kouknout na zdrojáky a poradit mi, kde je chyba ? Předem mockrát díky ...
Přílohy
MCU.zip
(2.32 KiB) Staženo 159 x
Uživatelský avatar
procesor
Příspěvky: 5286
Registrován: 02 říj 2009, 00:00
Bydliště: PO

#2 Příspěvek od procesor »

Pre zápisom do TXREG testovať TXIF
Toto nie je zaujímave

Kód: Vybrat vše

      BTFSS    TXSTA,1
Uživatelský avatar
walleyman
Příspěvky: 35
Registrován: 27 kvě 2008, 00:00
Bydliště: Jičín

#3 Příspěvek od walleyman »

Před zápisem do TXREG testovat TXIF ? vždyť TXIF je v 1 dokud není TXREG přepsáno ... takhle to stojí v datasheetu. Když bych nejdříve testoval TXIF, tak se nikam nedostanu, jelikož TXIF bude pořád v 1.
Uživatelský avatar
procesor
Příspěvky: 5286
Registrován: 02 říj 2009, 00:00
Bydliště: PO

#4 Příspěvek od procesor »

Ak je TXIF=1 môžeš zapísať do TXREG. Okamžite TXIF padne. Opäť sa nastaví ak je TXREG prázdny a môžeš ho až potom naplniť.
TXREG sa automaticky prepisuje do vysielacieho po odvysielaní celého rámca t.j aj stopbitov.

Test na TMRT bit by bol dobrý iba ak pri ukončovaní (zákaz prenosu TXEN=0), aby sa neodstrihli posledné bity.

Je logické, že na riadenie prenosov postačujú RCIF, a TXIF.
Naposledy upravil(a) procesor dne 24 led 2011, 18:25, celkem upraveno 1 x.
Uživatelský avatar
walleyman
Příspěvky: 35
Registrován: 27 kvě 2008, 00:00
Bydliště: Jičín

#5 Příspěvek od walleyman »

EDIT: testování TRMT jsem úplně nahradil testováním TXIF pořád nic ... přikládám aktuální zdrojáky
Přílohy
mcu2.zip
(2.11 KiB) Staženo 160 x
Uživatelský avatar
walleyman
Příspěvky: 35
Registrován: 27 kvě 2008, 00:00
Bydliště: Jičín

#6 Příspěvek od walleyman »

JJ, to dává smysl, jenže v mém případě beze změny .... po zapnutí proběhne serie dat, ty mi 16F877 zobrazí na LED a oba procesory umřou, RX, TX permanentně v 1, (mám to vytáhnuté na osciláku)
Uživatelský avatar
Atlan
Příspěvky: 4514
Registrován: 10 kvě 2004, 00:00
Bydliště: Košice

#7 Příspěvek od Atlan »

nechces si tam dat aj nejake casove odstupy....namiesto toho ze vsetko hned vysielas zarardom....
Uživatelský avatar
walleyman
Příspěvky: 35
Registrován: 27 kvě 2008, 00:00
Bydliště: Jičín

#8 Příspěvek od walleyman »

já měl za to, že zpožďovací smyčka před AD převodem by měla stačit ( 750us) ale zkusím mezi jednotlivé vysílání vložit třeba 1ms delay ... myslim, že jsem to už dokonce zkoušel, ale náhoda je blbec ... a já nejspíš taky, jelikož to bude tradičně v nějaký kravině ....
Uživatelský avatar
procesor
Příspěvky: 5286
Registrován: 02 říj 2009, 00:00
Bydliště: PO

#9 Příspěvek od procesor »

Po reštarte by sa mohli procesory navzájom zosynchronizovať. Na to nestačí sledovať bit povelu. Ja používam napríklad 0X55 a odpoveď 0XAA, aby bolo jasné obom stranám,že sú ready.
Potom nasleduje povel a odpoveď. Príjem musí mať kontrolu FERR a OVERR pre prípad poruchy, a obnoviť prijímač na oboch stranách


Vyzývateľ (627) po pretečení nejakého času bez odozvy by mal zopakovať prenos-povel (kanál), alebo zahájiť opäť proces synchronizácie.

V tomto tvojom systéme, ak nastane na ktorejkoľvek strane k chybe, tak sa to zatne.
Uživatelský avatar
procesor
Příspěvky: 5286
Registrován: 02 říj 2009, 00:00
Bydliště: PO

#10 Příspěvek od procesor »

To si nepochopil dobre.
Test TXIF sa robí pred zápisom do TXREG

Aby sa to ako tak rozbehlo 627 musí začať vysielať keď 877 je už po inicializácii. To zaistí to čo som písal skôr.
Uživatelský avatar
walleyman
Příspěvky: 35
Registrován: 27 kvě 2008, 00:00
Bydliště: Jičín

#11 Příspěvek od walleyman »

to si myslím, že bude asi můj problém, jelikož po vložení několika čekacích smyček se přenos jednou za několik resetů rozběhne, ovšem pouze na cca +- 5s a pak zase umře .. takže problé bude nejspíše ve výše zmiňované synchronizaci, zkusím to tedy ošetřit ... uvidím co z toho vypadne
Uživatelský avatar
Atlan
Příspěvky: 4514
Registrován: 10 kvě 2004, 00:00
Bydliště: Košice

#12 Příspěvek od Atlan »

no ked som podobne nieco riesil softverovo.... tak jeden procesor nabehol skor ako druhy to znamenalo ze jeedn pin sa nahodil skor a druhy procesor to povazoval za zaciatok prenosu...a ked zacal skutocny prenos bolo tam o jeden bit viacej a nechodilo to.....

Cize si pozru ako mas nasatvene porty..aby nedochadzalo k nejakemu kvazi startu i ked pri hardw implementacii to asi nehrozi...
Uživatelský avatar
procesor
Příspěvky: 5286
Registrován: 02 říj 2009, 00:00
Bydliště: PO

#13 Příspěvek od procesor »

Prijímače musia stále sledovať RCSTA bity FERR a OERR. Musia ich opraviť, lebo prijimač sa pri poruche automaticky zatne. Postup je v popise PICka
Až potom sa sleduje RCIF.

Pred vyslaním prvého povelu je dobré len tak bez ukladania prečítať 2x RCREG, lebo do registru sa pri zapínaní a inicializácii druhej strany môžu dostať nejaké falošné data. Tým sa vynuluje FIFO. Inak sa stane to, že vyčítané údaje budú posunuté o jeden alebo aj dva byty.
Uživatelský avatar
walleyman
Příspěvky: 35
Registrován: 27 kvě 2008, 00:00
Bydliště: Jičín

#14 Příspěvek od walleyman »

Tak 877 už mám, ještě dodělám 627, uvidím co to bude dělat ... přikádám zatím novej zdroják ... pro 877 ( obsahuje test na chyby příjmu, jejich vynulování, synchronizaci)
Přílohy
16f877.asm
(5.54 KiB) Staženo 196 x
Uživatelský avatar
procesor
Příspěvky: 5286
Registrován: 02 říj 2009, 00:00
Bydliště: PO

#15 Příspěvek od procesor »

Na môj vkus zložito porovnávaš prijatý znak na konštantu

Kód: Vybrat vše

MENU   
      MOVLW   0X55
      SUBWF   VYBER,0           ;porovnaj  ak W==VYBER>je zero v STATUS
      BTFSC       STATUS,Z       ; Zero indikator
      GOTO   SYNCHRO        ; nie call treba odpovedat 0xAA a ide START
      MOVLW   B'00000001'
      SUBWF   VYBER,0
      BTFSS       STATUS,Z
      GOTO   PRENOSK0
      MOVLW   B'00000010'
      SUBWF   VYBER,0
      BTFSS       STATUS,Z
      GOTO   PRENOSK1
      GOTO   START


Kedykoľvej sa prijme "synchro" znak odošle sa odpoveď a bude sa čakať nový povel.

Kód: Vybrat vše

SYNCHRO                     ;SYNCHRONIZACE (POSLI ZPET 0xAA) (POKUD 0x55 PRIJATO A BEZ CHYB)

      BTFSS   PIR1,TXIF         ;TESTOVANI  ABYCHOM SI TXREG NEPREPSALI
      GOTO   $-1            ;


      MOVLW   0xAA
      MOVWF   TXREG
      
      GOTO       START     ; bude sa cakat odznova povel alebo synchro


Pri vysielaní sa počká na prázdny TXREG

Kód: Vybrat vše

VYSILEJL
      BSF      STATUS,RP0      ;BANKA1   (ADRESL JE V BANCE 1 !!! )      
      MOVF   ADRESL,W      ;do W je ulozena informace a MCU ji nasledne odesila pres UART ven
      BCF      STATUS,RP0      ;BANKA0

      BTFSS   PIR1,TXIF         ;TESTOVANI  ABYCHOM SI TXREG NEPREPSALI
      GOTO   $-1         ;

      MOVWF    TXREG          ;presunout 8-bit hodnotu do
registru TXREG (Bank0) => nacteni dat zacina vysilani


;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

VYSILEJH      
      MOVF   ADRESH,W      ;do W je ulozena informace a MCU ji nasledne odesila pres UART ven

      BTFSS   PIR1,TXIF         ;TESTOVANI ABYCHOM SI TXREG NEPREPSALI  vždy pred zápisom !
      GOTO   $-1         ;

      MOVWF    TXREG          ;presunout 8-bit hodnotu do registru TXREG (Bank0) => nacteni dat zacina vysilani

      RETURN
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“