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?
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”.
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