Vizitator stefana Postat Mai 9, 2011 Partajează Postat Mai 9, 2011 BunaAm o problema de comunicare cu PIC ul. Folosesc un PIC 18f4520 si vreau sa ii trimit valori de la 0 la 255, adik eu trimit unsigned char. Problema mea e ca toate functiile de get folosesc char si daca trimit 200 nu il mai citeste bine. Intrebare e ar trebui atunci sa trimit 2 octeti in loc de unul? sau cum s-ar putea receptiona unsigned char in loc de char? sunt incepatoare in programare de picuri dar ma gandesc ca as putea sa incerc sa citesc bit cu bit si sa imi construiesc eu numarul dar nu mi se pare o solutie chiar stralucita. Multumesc,Stefana Link spre comentariu
MatyC Postat Mai 9, 2011 Partajează Postat Mai 9, 2011 Si cum anume comunici cu PIC-ul? Prin PC cu programe tip terminal sau program dedicat. Ca prin HyperTerminal daca trimiti val 200 el o trimite ca ASCII adica 3 octeti 0x32 0x30 0x30 plus caracterele CR si LF. Am pierdut ceva timp sa inteleg ca "char" in limbaj C nu e tot una cu "char" de la character alfanumeric.Eu folosesc programe de comunicatie seriala pe PC care permit sa le spun clar ce transmit hex sau ascii. Link spre comentariu
Liviu M Postat Mai 9, 2011 Partajează Postat Mai 9, 2011 Eu mi-am scris singur rutinele de citire de pe seriala. N-a fost chiar asa greu si fac ce-mi trebuie mie, nu ce a vrut cel care a scris functia. Citirea propriuzisa o fac in isr.c (tratare intreruperi) interrupt isr(void){ ... if(RCIF) /*comunicatie seriala*/ { bRxInt = 1; //variabila care-mi semnalizeaza date noi pe seriala if(ucGlIdx >= 16) // max 16 caractere ucGlIdx = 0; if(RCREG != 'c') // caractere diferite de 'c', { ucComBuf[ucGlIdx] = RCREG; //ucComBuf[]= variabila globala in care memorez datele. ucGlIdx++; bTxStart = 0; } else // cu 'c' pornesc transmisia (pic->pc) bTxStart = 1; } } In programul principal am o secventa de genul /**************************************** Receptie/Transmisie seriala; cea mai mare parete a actiunii e in isr.c; ar trebui revazut*************************************/ if (bRxInt) /*** intrerupere generata de interfata seriala */ { if(bTxStart == 0) //receptie { ucMaxActionari1 = ucComBuf[7] & 0x0F; ucMaxActionari2 = (ucComBuf[7] & 0xF0) >>4; eeprom_write(ucEePhAddress,ucComBuf[8]); eeprom_write(ucEePhAddress+1,ucComBuf[8+1]); eeprom_write(ucEePhAddress+2,ucComBuf[8+2]); eeprom_write(ucEePhAddress+3,ucComBuf[8+3]); } else //transmisie { TXSTA = 0b00100100; // activeaza transmisia. !!Atentie!! Nu merge cu BITSET(TXSTA, TXEN); !! TXREG = ucComBuf[3]; DelayMs(5); TXREG = ucComBuf[4]; DelayMs(5); TXREG = ucComBuf[5]; DelayMs(5); TXREG = ucComBuf[6]; DelayMs(5); TXREG = ucComBuf[7]; DelayMs(5); TXREG = ucComBuf[8]; DelayMs(5); TXREG = ucComBuf[9]; DelayMs(5); TXREG = ucComBuf[10]; DelayMs(5); TXREG = ucComBuf[11]; DelayMs(5); TXREG = ucComBuf[12]; DelayMs(5); TXREG = ucComBuf[13]; DelayMs(5); TXREG = ucComBuf[14]; DelayMs(5); TXREG = ucComBuf[15]; DelayMs(5); TXSTA = 0b00000100; // dezactiveaza transmisia. } bRxInt = 0; bTxStart = 0; } // if (bRxInt) si partea de initializare arata cam ca mai jos, da' nu sunt sigur ca am copiat tot // TXSTA = 0b00100100; /***** Usart Code **** * High speed baud rate generator enabled * Usart in Asynchronous mode * Usart transmission enabled * TX in eight bit format */ TXSTA = 0b00000100; /* * Usart reception enabled * RX in eight bit format * Usart module enabled * continous mode (bit4=1), altfel nu merge */ RCSTA = 0b10010000;// RC6 TX, RC7 RX TRISC = 0b10000000; /* RX - input, all other outputs*/ PORTC = 0b11111111; Probabil nu-i cel mai "frumos" si optim cod, da' la mine functioneaza cu un 18f452. Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum