home | area personale         schemi | tutorial | robotica | pic micro | recensioni         forum | chat irc         faq | contatti         store
username
password
cerca

 
FORUM: Pic Micro
Tutto quanto riguarda questi microprocessori... progetti, suggerimenti, aiuti, discussioni...ecc


PIC 18F4550 e CDC: unknown device
     
Autore Messaggio opzioni
SiLv3r





postato il:
22.05.2012, alle ore 01:24
Praticamente una volta ricevuta la stringa il pic deve provvedere a convertire in valore numerico i primi 3 bit dopo l'uguale stessa cosa per i bit dal sesto al decimo dopo l'uguale e dall undicesimo al penultimo. Una volta salvate queste informazioni si calcola tramite il passo angolare del motore il numero di step che lo
Stesso deve eseguire per ottenere lo spostamento
Angolare desiderato, quindi parte un ciclo For che a seconda del segno e del modo di pilotaggio scelto attiva un pin della porta del pic ( operazione che corrisponde all'alimentare uno degli avvolgimenti del motore) poi aspetta un tempo calcolato e accende un altro pin ( e quindi un altro avvolgimento)...una volta finita la sequenza la variabile c si azzera per far ripartire l'avviamento
Ciclico degli avvolgimenti fino a che nn si sono effettuati i passi necessari (n_step) a percorrere l'angolo.

Puoi spiegarmi cosa hai modificato del codice? Hai cambiato compilatore? Grazie per il tempo che mi' stai dedicando. Buona notte!
SiLv3r





postato il:
22.05.2012, alle ore 01:26
Ah dimenticavo il nella descrizione del messaggio ho usato solo lettere ma la stringa inviata sarà una cosa del tipo
P=360+W1.811500B
primok




una ogni 100 livelli
una ogni 10 livelli


postato il:
22.05.2012, alle ore 14:26
Il compilatore è sempre quello della CCS nel file.h avendo usato un quarzo da 4MHz, ho impostato in questo modo:

 #include <18F4550.h>

#fuses XTPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN
#use delay(clock=4000000)
#use fast_io(b)  


Lo guarderò con calma...stasera..

Saluti
Primok_V




Fatti non foste a viver come bruti, ma per seguir virtude e conoscenza.

Dante
SiLv3r





postato il:
22.05.2012, alle ore 14:40
Ti ringrazio sei molto disponibile, proverò anche io a fare qualche prova in serata, cambiando condensatore e quarzo e magari se riesco a trovarlo provando con un 18F2550.
SiLv3r





postato il:
23.05.2012, alle ore 19:07
Cambiato pic, stesso problema
:(
SiLv3r





postato il:
23.05.2012, alle ore 21:38
ho anche provato a usare la tua configurazione sostituendo il quarzo con uno da 4Mhz, ma nenache si accende il pic sto impazzendo
SiLv3r





postato il:
23.05.2012, alle ore 23:59
Ok sono riuscito a farlo andare (era la breadboard che dava i numeri), solo che ho sempre il solito problema della lentezza...
primok




una ogni 100 livelli
una ogni 10 livelli


postato il:
24.05.2012, alle ore 18:17
SiLv3r:
Ok sono riuscito a farlo andare (era la breadboard che dava i numeri), solo che ho sempre il solito problema della lentezza...


Ci sono diversi problemi.. sto guardando il codice con calma.
Ti dico alcuni problemi..intanto nella funzione lampeggia usi 2 argomenti, int ms ed int n poi passi 1000 e 10; ma int arriva massimo a 255 quindi il delay non va bene cioè non hai 1 sec ma molto meno.Poi all'interno delle funzioni usi sempre la variabile i che è anche globale ( si può fare ma è meglio evitare )
Cambia le lettere ecc... sono impegnato in questi giorni ma quando posso lo guardo perchè è un argomento che non ho trattato e quindi mi interessa...

Saluti
Primok_V



Fatti non foste a viver come bruti, ma per seguir virtude e conoscenza.

Dante
primok




una ogni 100 livelli
una ogni 10 livelli


postato il:
24.05.2012, alle ore 21:03
Come sospettavo..il problema riguarda il delay ,a condizione che tu abbia settato correttamente tutto il resto.

Ho aggiunto un delay_ms(1000) solo nella sola funzione

 void wavemode (float theta,char segno,int n_step,float delay)
{
int i, c=0, pattern[4];
if (segno=='+')
{
 pattern[0]=1;
 pattern[1]=2;
 pattern[2]=4;
 pattern[3]=8;
}
if(segno=='-')
{
 pattern[3]=1;
 pattern[2]=2;
 pattern[1]=4;
 pattern[0]=8;
}

for (i=0;i<n_step-1;i++)
{
   output_b(pattern[c]);
   delay_ms(ceil(delay));
   delay_ms(1000);
   c++;
   if (c==4)
      c=0;
}
}


dopo l'istruzione delay_ms(ceil(delay)); e questi sono i risultati



Sistema operativo :windows 7 64 bit
Interfaccia PC-Pic: hyperterminal
PIC usato 18F4550 ,quarzo esterno 12 MHZ ( ma anche 4 MHz va bene )

file.h

 #include <18F4550.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES PLL3                     //Divide By 3(12MHz oscillator input)
#FUSES CPUDIV1                  //No System Clock Postscaler
#FUSES USBDIV                   //USB clock source comes from PLL divide by 2
#FUSES HSPLL                   //High Speed Crystal/Resonator with PLL enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES PUT                    // Power Up Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES BORV20                   //Brownout reset at 2.0V
#FUSES VREGEN                   //USB voltage regulator enabled
#FUSES NOPBADEN  //PORTB pins are configured as analog input channels on RESET
#FUSES LPT1OSC                  //Timer1 configured for low-power operation
#FUSES MCLR                     //Master Clear pin enabled
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or 
#FUSES ICSP2                    //ICD uses PGC2/PGD2 pins
#FUSES NOXINST 
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOCPB                    //No Boot Block code protection
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTC                   //Configuration registers not write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOEBTRB                  //Boot block not protected from table reads



#use delay(clock=12000000) 


File.c

 #include "C:\Users\primok\Desktop\Progetti CCS\PIC 18F4550 e CDC3\PIC 18F4550 e CDC3.h"

 #include <math.h>
  #include <stdlib.h>
#include <usb_cdc.h> 

void lampeggia_led(int ms,int n);
void motordriver(float theta,char segno,char mode,float step_angle,float rpm);
void read_message(char buffer[], float &theta,float& step_angle,float& rpm);
void wavemode(float theta,char segno,int n_step,float delay);
void twophase(float theta,char segno,int n_step,float delay);
void halfstep(float theta,char segno,int n_step,float delay); 

int j=0;
char buffer[16],a;
float theta=0,step_angle=0,rpm=0;
char mode,segno; 
boolean ok=FALSE,ok1=FALSE;

void lampeggia_led()
{
int k=0;
    for(k=0;k<10;k++)
         {
           output_bit(PIN_A1,0);
             delay_ms(1000);
               output_bit(PIN_A1,1);
                 delay_ms(1000);
                 }
           }
           
           
void halfstep (float theta,char segno,int n_step,float delay)
{
int i=0, c=0, pattern[8];
if (segno=='+')
{
 pattern[0]=1;
 pattern[1]=3;
 pattern[2]=2;
 pattern[3]=6;
 pattern[4]=4;
 pattern[5]=12;
 pattern[6]=8;
 pattern[7]=9;
}
if(segno=='-')
{
 pattern[7]=1;
 pattern[6]=3;
 pattern[5]=2;
 pattern[4]=6;
 pattern[3]=4;
 pattern[2]=12;
 pattern[1]=8;
 pattern[0]=9;
}

for (i=0;i<n_step-1;i++)
{
   output_b(pattern[c]);
   delay_ms(delay);
   c++;
   if (c==8)
      c=0;



}           
void read_message(char *buffer[], float &theta,float& step_angle,float& rpm)
{
char temp[8];
int i,c=0;
for(i=2;i<5;i++)
       {
            temp[c]=buffer[i];
                  c++;
                  }
temp[c]='\0';
theta=atof(temp);

c=0;
for(i=7;i<10;i++)
{
temp[c]=buffer[i];
c++;
}
temp[c]='\0';
step_angle=atof(temp);

c=0;
for(i=10;i<15;i++)
{
temp[c]=buffer[i];
c++;
}
temp[c]='\0';
rpm=atof(temp);

}




void motordriver(float theta,char segno,char mode,float step_angle,float rpm)
{
float spr=0, rps=0, tpr=0,delay=0;
int n_step=0;
spr=360/step_angle;
rps=rpm/60;
tpr=1/rps;
delay=(tpr/spr)*1000;
n_step=abs(theta)/step_angle;
if(mode=='W')
wavemode(theta,segno,n_step,delay);
if(mode=='T')
twophase(theta,segno,n_step,delay);
if(mode=='H')
halfstep(theta,segno,2*n_step,delay/2);
}

void wavemode (float theta,char segno,int n_step,float delay)
{
int i, c=0, pattern[4];
if (segno=='+')
{
 pattern[0]=1;
 pattern[1]=2;
 pattern[2]=4;
 pattern[3]=8;
}
if(segno=='-')
{
 pattern[3]=1;
 pattern[2]=2;
 pattern[1]=4;
 pattern[0]=8;
}

for (i=0;i<n_step-1;i++)
{
   output_b(pattern[c]);
   delay_ms(ceil(delay));
   delay_ms(1000);
   c++;
   if (c==4)
      c=0;
}
}

void twophase (float theta,char segno,int n_step,float delay)
{
int i=0, c=0, pattern[4];
if (segno=='+')
{
 pattern[0]=3;
 pattern[1]=6;
 pattern[2]=12;
 pattern[3]=9;
}
if(segno=='-')
{
 pattern[3]=3;
 pattern[2]=6;
 pattern[1]=12;
 pattern[0]=9;
}
for (i=0;i<n_step-1;i++)
{
   output_b(pattern[c]);
   delay_ms(delay);
   c++;
   if (c==4)
      c=0;
}
}



void main()
{

   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_ccp1(CCP_OFF);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
      set_tris_a(0); //setta porta A come uscita
      output_a(0);
      set_tris_b(0);
      output_b(0); //setta porta B come uscita

      output_bit(PIN_A0,0); 
      output_bit(PIN_A1,0);


       lampeggia_led();// Lampeggia A1

       usb_cdc_init();
       usb_init();
       delay_ms(100); 

     output_bit(PIN_A1,0);// Si accende di nuovo dopo l'enumerazione
     delay_ms(1000); 
     output_bit(PIN_A0,1);

output_b(255);
delay_ms(1000);
output_b(0);
j=0;


while(TRUE)
{

 while(!usb_cdc_connected())
       {
          ok=0;
               }
          usb_task();

 

if(usb_enumerated())
{
   
 if(ok==0)
            {
              printf(usb_cdc_putc, "Connessione Ok.....\n\r");
                  printf(usb_cdc_putc, "Digitare il comando( MAX 16 caratteri ) e poi Enter..\n\r");
                         ok=1;                                
                               output_bit(PIN_A1,1);   
                                 }
                                         
   if( usb_cdc_kbhit() ) {  //Returns TRUE if there is one or more         
                              //character received and waiting in the receive buffer.
                 
                        buffer[j]=usb_cdc_getc();// memorizza il byte in a
                               if(ok1==TRUE)
                                  {
                                     j=0;
                                     ok1=FALSE;
                                       } 
                                    else
                                        j++;
                                 //  OUTPUT_B(j);
                         
             if((buffer[j-1]==(0x0D)))//SE l'ultimo carattere digitato è enter
                        {
                          if((j==17)&&(buffer[0]=='P')&&(buffer[1]=='=')&&(buffer[15]=='B'))
                                     {
                                         j=0;
                                           read_message(buffer[0],theta,step_angle,rpm);
                                              segno=buffer[5];
                                              mode=buffer[6];
                                              printf(usb_cdc_putc,"\n\r");
                                              printf(usb_cdc_putc,"Arrivato");
                                              ok1=TRUE;
                                              printf(usb_cdc_putc,"\n\r"); 
                                              motordriver(theta,segno,mode,step_angle,rpm);
                                             // delay_ms(1000);
                                              output_b(0);                                             
                                           //   output_bit(PIN_B7,0);  
                                            }
                               else   
                                               {
                                                   ok1=TRUE;                                               
                                                   printf(usb_cdc_putc,"\n\r");
                                                   printf(usb_cdc_putc, "Comando Errato..\n\r");           
                                                    
                                                         }                    
                        }
                        
                if(j>17)
                    {
                       ok1=TRUE; 
                         printf(usb_cdc_putc,"\n\r");
                           printf(usb_cdc_putc, "Comando Errato..\n\r");                    
                                                                     
                           }
                        
                                                 
                   
} // if(usb_enumerated())

}
}// fine while(TRUE)
}






Spiegazione
Alimentando il circuito, montato su breadboard , con il cavo USB
il led verde lampeggerà 10 volte, poi questo si spegne e si accende quello arancio in attesa di aprire hypertemninal.
Una volta avvenuta la connessione tra PC e pic ,in seguito alla apertura di hyperterminal,si accende fisso anche il led verde.Da questo momento è possibile digitare il comando di 16 caratteri come è suggerito sulla schermata di hyperterminal.
Se si digita un comando errato e si da enter, un messaggio avvisa che tale comando è sbagliato consentendo all'utente di rieditare il comando giusto.

Digitando il comando in modo corretto e dando enter, si vedeno accendersi i led relativi alle uscite B0..B3. In questo esempio verrà richiamata la funzione wavemode poichè nel comando si è digitata la lettera W.

Quello che devi fare è controllare la funzione delay_ms(ceil(delay)); che crea problemi oltre a settare bene i registri..buona fortuna.

Primok_V



Fatti non foste a viver come bruti, ma per seguir virtude e conoscenza.

Dante
primok




una ogni 100 livelli
una ogni 10 livelli


postato il:
24.05.2012, alle ore 21:06
spero che funzioni....

Primok_V



Fatti non foste a viver come bruti, ma per seguir virtude e conoscenza.

Dante
segui questo thread con grixFC, per questa funzione devi aver installato il software grixFC

torna su
     

Come utente anonimo puoi leggere il contenuto di questo forum ma per aprire una discussione
o per partecipare ad una discussione esistente devi essere registrato ed accedere al sito




 






 
 
indietro | homepage | torna su copyright © 2004/2013 GRIX.IT - la community dell'elettronica amatoriale