Problemi di Frequenza

Forum relativo alle schede FLEX, ERIKA Enterprise, RT-Druid, ScicosLab, ...

Moderator: paolo.gai

Locked
onibaka

Problemi di Frequenza

Post by onibaka »

Salve a tutti!
E\' la prima volta che posto in questo forum, anche se sono mesi che lavoro con la Flex.
Ora vi illustro la mia situazione: in laboratorio ho una Flex Light programmata in modo tale che mi fornisca in uscita dei segnali PWM a 50Hz. Ora sto lavorando con una Flex Full, alla quale ho configurato i jumper come allla prima è l\'ho programmata con lo stesso file elf, ma in uscita mi fornisce un\'onda a 120Hz.
Sapreste dirmi quale potrebbe essere il problema?
Grazie per l\'attenzione.
paolo.gai
Administrator
Posts: 877
Joined: Thu Dec 07, 2006 12:11 pm

Re:Problemi di Frequenza

Post by paolo.gai »

Ciao!

Intendi dire che lo stesso ELF file programmato sulle due board da un risultato diverso? Mi sembra abbastanza strano, dal momento che i chip dsPIC utilizzati sulle due schede sono identici. per caso hai delle schede di prototipazione con il chip versione GP e non MC?

Ciao,

Paolo
onibaka

Re:Problemi di Frequenza

Post by onibaka »

Giusto, è così. La vecchia Light monta un GP mentre la nuova un MC. Cosa dovrei fare?
paolo.gai
Administrator
Posts: 877
Joined: Thu Dec 07, 2006 12:11 pm

Re:Problemi di Frequenza

Post by paolo.gai »

Si, mi ricordavo che l\'esapode nella versione iniziale usava i primi prototipi della Flex...

Da quello che so i due chip dovrebbero essere uguali a parte qualche periferica. In ogni caso dovrebbe essere impossibile programmare i due chip conlo -stesso- binario... come hai fatto? l\'ICD2 se non sbaglio dovrebbe protestare... se programmi un micro diverso...

per cui ti consiglio di:
- ricompilare il binario per la nuova scheda, modificando la MCU nel file OIL

- verificare le temporizzazioni... prendi come base una programmazione del PLL a 40 Mhz (vedi ad esempio gli esempi EDF che programmano il PLL a 2 o 40 MHz, sono citati anche nel manuale PIC30 nella sezione EDF) e partendo da quelli deriva la programmazione del PWM...

ciao,

PJ
onibaka

Re:Problemi di Frequenza

Post by onibaka »

Ho modificato la MCU nel conf.oil, e a ricontrollare la sezione dei timer non mi sembra esserci incorrettezze. Ho provato a riprogrammare a 40 MHz, come da manuale, ma le frequenze continuano a non tornare.
Riporto di seguito la sezione dei timer e quella del conf:

Code: Select all

void configureTimers(void)
{
		T2CON = 0x0100; //0000000100000000 @ 16bit
		
		PR2 = 0xFFFE;
		IEC0bits.T2IE = 0;	
	
	
		T1CON = 0x0100;   //0000000100000000       


		TMR1 = 0;   		
	
//setto il perio register di timer 1
//voglio avere 2500 interrupt al secondo in modo da settare il relAlarm //del 
	//task motori con 50 in modo che mi generi 50 allarmi al secondo
	// 80 MHz
 	// PR1 = 0x3E80;          
	// 60 MHz
         PR1 = 0x2EE0;


	IPC0bits.T1IP = 5;     
	IFS0bits.T1IF = 0;     
	IEC0bits.T1IE = 1;     
	T1CONbits.TON = 1;                                 
}

void configureClock(void){
	/* Clock setup */
	CLKDIVbits.DOZEN = 0;
	CLKDIVbits.PLLPRE = 0;
	CLKDIVbits.PLLPOST = 0;
	PLLFBDbits.PLLDIV = 58; //multiply for 60 (4 / 2 * 60 / 2 = 60MHz)
//	PLLFBDbits.PLLDIV = 78; //multiply for 80 (4 / 2 * 80 / 2 = 80MHz)
	
	/* Wait for PLL to lock */
	while(OSCCONbits.LOCK!=1);
}

CPU mySystem {

	OS myOs {
		EE_OPT = \"DEBUG\";

		CPU_DATA = PIC30 {
			APP_SRC = \"code.c\";
			MULTI_STACK = FALSE;
			ICD2 = TRUE;
		};

		MCU_DATA = PIC30 {
			MODEL = PIC33FJ256MC710; 
		};
		
		BOARD_DATA = EE_FLEX {
			USELEDS = FALSE;
		};
		
		KERNEL_TYPE = FP;
		
	};

	TASK PWM {
		PRIORITY = 1;
		STACK = SHARED;
		SCHEDULE = FULL;
	};
	TASK calculate {
		PRIORITY = 2;
		STACK = SHARED;
		SCHEDULE = FULL;
	};
	
	COUNTER myCounter;
	
	ALARM alarmPWM {
		COUNTER = \"myCounter\";
		ACTION = ACTIVATETASK { TASK = \"PWM\"; };
	};
	
};
Nel main infine viene aggiunto \"SetRelAlarm(alarmPWM, 10, 50);\" per iniziare gli interrupt.

Volevo sapere quindi se dal prototipo alla versione definitiva non ci siano stati dei cambiamenti nel range delle frequenze o nel codice esecutivo.
Grazie per l\'attenzione.
paolo.gai
Administrator
Posts: 877
Joined: Thu Dec 07, 2006 12:11 pm

Re:Problemi di Frequenza

Post by paolo.gai »

Ciao,

No, non ci sono stati cambiamenti nel codice.

Prova a ripartire dal demo più semplice, quello con il pask periodico. su quello la frequenza è sicuramente corretta. Inoltre fai attenzione al fatto che la frequenza va specificata in 2 punti, la prima all\'inizio del main con quel ciclo infinito, la seconda all\'inizio del file per settare il valore iniziale di alcuni registri.

In ogni caso ERIKA non fa che utilizzare i settaggi standard di Microchip, per cui puoi utilizzare i settaggi di default di Microchip per impostare la frequenza...

Ciao

Paolo
onibaka

Re:Problemi di Frequenza

Post by onibaka »

Vorrei porre un ultimo problema: quando si imposta il periodo di un timer non riesco a capire che tipo di calcolo si utilizza per far si che si attivi nel momento desiderato. Su un esempio del manuale si imposta il periodo di timer1 a 1 ms avendo una Fosc=20Mhz, che diventa quindi 5000 (decimale).
\"/* Timer1 period for 1 ms with FOSC = 20 MHz */
#define TMR1_PERIOD 0x1388\"

Come si passa da 20MHz a 1388?

Grazie
paolo.gai
Administrator
Posts: 877
Joined: Thu Dec 07, 2006 12:11 pm

Re:Problemi di Frequenza

Post by paolo.gai »

Su un esempio del manuale si imposta il periodo di timer1 a 1 ms avendo una Fosc=20Mhz, che diventa quindi 5000 (decimale).
Come si passa da 20MHz a 1388?
(non ho trovato questo esempio all\'interno dei manuali di ERIKA... a che pagina si trova?)

5000 decimale = 0x1388 (esadecimale)

(per fare la prova puoi utilizzare una calcolatrice (tipo quella di linux o windows) in modalità scientifica.

con 40MHz, ad esempio, hai un clock a 25ns, e servono 4000 cicli per un timer ad 1ms , che corrisponde a 0x0fa0

ciao,

Paolo
onibaka

Re:Problemi di Frequenza

Post by onibaka »

è un esempio che ho trovato a pagina 82 del \"MPLAB® C30 C COMPILER USER’S GUIDE\" che riguarda i timer
paolo.gai
Administrator
Posts: 877
Joined: Thu Dec 07, 2006 12:11 pm

Re:Problemi di Frequenza

Post by paolo.gai »

Ok... (in effetti non mi ricordavo di aver mai pubblicato una temporizzazione a 20MHz per la Flex...)

PJ
onibaka

Re:Problemi di Frequenza

Post by onibaka »

Eccomi di ritorno. Il problema della frequenza dei task e dei timer è stato risolto. Siamo partiti da un esempio per il controllo di un led e abbiamo portato il task a ripetersi ogni 20 ms. Da questa base abbiamo iniziato ad aggiungere volta volta il codice per il controllo dei motori in PWM, ma appena abbiamo inserito il codice che segue nel task i valori di frequenza d\'uscita non erano più gli stessi.

Code: Select all


/*Questa è l\'inizializzazione*/
void setPortsAddress(void)
{
	portsAddress[0]=(unsigned int *)&LATA;
	portsAddress[1]=(unsigned int *)&LATB;
	portsAddress[2]=(unsigned int *)&LATC;
	portsAddress[3]=(unsigned int *)&LATD;
	portsAddress[4]=(unsigned int *)⪭
	portsAddress[5]=(unsigned int *)&LATF;
	portsAddress[6]=(unsigned int *)&LATG;
}

void setDCMatrix(void){
	//FR
	DCMAtrix[0][0] = 6; DCMAtrix[0][1] = 0b1111111111111110; //RG0
	DCMAtrix[1][0] = 0; DCMAtrix[1][1] = 0b1111111101111111; //RA7
	DCMAtrix[2][0] = 4; DCMAtrix[2][1] = 0b1111111111111101; //RE1
	//CR
	DCMAtrix[3][0] = 6; DCMAtrix[3][1] = 0b1110111111111111; //RG12
	DCMAtrix[4][0] = 4; DCMAtrix[4][1] = 0b1111111111111011; //RE2
	DCMAtrix[5][0] = 4; DCMAtrix[5][1] = 0b1111111111101111; //RE4
	//BR
	
	DCMAtrix[6][0] = 4; DCMAtrix[6][1] = 0b1111111111011111; //RE5
	DCMAtrix[7][0] = 4; DCMAtrix[7][1] = 0b1111111101111111; //RE7
	DCMAtrix[8][0] = 2; DCMAtrix[8][1] = 0b1111111111111101; //RC1
	//BL
	DCMAtrix[9][0] = 3; DCMAtrix[9][1] = 0b1111111111011111; //RD5
	DCMAtrix[10][0] = 3; DCMAtrix[10][1] = 0b1111111101111111; //RD7
	DCMAtrix[11][0] = 5; DCMAtrix[11][1] = 0b1111111111111101; //RF1
	//CL
	DCMAtrix[12][0] = 3; DCMAtrix[12][1] = 0b1111111111111101; //RD1
	DCMAtrix[13][0] = 3; DCMAtrix[13][1] = 0b1111111111110111; //RD3
	DCMAtrix[14][0] = 3; DCMAtrix[14][1] = 0b1101111111111111; //RD13
	//FL
	DCMAtrix[15][0] = 0; DCMAtrix[15][1] = 0b0111111111111111; //RA15
	DCMAtrix[16][0] = 3; DCMAtrix[16][1] = 0b1111110111111111; //RD9
	DCMAtrix[17][0] = 3; DCMAtrix[17][1] = 0b1111011111111111; //RD11
	
onibaka

Re:Problemi di Frequenza

Post by onibaka »

Questo è il codice che da errore nel task modificando la frequenza di uscita

Code: Select all


(*portsAddress[DCMAtrix[i][0]])=(*portsAddress[DCMAtrix[i][0]])&(DCMAtrix[i][1]);
Abbiamo utilizzato una diversa implementazione ma più \"dispendiosa\". Vorrei sapere se sbagliamo qualcosa nell\'utilizzo degli indirizzi porte e delle maschere.

Grazie
paolo.gai
Administrator
Posts: 877
Joined: Thu Dec 07, 2006 12:11 pm

Re:Problemi di Frequenza

Post by paolo.gai »

Se ho capito bene, la situazione è:
- il led è acceso da un task
- il task è attivato ogni 20 ms
- aggiungendo del codice al task il led non si accende più periodicamente

Allora una possibile causa potrebbe essere il task che dura più dei 20ms.

Inoltre, installate la patch del kernel che abbiamo messo nella pagina download, che risolve un problema riscontrato nella gestione degli interrupt (potrebbe essere la causa del ritardo).

Ciao,

Paolo
onibaka

Re:Problemi di Frequenza

Post by onibaka »

Quello che succede è:
- il task si avvia ogni 20ms
- ogni volta che si avvia il task accende o spenge il led (come da esempio)ed è stata controllata la frequenza con un oscilloscopio e risulta corretta
- inserito il codice per il controllo delle uscite tramite indirizzi e maschere il led rimane acceso sempre (almeno ad occhio sembrerebbe, come se si attivasse a una frequenza molto più alta dei 50 Hz) e l\'oscillazione d\'uscita si aggira sui 260 Hz circa.

Abbiamo fatto diverse prove levando e rimettendo il codice, e le inizializzazioni non danno problemi durante la compilazioni. Se la situazione si risolve tramite la patch allora non ci dovrebbero essere più problemi.
Locked