Sari la conținut
ELFORUM - Forumul electronistilor

Comunicare cu Picul


Vizitator stefana

Postări Recomandate

Vizitator stefana

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
  • Răspunsuri 2
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Liviu M

    1

  • MatyC

    1

Zile populare

Top autori în acest subiect

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

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

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări