Questo articolo mostra un metodo per l'acquisizione dell'immagine da una fotocamera CMOS dotata di interfaccia seriale utilizzando FLEX.
FLEX è una scheda per sistemi modulari embedded che utilizza le potenzialità dei microcontrollori dsPIC (R) DSC prodotti da Microchip. E' una scheda ideale per sviluppare applicazioni real-time perché il microcontrollore dsPIC33FJ256MC710 supporta kernel real-time come Erika Enterprise prodotto da Evidence Srl.
Il software è diviso in due: un'applicazione MPLAB per essere caricata sul microcontrollore (dsPIC33FJ256MC710) di FLEX e un'applicazione Win32 per l'acquisizione dei dati seriali e per la visualizzazione delle immagini.
Per l'applicazione PC Side le richieste sono: il programma utilizza cygwin1.dll, che può essere condiviso attraverso le finestre "PATH environment variable" o può essere posizionato in "executable directory". Il programma deve essere eseguito in Microsoft/Cygwin.
I requisiti per l'applicazione Flex Side sono: FLEX Base Board (Light o Full), PCB per "serial RS232 voltage conversion", condensatori e connettori, un modulo CAMVGA100. Utilizzando il "project Wizard", create un nuovo progetto MPLAB nella directory Flex-side e costruite un file eseguibile; o utilizzando "$ makefile" per creare il progetto. Poi, programmate il dispositivo microchip per mezzo di un programmatore ICD2.

Vediamo un pezzo del codice:
/************** MAIN ***********/
int main ( void )
{
unsigned char camok=0;
unsigned int i=0;
// Fcy/115200/16-1 = 5.78 -> 6
/* Clock setup for 40MIPS */
RCONbits.SWDTEN = 0; // Disable Watch Dog Timer
CLKDIVbits.DOZEN = 0;
CLKDIVbits.PLLPRE = 0;
CLKDIVbits.PLLPOST = 0;
PLLFBDbits.PLLDIV = 76; // to have Fcy = 39e6Hz...
while(OSCCONbits.LOCK!=1); /* Wait for PLL to lock */
//U1BRG=20;
//U1BRG=20; // BAUD_RATE = 115200
//U1BRG=41; // BAUD_RATE = 57600
U1BRG=62; // BAUD_RATE = 38400
//U1BRG=125; // BAUD_RATE = 19200
//U1BRG=253; // BAUD_RATE = 9600
UART1_Config(U1BRG);
//while(1) //Loop forever
//{
//Main routine
//Loops forever detecting the baud rate from incoming UART data of 0x55
//and outputing a message each time the baud rate is calculated.
//SetupAutoBaud(); //Set up UART1, IC1 and TMR3 for autobaud
//while(U1BRG == 0) {} //Wait for autobaud to complete
//BRate = ((unsigned )Fcy / 16) / (U1BRG + 1); //See what baud rate is being used
//printf("Baud rate: %ld\r", BRate); //Output text with the baud rate
//while(finish == 0);
//finish=0;
//Cam_TIMER89Config(152343);
//Cam_Sleep(76170); //0.1sec
//IEC0bits.IC1IE = 0; //Clear Capture 1 interrupt enable
//IEC0bits.T3IE = 0; //Clear Timer 3 interrupt enable
//U1BRG_calcval = (unsigned int)(((SumOfBitTimes + 64) >> 7) - 1);
//UART1_Config( U1BRG_calcval );
//Cam_Sleep(152343);
//Cam_CloseTimer89();
// ust[0] = (U1BRG>>8) & 0x00FF;
// ust[1] = U1BRG & 0x00FF;
// Send_by_UART1((unsigned int *)ust,2);
// while(BusyUART1()); //Wait for transmission to complete
// Send_by_UART1((unsigned int *)ust,2);
// while(BusyUART1()); //Wait for transmission to complete
//ust[0] = 0xAA;
//ust[1] = 0xBB;
//ust[2] = 0xCC;
//ust[3] = 0xDD;
//Send_by_UART1((unsigned int *)ust,4);
//while(BusyUART1()); //Wait for transmission to complete
//break;
//}
//UART1_Config(259);
//ust[0]=0xAA;
//Send_by_UART1((unsigned int *)ust,1);
//while(BusyUART1()); //Wait for transmission to complete
//UART1_Config(62);
//UART1_Config(20); // Initialize the UART module to receive and transmit serial data.
//UART1_Config(41);
Cam_Init();
// while(1)
// {
// ust[0]=0xAA;
// Send_by_UART1((unsigned int *)ust,1);
// for(i=0;i<60000;i++);
// }
//start1=1;
while(1)
{
if(start1)
{
start1=0;
camok = Cam_Synchronization( (float)Fcy );
if(camok)
{
ust[0]=0x12;
ust[1]=0x34;
//Send_by_UART1((unsigned int *)ust,2);
}
else
{
ust[0]=0xEE;
ust[1]=0xEE;
Send_by_UART1((unsigned int *)ust,2);
continue;
}
//if(!camok) continue;
camok = Cam_GetStream();
}
}
//CloseUART1();
//while(1);
return 0;
}
// void SetupAutoBaud(void) -> Read me: Set up the peripherals and interrupts to do baud rate detection
void SetupAutoBaud(void)
{
U1BRG = 0; //U1BRG initially unknown
U1MODE = 0x8820; //Enable auto baud detection in UART
U1STA = 0x85D0; //Set up rest of UART to default state with transmission enabled
ICCount = 0; //Initialize the number of Capture events
IC1CON = 0x0000; //Reset Input Capture 1 module
IC1CON = 0x0002; //Enable Input Capture 1 module
IFS0bits.IC1IF = 0; //Clear Capture 1 interrupt flag
IEC0bits.IC1IE = 1; //Enable Capture 1 interrupt
T3CON = 0x0000; //Timer 3 off
IEC0bits.T3IE = 0; //Clear Timer 3 interrupt enable
T3Count = 0; //Initialize the number of Timer 3 interrupts
PR3 = 0xffff; //Timer 3 period is maximum
T3CON = 0x8000; //Timer 3 on with 1:1 prescaler and internal clock
}
Per maggiori informazioni clicca qui.



