Stránka 1 z 1

PIC - RS323 - ztráta komunikace - ošetření programu

Napsal: 30 črc 2008, 17:42
od Jirka
Pro komunikaci PIC16F628A přes RS232 s připojeným zařízením používám tuto rutinu http://www.piclist.com/techref/microchi ... RTtest.htm .
Má ale takový háček. Pokud je připojené zařízení nedostupné (off-line, vypnuté) a procesor odešle dotaz do zařízení, marně čeká na odpověď, a program (procesor) vytuhne.

Jak jednoduše ošetřit, aby, např. po dvou vteřinách, co marně čeká na odpověď, procesor signalizoval chybu připojeného zařízení a dále pokračoval ve své činnosti?

Napsal: 30 črc 2008, 18:11
od ZdenekHQ
Přidej do čekací RX smyčky čítač a čekací smyčku tak, aby se čítač incrementoval např. po 1ms. Po přetečení nastavit nějakej bit a "return".

V principu je to blbě, tohle se má řešit přes přerušení, buffer a jeho vyhodnocení po každým příjmu znaku. Hlavní program ať si mezi tím dělá, co chce. I kdyby měl jenom čekat na správnej obsah bufferu.

Napsal: 30 črc 2008, 18:17
od ZdenekHQ
Mimochodem - dobrý je,když dalším časovačem se maže celej buffer, pokud nepřijde další znak do x milisekund a samozřejmě smazat buffer po přijmutí kompletní odpovědi.

Napsal: 30 črc 2008, 18:19
od Kado
Mozes to spravit tak, ze pouzijes prerusenie od casovaca, pricom pri odoslani spravy do pc zapnes casovac, pricom cakas az napocita do definovanej hodnoty, kt. signalizuje chybu.
takto: v preruseni od c/c inkrementujes premennu (napr. prerusenie kazdych 0,1sec)
v rutine "receive" hned na zaciatku testujes premennu ci nedosiahla (alebo nie je vacsia) ako dana hodnota /napr. cakanie 2sec a prerusenie kazdych 0,1sec je to hodnota #20) ak nedosiahla premenna danu hodnotu, tak citas priznak (neviem co to je u PIC, asi priznak plneho prijim. registra), potom skok na receive a zasa test nasej premennej, a ak dosiahla stanovenu hodnotu resp. prekrocila, tak skok na nejake navestie "receive_error", kde vypnes casovac a vypises spravu, ze time_out err (alebo nieco podobne) a opustis rutinu.
EDIT:uz ma predbehli

Napsal: 30 črc 2008, 18:25
od Jirka
[quote="ZdenekHQ"][/quote]
Takže myslíš tady do kódu vložit ten čítač a vyhodnocovat ho?

Kód: Vybrat vše

; -------------------------------------------
; RECEIVE CHARACTER FROM RS232 AND STORE IN W
; -------------------------------------------
; This routine does not return until a character is received.
;
receive btfss PIR1,RCIF         ; (5) check for received data

            ; SEM VLOŽIT ČÍTAČ

        goto Receive

        movf RCREG,W            ; save received data in W
        return
;
; -------------------------------------------------------------

Napsal: 30 črc 2008, 18:37
od Jirka
[quote="Kado"][/quote]
Asi to chápu, to je v podstatě stejný, jak psal ZdenekHQ

Zkusím se s tím poprat...

Napsal: 30 črc 2008, 18:48
od ZdenekHQ
Já jsem zvyklej na Atmel, takže s asm z PIC mám trošku problémy.. Ale myslím, že ano, dáš tam incrementaci čítače + vložíš čekací smyčku, abys nemusel při rychlosti procesoru čítat moc velký čísla. Ale jde to i přes ten čítač v přerušení, volanej např. po 1ms a nulovanej po příjmu znaku.

Tu popsanou metodu jsem použil na průmyslové mašině s komunikací MODBUS, trápili to, čím se dalo a měli 0 procent chyb. Ovšem tam se používá CRC, i když např. při délce zprávy 3 byty a 2-bytovém CRC jsem našel kolizi dat...

EDIT : Teď jsem se na to mrkl ještě jednou - důležitý je, aby součástí smyčky bylo jak vyhodnocení příjmu znaku, tak ten čítač ! Tady se mě to nějak nezdá...

Napsal: 30 črc 2008, 19:08
od Marie Fùrie
Já to vìtšinou øeším pomocí hw èasovaèe, nastavím ho tøeba na 20ms a v pøerušení inkrementuju promìnnou (bez pøetékání). Napø. 8bit promìnná mi dá nìco pøes 5s. Kdykoliv pak potøebuji ošetøit timeout, promìnnou vynuluji a pak ji testuji na potøebnou hodnotu (tøeba 100 pro 2s).