Problém s komunikací RS232

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

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
Viper_T
Příspěvky: 49
Registrován: 24 čer 2007, 00:00
Kontaktovat uživatele:

Problém s komunikací RS232

#1 Příspěvek od Viper_T »

Ahoj, dělám zapojení se dvěma pic komunikující s počítačem po RS232 rychlostí 115200 Baud, ale narazil jsem na problém. První mikrokontrolér je 12F675 pracuje na frekvenci 20MHz, přijímá data z počítače a odesílá je zpět a do druhého mikrokontroléru 12F508 s interním oscilátorem 4MHz. Komunikace mezi počítačem a 12F675 je bezproblémová, ale s 12F508 mám problémy(přece jenom u 4Mhz je to časování oproti 20Mhz složitější). Abych mohl sledovat co mikrokontrolér přijímá, dočasně jsem ho nahradil 12F675kou, nastavil interní oscilátor 4MHz a podle přijatých dat uložených v EEPROM jsem dotáhl podprogram pro příjem do funkčního stavu. Vše funguje bez problému, ale jakmile nahradím 12F675 12F508kou s naprosto stejným podprogramem, tak to nefunguje. Zkoušel jsem poslepu trochu měnit časování a určitých výsledů jsem dosáhl, ale je to velmi nespolehlivé. Čítač impulsů bohužel nemám takže nevím jak zjistit co to přímá(počítat blikání ledky mě už omrzelo :? ). Jak je možné že to nefunguje když by měli oba mikrokontroléry mít stejnou frekvenci 4MHz 8O ? Zkoušel jsem zaměnit 12F675 i 12F508 za jiný stejného typu, ale výsledek je pořád stejný. Nevíte čím by to mohlo být, případně jak to vyřešit?
Předem díky.

Pro jistotu přikládám i podprogram pro příjem dat:

Kód: Vybrat vše

RECEIVE               ;///////////////PRIJME DATA Z RS232 DO RDATA///
   BTFSS   RX
   GOTO   $-1
   NOP
   NOP
   NOP
   NOP
   NOP
   NOP
   NOP
   NOP
   NOP
   NOP

   BTFSS   RX         ;bit0
   BSF   RDATA,0
   BTFSC   RX
   BCF   RDATA,0

   NOP
   NOP
   NOP
   NOP
   NOP
   BTFSS   RX         ;bit1
   BSF   RDATA,1
   BTFSC   RX
   BCF   RDATA,1

   NOP
   NOP
   NOP
   NOP
   NOP
   BTFSS   RX         ;bit2
   BSF   RDATA,2
   BTFSC   RX
   BCF   RDATA,2

   NOP
   NOP
   NOP
   NOP
   NOP
   BTFSS   RX         ;bit3
   BSF   RDATA,3
   BTFSC   RX
   BCF   RDATA,3

   NOP

   NOP
   NOP
   NOP
   NOP
   NOP
   BTFSS   RX         ;bit4
   BSF   RDATA,4
   BTFSC   RX
   BCF   RDATA,4

   NOP
   NOP

   NOP
   NOP
   NOP
   NOP
   NOP
   BTFSS   RX         ;bit5
   BSF   RDATA,5
   BTFSC   RX
   BCF   RDATA,5

   NOP

   NOP
   NOP
   NOP
   NOP
   NOP
   BTFSS   RX         ;bit6
   BSF   RDATA,6
   BTFSC   RX
   BCF   RDATA,6

   NOP

   NOP
   NOP
   NOP
   NOP
   NOP

   BTFSS   RX         ;bit7
   BSF   RDATA,7
   BTFSC   RX
   BCF   RDATA,7

   BTFSC   RX
   GOTO   $-1
   RETLW 0
Uživatelský avatar
piitr
Příspěvky: 1003
Registrován: 19 říj 2007, 00:00
Kontaktovat uživatele:

#2 Příspěvek od piitr »

Proč máš na konci těsně před návratem to čekání na nulu? To může být problém. Počkáš až do dalšího start bitu, a než pak uklidíš a zpracuješ přijatý bajt a začneš číst nový, tak ti uteče začátek dalšího bajtu. Spíš bych na konci dal zase nějaké pevné zpoždění, abych měl jistotu, že jsem třeba někde uprostřed prvního stop bitu (abych v tomhle bajtu už neměl nulu), a pak bych hned skončil.
Uživatelský avatar
jankop
Příspěvky: 679
Registrován: 04 dub 2007, 00:00
Kontaktovat uživatele:

#3 Příspěvek od jankop »

Muslím, že to není čekání na nulu, ale stopbit. Vypadá to, že data vstupují v negaci. Ten algoritmus bych zjednodušil. Na začátku vynulovat RDATA a provádět test jenom na "LOW" a podle výsledku setovat patřičný bit.
Máš řádně ošetřenou kalibrační konstantu OSCCAL?
Nezapomínáš, že 12F508 má pouze dvouúrovňový stack!?
Uživatelský avatar
piitr
Příspěvky: 1003
Registrován: 19 říj 2007, 00:00
Kontaktovat uživatele:

#4 Příspěvek od piitr »

Aha, máš pravdu, je to negované.
Uživatelský avatar
jankop
Příspěvky: 679
Registrován: 04 dub 2007, 00:00
Kontaktovat uživatele:

#5 Příspěvek od jankop »

Podle mě se v algoritmu už nepotkává časování u koncových bitů 5-7.
Odchylka je značná.
Udělal bych to asi takhle:

Kód: Vybrat vše

RECEIVE               ;///////////////PRIJME DATA Z RS232 DO RDATA/// 
   clrf RDATA
   BTFSS   RX       ; 1
   GOTO   $-1       ; 2
   GOTO $+1         ; 4
   GOTO $+1         ; 6
   GOTO $+1         ; 8
   GOTO $+1         ; 10
   GOTO $+1         ; 12
   BTFSS   RX       ; 13  bit0
   BSF   RDATA,0    ; 14
   GOTO $+1         ; 16
   GOTO $+1         ; 18
   GOTO $+1         ; 20
   BTFSS   RX       ; 21  bit1
   BSF   RDATA,1    ; 22   
   GOTO $+1         ; 24
   GOTO $+1         ; 26
   GOTO $+1         ; 28
   NOP              ; 29
   BTFSS   RX       ; 30  bit2
   BSF   RDATA,2    ; 31
   GOTO $+1         ; 33
   GOTO $+1         ; 35
   GOTO $+1         ; 37
   NOP              ; 38   
   BTFSS   RX       ; 39  bit3
   BSF   RDATA,3    ; 40
   GOTO $+1         ; 42
   GOTO $+1         ; 44
   GOTO $+1         ; 46
   NOP              ; 47
   BTFSS   RX       ; 48  bit4
   BSF   RDATA,4    ; 49
   GOTO $+1         ; 51
   GOTO $+1         ; 53
   GOTO $+1         ; 55
   BTFSS   RX       ; 56  bit5
   BSF   RDATA,5    ; 57
   GOTO $+1         ; 59
   GOTO $+1         ; 61
   GOTO $+1         ; 63
   NOP              ; 64
   BTFSS   RX       ; 65  bit6
   BSF   RDATA,6    ; 66
   GOTO $+1         ; 68
   GOTO $+1         ; 70
   GOTO $+1         ; 72
   BTFSS   RX       ; 73  bit7
   BSF   RDATA,7    ; 74
   BTFSC   RX
   GOTO   $-1
   RETLW 0
Uživatelský avatar
Viper_T
Příspěvky: 49
Registrován: 24 čer 2007, 00:00
Kontaktovat uživatele:

#6 Příspěvek od Viper_T »

Díky za odpovědi.
Jankop: To mé časování opravdu nedává moc velký smysl, ale s 12f675 to funguje bez problému. Požil jsem tvůj program(mockrát díky) na 12F508 a částečně se to rozeběhlo , to samé jsem zkusil s 12F675 a nic :lol: . Do tvého programu jsem doplnil ještě jednu instrukci NOP za bit0 a bit5 a teď mi to šlape naprosto v pohodě. Podle tohoto případu to vypadá, že 12F675ky a 12F508ky mají jinou rychlost interního oscilátoru, to je ale asi pěkná blbost. Kalibraci oscilátoru myslím že dělám dobře(opravte mě jestli se mýlím)

12F508:

Kód: Vybrat vše

   ORG 00h
   MOVWF   OSCCAL


12F675:

Kód: Vybrat vše

   BSF   STATUS,RP0
   CALL   3FFh
   MOVWF   OSCCAL
   BCF   STATUS,RP0


Upravený Jankopův podprogram:

Kód: Vybrat vše

RECEIVE               ;///////////////PRIJME DATA Z RS232 DO RDATA///
   clrf RDATA
   BTFSS   RX       ; 1
   GOTO   $-1       ; 2
   GOTO $+1         ; 4
   GOTO $+1         ; 6
   GOTO $+1         ; 8
   GOTO $+1         ; 10
   GOTO $+1         ; 12
   BTFSS   RX       ; 13  bit0
   BSF   RDATA,0    ; 14
   GOTO $+1         ; 16
   GOTO $+1         ; 18
   GOTO $+1         ; 20
   NOP
   BTFSS   RX       ; 21  bit1
   BSF   RDATA,1    ; 22   
   GOTO $+1         ; 24
   GOTO $+1         ; 26
   GOTO $+1         ; 28
   NOP              ; 29
   BTFSS   RX       ; 30  bit2
   BSF   RDATA,2    ; 31
   GOTO $+1         ; 33
   GOTO $+1         ; 35
   GOTO $+1         ; 37
   NOP              ; 38   
   BTFSS   RX       ; 39  bit3
   BSF   RDATA,3    ; 40
   GOTO $+1         ; 42
   GOTO $+1         ; 44
   GOTO $+1         ; 46
   NOP              ; 47
   BTFSS   RX       ; 48  bit4
   BSF   RDATA,4    ; 49
   GOTO $+1         ; 51
   GOTO $+1         ; 53
   GOTO $+1         ; 55
   BTFSS   RX       ; 56  bit5
   BSF   RDATA,5    ; 57
   GOTO $+1         ; 59
   GOTO $+1         ; 61
   GOTO $+1         ; 63
   NOP              ; 64
   NOP
   BTFSS   RX       ; 65  bit6
   BSF   RDATA,6    ; 66
   GOTO $+1         ; 68
   GOTO $+1         ; 70
   GOTO $+1         ; 72
   BTFSS   RX       ; 73  bit7
   BSF   RDATA,7    ; 74
   BTFSC   RX
   GOTO   $-1
   RETLW 0
Odpovědět

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