čtení několika bytů - USART

Potřebuju z jednoho procesoru do druhého přenést nějaká data, vyřešil jsem to tak, že hlavní procesor odešle jeden byt, ten když druhý přijme, tak hned zpátky odešle osm slov hned po sobě.
V programu je to tak že po odeslání bytu hned testuji příznak RCIF, jakmile se objeví jedna, uložim RCREG a čekám znovu na RCIF. Jenže to mi právě nefunguje, vždycky se to zaciklí hned při testování prvního bytu.
Tady je kousek toho programu:

preruseni movlw .100 movwf promena3 movf TXKONF,0 ;odeslání konfiguračního bytu movwf TXREG rxcek btfsc PIR1,RCIF ;čekání na příjem prvního bytu goto rxstart decfsz promena3 ;kdyby druhý procesor neodpověděl tak skonči po chvíli testování goto rxcek goto rxend rxstart movf RCREG,0 movwf TEMP2L rxcek1 btfss PIR1,RCIF ;tady se to zaciklí goto rxcek1 movf RCREG,0 movwf TEMP2H bcf PIR1,RCIF rxcek2 btfss PIR1,RCIF goto rxcek2 movf RCREG,0

S picama jsem začal nedavno tak možná že to řeším špatně, ale to mně napadlo jako nejjednoduší způsob. Bohužel nefunguje. Přiložím radši i celý program
Topeni.asm (28.1 KB)

Moc jsem to neprojížděl, protože vyznat se v status equ 0x03 trisa equ 0x05 porta equ 0x05 trisb equ 0x06 portb equ 0x06 trisc equ 0x07 portc equ 0x07 trisd equ 0x08 portd equ 0x08 rcreg equ 0x1A #define gie INTCON,7 #define peie INTCON,6 #define cd status,0
je hnus. Od nastavení regu a příznaků je tam #include <P16f877a.INC>. Nechápu, kdo vás tohle učí.

Ale k programu. Testuješ TMR0 a tam zbytečně čekáš na PIR1,RCIF. Udělej si přerušení od přijmutí dat přes UART. Bude to jednodušší. A musiš před dalším příjmem přečíst RCREG

Nulovat INTCON,GIE v přerušení nemusíš, v přerušení se o to stará procesor sám. A nemáš ošetřeny všechny potřebné regy v přerušení.

Že nemám program ideálně napsán vím, ale programování se věnuji dva měsíce po večerech.
Jen jsem podle datasheetu vyčet že bit RCIF by mněl být osazen 1 když modul usart dokončí příjem bytu, ale to mně právě nefunguje když ho testuji, zůstane pořád v nule. Asi to přepíšu a po každém příjmu ať to vyvolá přerušení. Jak to řešíte běžně v praxi když přijímáte víc slov za sebou?

Mužeš to řešit 2 způsoby.

  1. Pokud víš, že těch “slov” bude třeba pět, tak u prvího vyvoláš přerušení a pak uložíš postupně pět hodnot “někam”, vyskočíš s přerušení a obsloužíš přijatá “slova”.

  2. Když ty “slova” chodí pořád a pořád, tak si uděláš buffer, při každém příjmu uložíš hodnotu do bufferu pomocí FSR a v hlavním programu buffer čteš a posunuješ FSR.

Nebo obojí dohromady. Přerušení od příjmu, zapíšeš někam, návrat z přerušení, obsluha před skokem do přerušení … a zase přerušení od příjmu.

A jinak, máš ty procesory nastavené oba na stejnou rychlost? Jeden je 16F877A, druhej je jakej? Kdyby si sem hodil oba asm, mohl bych to zkusit.
A máš tam chybu, TRISC musí být 6 a 7 v 1, po zápisu do RCSTA se to nastaví samo podle potřeby. Stejně bych to viděl na chybu v nastavení UARTu.
V MPLABu se ti při simulaci RCIF nenastaví do 1.

zdravím mohl by mě někdo trochu poradit? Chci přijímat 3 byty posobě ale v časovém rozmezí tak 20milisekund posobě ale nevím jestli je vhodnější načítat data v přerušení nebo to řešit primo v hlavním programu

Já už jsem to vyřešil že hlavní procesor pošle jeden byt druhému, zároveň si nastaví pusuvný registr na začátek. Druhý procesor při příjmu vyvolá přerušení a hned v něm odešle osm bytů. Hlavní procesor ale nečeká a po každém příjmu si byt v přerušení uloží, posune registr a jede dál, při příjmu osmého si vynuluje registr a když potřebuje tak zas pošle jeden byt atd. Řešil jsem to asi týden a když se mi to povedlo tak jsem zkratoval výstup a teď čekám na nový obvod