Don't ad-block us - support your favorite websites. We have safe, unobstrusive, robotics related ads that you actually want to see - see here for more.
0 Members and 1 Guest are viewing this topic.
can you try to do software resets if data isn't properly received?
so you are receiving the data without a problem, but your code isn't storing the data?
#include <system.h>//Target PIC16F877 configuration word#pragma DATA _CONFIG, _PWRTE_OFF & _BODEN_OFF & _WDT_OFF & _LVP_ON & _CPD_OFF & _DEBUG_OFF & _HS_OSC & _CP_OFF//Set clock frequency#pragma CLOCK_FREQ 20000000volatile static char conf ;volatile static char ctrx;volatile static char ctry;volatile unsigned int data_rdy;char ser_tmp;char M_packet[10];//**************************************FUNCTION PROTOTYPE DECLARATION***************void posisi(void);void set_port();void ser_init(char spbrg_val); void ser_tx(char c);void ser_putstring(const char* text);const char ser_rcv(); void get_ACK();void autogainon();void clamp();void setupCam();void get_packetM();int wait_for_data(void);int wait_for_data2(void);//*******************************MAIN BODY************************************ void main( void ){ //char inc = 'B'; set_port(); ser_init(129); // start up serial port handling setupCam(); clamp(); //Enable interrupts (Timer0) set_bit(intcon,PEIE); // start up interrupts- required for servo control set_bit(intcon, GIE); // autogain on, etc. //Endless loop // set_bit(portb,RB0); // delay_s(3); // ser_putstring("dm 20\r"); // get_ACK(); //ser_putstring("gm\r"); //get_ACK(); // clear_bit(portb,RB0); set_bit( pie1, RCIE ); //Enable RX interrupt // ser_putstring("tw\r"); //get_ACK(); ser_putstring("tw\r"); //get_ACK(); ` // get_packetM(); //if(M_packet[8]==0||M_packet[1]==0||M_packet[2]==0) // goto point; //else{ conf = M_packet[8]; ctrx = M_packet[1]; ctry = M_packet[2]; //ser_putstring("pm 1\r"); //get_ACK(); //set_bit(pie1,5); clear_bit(portb,RB0); // clear_bit(intcon,TMR0IE); // set_bit(pie1,5); while(1){ //wait_for_data2(); //ser_putstring("\r");point2: ser_putstring("tc\r"); //get_packetM(); if(M_packet[8]==0&&M_packet[1]==0&&M_packet[2]==0) goto point2; delay_s(1); clear_bit(portb,RB0); //servo(120); posisi(); //get_packetM(); }}//*******************************function for get the packet of data********************* void get_packetM(void){char bufp; // while (ser_rcv() != 255) ; for (bufp = 0; bufp <9; bufp++) { M_packet[bufp] = ser_rcv(); } get_ACK(); wait_for_data2(); // set_bit(portb,RB0); }//*******************************function for get the packet of data************************************ void get_packetM(void){char bufp; // while (ser_rcv() != 255) ; for (bufp = 0; bufp <9; bufp++) { M_packet[bufp] = ser_rcv(); } get_ACK(); wait_for_data2(); // set_bit(portb,RB0); }//*******************************function for waiting the packet data************************************ int wait_for_data(void){ int i; // This loop below is a counter that gives just enough time to catch // an ACK from a normal command. for(i=0; i<20000; i++ ) { if( rcreg==0 ) return 1;} return 0;}int wait_for_data2(void){ int i; // This loop below is a counter that gives just enough time to catch // an ACK from a normal command. for(i=0; i<25000; i++ ) { if( ser_rcv()==':' ) return 1; else //( ser_rcv()!=':' ) ser_putstring("\r");}}//*******************************function for setting the port************************************ void set_port(void){ //Configure port A trisa = 0x00;//Configure port B trisb = 0x00;//Configure port C trisc = 0x00;//Configure port D trisd = 0x00;//Configure port E trise = 0x00;//Configure A/D pins adcon1 = 0x06;//Initialize port A porta = 0x00;//Initialize port B portb = 0x00;//Initialize port C portc = 0x00;//Initialize port D portd = 0x00;//Initialize port E porte = 0x00;//Set Timer0 mode}//*******************************function for setting the serial communication************************************ void ser_init(char spbrg_val) { sspcon = 0; pir1 = 0; // this ensures also RCIF = TXIF = 0; clear_bit(pie1,5); //RCIE = 0; clear_bit(pie1,4); //TXIE = 0; trisc = 0xc0; // setup TRISC for USART use trisb = 0x00; spbrg = spbrg_val; txsta = 00100100b; // txen, brgh rcsta = 10010000b; // spen and cren, the rest all off ser_tmp = rcreg; // flush the rx buffer ser_tmp = rcreg; ser_tmp = rcreg; ser_putstring("rs\r"); get_ACK(); }//*******************************function for transmit communication************************************ void ser_tx(char c) { //set_bit( pie1, TXIE ); //wait for txif to go hi while (!(pir1 & 16)) ; //while (!TXIF); txreg = c; //enable_interrupt(GIE); //?}//*******************************function for write string to transmit************************************ void ser_putstring(const char* text) { char i = 0; // set_bit( pie1, TXIE ); while( text[i] != 0 ) ser_tx( text[i++] ); // clear_bit(pie1,TXIE);}//*******************************function for receiving from cmu camera************************************ // nonblocking receive returns 0 for any error, including nothing to readconst char ser_rcv(void) {//again: while (!(pir1 & 32)); {wait_for_data(); //if(pir1 & 32) // { ser_tmp = rcreg; //if(rcreg!=" ") return ser_tmp; } } //*******************************function for get acknowledgment************************************ void get_ACK(){int i; for(i=0; i<20000; i++ ) { if( ser_rcv() == ':' ) return 1;} return 0; //while (ser_rcv() != ':') ; }//*******************************function for setting autogainon************************************ void autogainon() { char B; ser_putstring("cr 18 44 19 33\r"); //18=color mode,44=wb on,19-autoeposure,33=gain on get_ACK(); ; // read all reply characters} // autogainon(); ////*******************************function for clamp the camera************************************ void clamp() {//char B; ser_putstring("cr 18 40 19 32\r"); get_ACK(); delay_s(5); set_bit(portb,RB0);} // clamp() ////*******************************function for setting up camera************************************ void setupCam() { // char inc; delay_ms(200); portb=0x00; // raw mode on // ser_putstring("rm 3\r"); get_ACK(); autogainon(); // noise filter on // ser_putstring("mm 1\r"); get_ACK(); ser_putstring("nf 1\r"); get_ACK(); // poll mode off // ser_putstring("pm 1\r"); get_ACK(); ser_putstring("l1 1\r"); get_ACK(); // full window mode // //ser_putstring("sw 35 65 45 75\r"); //get_ACK(); // ser_putstring("cr 17 9\r"); // get_ACK(); // portb=0x01; delay_s(5); ser_putstring("l1 2\r"); get_ACK();}
for (bufp = 0; bufp <9; bufp++) { M_packet[bufp] = ser_rcv(); }
while(1)//fills array up with goodies { characterFromCamera = ser_rcv(); if(characterFromCamera == '\r') { stringFromCamera[i]='\0'; break; } stringFromCamera[i] = characterFromCamera; i++;}
parseSpacket(stringFromCamera, rmean, gmean, bmean, rdev, gdev, bdev);//store S packet
//parses S packets for GM commandvoid parseSpacket(char* inpString, int &rmean, int &gmean, int &bmean, int &rdev, int &gdev, int &bdev){int i = 2;rmean = atoi(&inpString[i]);while(inpString[i]!=' ') { i++; }i++;...
could i use this code for tw and tw command?
and could explain your function parseSpacket it's quite confused......
stores that into individual variables such as rmean (red mean value).by doing i++ it just goes to the next value in the array
ive only done that once and never had a prblem..your leaving me puzzled
when this function will return?i see this seem uncompleted yet....
lets say you get a packet like this:128 23 67 9 34 145
void get_packetM(void){int i = 1;while(1)//fills array up with goodies { characterFromCamera = ser_rcv(); if(characterFromCamera == ':') { stringFromCamera[i]='\0'; break; } stringFromCamera[i] = characterFromCamera; i++;}}
void parseSpacket(char* inpString, int &rmean1, int &gmean1, int &bmean1, int &rdev1, int &gdev1, int &bdev1){int i = 2;rmean1 = atoi(&inpString[i]);while(inpString[i]!=' ') { i++; }i++;bmean1 = atoi(&inpString[i]);while(inpString[i]!=' ') { i++; }i++;gmean1 = atoi(&inpString[i]);while(inpString[i]!=' ') { i++; }i++;rdev1 = atoi(&inpString[i]);while(inpString[i]!=' ') { i++; }i++;gdev1 = atoi(&inpString[i]);while(inpString[i]!=' ') { i++; }i++;bdev1 = atoi(&inpString[i]);while(inpString[i]!=' ') { i++; }}
ser_putstring("tw\r"); get_packetM(); parseSpacket(stringFromCamera, rmean, gmean, bmean, rdev, gdev, bdev); conf = rmean; ctrx = gmean; ctry = bmean; clear_bit(portb,RB0); do{ set_bit(portb,RB0); ser_putstring("tc\r"); get_packetM(); parseSpacket(stringFromCamera, rmean, gmean, bmean, rdev, gdev, bdev); delay_s(1); clear_bit(portb,RB0); //posisi(); }while(1);
I have check the voltage on usat pin (Rx & Tx) but i has no reading.