Newsgroup: it.comp.lang.c
Titolo: programmare pic in c.

salve a tutti, sto coninciando a studidare le pic e la loro
programmazione.
ho realizzato un piccolo progettino: due componenti, un trasmettitore e
un ricevitore.
il trasmettitore ha 4 tasti e a seconda del tasto che premo invia un
messaggio seriale al ricevitore che decodifica il messaggio  e accende
il led corrispondente.
per programmare i pic ho utilizzato il compilatore c mikroC.
è la prima volta che mi occupo della serializzazione, ho cercato di
costruire un piccolo algoritmo e, guardandolo e riguardandolo, sembra
che tutto vada bene ma i due pic non comunicano e non riesco a capire
il perchè.
di seguito i sorgenti (spero che qualcuno possa darmi una mano)
======================= TX =================================
/*
nome programma.: tx.c
autore.........: Danilo Rossi
data...........: 7/2/2006
compilatore....: mikroC 2.0.0.1
descrizione....: trasmettitore per il controllo di
...............: un robot
*/
void main(void)
{
 // la valorizzazione del registro CMCOM col numero
 // 7 mi serve per poter utilizzare tutti gli RAcome input
 CMCON=7;
 PORTA=0x00;
 PORTB=0x00;
 TRISA=0xff; // ra input
 TRISB=0x00; // rb output
 while(1)
 {
  // se la combinazione degli racorrisponde ad una conosciuta
  // invio il messaggio seriale all'rx per muovere il robot
  // altrimento spengo tutti gli out della pic (led compresi)
  switch(PORTA)
  {
   case 0b00000001: // avanti
   case 0b00000010: // indietro
   case 0b00000100: // destra
   case 0b00001000: // sinistra
   	 // a seconda del parametro LED passato alla funzione
		 // accendo uno dei led connessi nei 4 bit meno
		 // significativi del portb (rb0, rb1, rb2, rb3)
		 PORTB.F0=PORTA.F0;
		 PORTB.F1=PORTA.F1;
		 PORTB.F2=PORTA.F2;
		 PORTB.F3=PORTA.F3;
		 // trasmetto il bit di start, utilizzo un delay di 833
		 // microsecondi. questo significa che la trasmissione
		 // avviene ad una velocità di 1200 b/s
		 PORTB.F7=0b10000000;
		 Delay_ms(1);
		 // trasmetto il messaggio serializzato
		 PORTB.F7=PORTA.F0;
		 Delay_ms(1);
		 PORTB.F7=PORTA.F1;
		 Delay_ms(1);
		 PORTB.F7=PORTA.F2;
		 Delay_ms(1);
		 PORTB.F7=PORTA.F3;
		 Delay_ms(1);
		 PORTB.F7=PORTA.F4;
		 Delay_ms(1);
		 PORTB.F7=PORTA.F5;
		 Delay_ms(1);
		 PORTB.F7=PORTA.F6;
		 Delay_ms(1);
		 PORTB.F7=PORTA.F7;
		 Delay_ms(1);
		 // trasmetto il bit di stop,utilizzo un lungo
		 // periodo di delay per favorire la sincronizzazione
		 // dei due micro controllri
		 PORTB.F7=0b00000000;
		 Delay_ms(3);
		 break;
   default:
           PORTB=0x00;
  }
 }
}
======================= RX =================================
/*
nome programma.: rx.c
autore.........: Danilo Rossi
data...........: 7/2/2006
compilatore....: mikroC 2.0.0.1
descrizione....: ricevitore per il controllo di
...............: un robot
*/
// la variabile contiene il messaggio ricevutos
unsigned char DATO;
void main(void)
{
 // la valorizzazione del registro CMCOM col numero
 // 7 mi serve per poter utilizzare tutti gli RAcome input
 CMCON=7;
 PORTA=0x00;
 PORTB=0x00;
 TRISA=0xff; // ra input
 TRISB=0x00; // rb output
 while(1)
 {
  // se ra0 viene assume il livello logico 1
  // inizia la ricezione del messaggio
  // altrimenti fermo i motori
  if(PORTA.F0)
  {
	 // attendo il tempo di un bite mezzo per
	 // effettuare la lettura esattamente nel
	 // momento centrale di trasmissione
	 Delay_us(1500);
	 // ricevo i bit ad uno ad uno
	 DATO.F7=PORTA.F0;
	 Delay_ms(1);
	 DATO.F6=PORTA.F0;
	 Delay_ms(1);
	 DATO.F5=PORTA.F0;
	 Delay_ms(1);
	 DATO.F4=PORTA.F0;
	 Delay_ms(1);
	 DATO.F3=PORTA.F0;
	 Delay_ms(1);
	 DATO.F2=PORTA.F0;
	 Delay_ms(1);
	 DATO.F1=PORTA.F0;
	 Delay_ms(1);
	 DATO.F0=PORTA.F0;
	 Delay_ms(1);
	 // i motori funzionano in questo modo
	 // xx xx XXXX -> i 4 bit piu significativi
	 // (x)corrispondono ai motori posti sui due lati
	 // del robot, i primi due del lato destro, gli altri due
	 // del lato sinistro.
	 // con la combinazione 10 il motore va avanti
	 // con la combinazione 01 il motore va indietro
	 // i quattro bit meno significativi vengono ignorati
	 switch(DATO)
	 {
	 case 0b00000001: //AVANTI
	      PORTB=0b10101111;
	      break;
	 case 0b00000010: //INDIETRO
	      PORTB=0b01011111;
	      break;
	 case 0b00000100: //DESTRA
	      PORTB=0b10011111;
	      break;
	 case 0b00001000: //SINISTRA
	      PORTB=0b01101111;
	      break;
	 default:
	      PORTB=0xff;
	      break;
	 }	 
  }
  else
   PORTB=0xff;
 }
}

ReDDy ha scritto:

Nei vari sorgenti non vedo il settaggio della frequenza del quarzo che
utilizzi nel progettino... ora non so se sia definita da qualche altra
parte, ma incomincerei a dare una occhiata a questo...
Bye Dave.

ho risolto.^_^ cmq non è necessario settare il clock perchè ne ho
utilizzato uno esterno. adesso funziona tutto. tnx :))

 
Saresti gentile da comunicarci anche qual'era il fattaccio ?
Sarebbe bello che se oltre a porre la domanda, e a dirci "ho risolto", 
ci dicessi anche il come tu abbia fatto e da cosa era dovuto
grazie, ciao