USART s přerušením mezi 2x PIC16F648A - příklad programu

Zdravim Vas,

mam na Vas dotaz ohledne USARTu. Mam 2 MCU (pic16f648a) a chtel bych se naucit synchronni seriovou komunikaci. Z datasheetu jsem vycetl nejaka moudra, ktera ale nejak nefunguji. Naprogramoval jsem zatim jen Mastera TX a po odeslani dat, ktere nacpu do registru TXREG by se melo vyvolat preruseni, ale nevyvola viz. kod.
Jeste dodam, ze ty piny co se pouzivaji na komunikaci nejsou zapojene. Slo mi jen o to otestovat, zda se ty data odeslou a vyhodi se preruseni.

:arrow_right: administrator: přejmenováno z “2x PIC16F648A - USART”
usart.txt (1.07 KB)

Vzhledem k tomu, ze jeste nikdo neodpovedel, tak bych to zkusil vzit z jineho konce a to tak, zda jsem podle datasheetu spravne pochopil jak se nastavi MCU do rezimu TX Synchronous Master Mode. Na strane 84 je napsane:

No a nasledne bych to naprogramoval takto:

void main(void) {
 TRISB1 = 1;
 TRISB2 = 1; 
 SYNC = 1;
 BRGH = 0; 
 SPBRG = 103; // 9600 KBAUD
 CSRC = 1;
 SPEN = 1;
 TXIE = 1;
 TXEN = 1;
}

Takto jsem to pochopil, ze bych mel stavit registry, je to tak? No o podle posledniho 8. bodu staci do registru TXREG ulozit byte, ktery se asi automaticky odesle, ale v tomto si nejsem jisty.

Mohl by mi nekdo vysvetlit, jak je mozne, ze toto vyvola preruseni (cemuz rozumim):

void main(void) {
 GIE = 1;
 T0IE = 1;
 T0IF = 1;
}

Ale toto nikoliv a pritom je to v podstate to same:

void main(void) {
 GIE = 1;
 TXIE = 1;
 TXIF = 1;
}

Ono to stejne nebude v tom tvem zapisu s X nebude vedet co to je.
T0 znamena Casovac TMR0

Dale T0IE = 1; zde správne nastavujes povoleni preruseni
T0IF = 1; zde ale jde o priznak, ten bys mel naopak nulovat

Nee, ja vim co znamena to X. Jen se snazim umele vyvolat preruseni. Vim, ze flag musim nulovat, ale abych nemusel casovac zapinat, tak jsem to nastavil primo. Slo mi jen o to, aby ukazal, ze v pripade casovace preruseni nastavim a funguje, ale v pripade prenosu po seriove lince TXIF se nastavi zhdy kdyz se uvolni TXREG. Ale toto preruseni mi proste nefunguje.

A mas povolene i preruseni od periferii? Pod to spada to co pises.

Tak se mi to podarilo nakonec nejak rozchodit, ale tak nejak nevim jak a kdy mam presne pouzit ten TRMT. Ten by mel po zapsani dat do registru TXREG spadnout na 0 a pak po kompletnim odeslani dat nahodit na 1. Je to tak? Vyuzivate tento bit nejak?

Pozor na chybu v čipu. Jakakoliv zmena na TXEN a SPEN vynuluje TRISB:2 (coz je RX), ktery je potreba po teto instrukci znovu nastavit jako vstup. Teprve pote povolit USART jako takovy. Trapil jsem se tu s tim dobre dva dny… :-/

No já nevím, ale dle DS je na pinu RB2 TX.
Jinak toto téma je asi už rok a půl neaktivní.

To sice jo, ale zrovna tohle je docela užitečná informace… já to třeba nevěděl, a teď zrovna se mi to bude brzo hodit. Ještě by mě zajímalo, jestli se ta chyba týká jen toho 16F648A, nebo všech PIC16F (nebo nedejbože všech PIC :smiley: )…?