![]() | ![]() | ![]() |
| |||||||
| Micro Controllers Discuss all aspects of micro controllers - building them, coding them, etc. All controllers are welcome - PIC, BASIC, Z8 Encore!, etc. |
![]() |
| | Tools |
| | #1 |
|
hey all im trying to use an quadrature optical encoder and haven't been able to succeed thus far..please help, the code is given below. What the code does is perform 2 initial A/D conversions on portA pins and then continuously samples pins 1 and 2 of port A. Converts the values and outputs to a lcd, and polls for buttons. Ive been trying for weeks to get the encoder to work properly. PLease Help. #include <p18F452.h> #include <xlcd.h> #include <delays.h> #include <adc.h> #include <math.h> #include <portb.h> #include <stdio.h> #include <encoder.h> //..................Delays For LCD...............// void DelayFor18TCY( void ) { Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); } void DelayPORXLCD( void ) { Delay1KTCYx(15); //Delay of 15ms return; } void DelayXLCD( void ) { Delay1KTCYx(5); //Delay of 5ms return; } //.............................. int direction = 0; int count = 0; void encoder (void); void encoder2 (void); #pragma code high_vector_section=0x08 void high_vector (void) { _asm GOTO encoder _endasm } #pragma code #pragma code low_vector_section=0x18 void low_vector (void) { _asm GOTO encoder2 _endasm } #pragma code #pragma interruptlow encoder2 void encoder2 (void) { if (PORTBbits.RB1 == 0){ direction++; } INTCON3bits.INT2IF == 0; } #pragma code #pragma interrupt encoder void encoder (void) { INTCON3bits.INT1IF == 0; if(PORTBbits.RB2==1){ direction++; } } #pragma code void main( ) { double hund; double ten; double one; double hunds; double tens; double ones; long set1=0; long set2=0; long set3=0; long set4=0; int setx; int sety; int s3; int s4; int H; int T; int O; int HH; int TT; int OO; int HHH; int TTT; int OOO; int output1; long int rx; long int ry; long int sen1;// voltage from sensor 1 long int sen2;// voltage from sensor 2 long int sen3=0; long int sen33=0; long int off1;//offset voltage for sensor 1 long int off2;//offset voltage for sensor 2 long int result=0; int val; int direction = 0; TRISBbits.TRISB1 = 1; //enable encoder pins as inputs TRISBbits.TRISB2 = 1; RCONbits.IPEN = 1; // enable priority interrupts INTCON2bits.INTEDG1 = 1;// edge select bits INTCON2bits.INTEDG2 = 1; INTCON3bits.INT2IF = 0; //clear flags INTCON3bits.INT1IF = 0; INTCON3bits.INT2IE = 1; //enable INT2 interrupt INTCON3bits.INT1IE = 1; //enable INT1 interrupt INTCON3bits.INT2IP = 0; //set priority to low INTCON3bits.INT1IP = 1; // set priority to high INTCONbits.GIEH = 1; //enable high and low proirity interrupts INTCONbits.GIEL = 1; OpenXLCD( FOUR_BIT & LINES_5X7 ); while(BusyXLCD()); WriteCmdXLCD(0x01); while(BusyXLCD()); while( BusyADC() ); OpenADC(ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_8ANA_0REF, ADC_CH0 & ADC_INT_OFF ); Delay10TCYx( 5 ); // Delay for 50TCY ConvertADC(); // Start conversion while( BusyADC() ); // Wait for completion off1 = ReadADC(); // Read result CloseADC(); // Disable A/D converter while (BusyADC()); OpenADC( ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_8ANA_0REF, ADC_CH1 & ADC_INT_OFF ); Delay10TCYx( 5 ); // Delay for 50TCY ConvertADC(); // Start conversion while( BusyADC() ); // Wait for completion off2 = ReadADC(); // Read result CloseADC(); // Disable A/D converter //................Main Loop...................for(; ![]() while (1) { // result = direction; if (result < 0){ result = -result; } if ((result >181) && (result <= 360)){ result =360 - result; } if ((result > 360) && (result < 540)){ result = result - 360; } if ((result > 540) && (result < 720)){ result = 360 - result; } HHH = (result/100)%10+48; TTT = (result/10)%10+48; OOO = result%10+48; //.......................................sample from ADC while (BusyADC()); OpenADC(ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_8ANA_0REF, ADC_CH0 & ADC_INT_OFF ); Delay10TCYx( 5 ); // Delay for 50TCY ConvertADC(); // Start conversion while( BusyADC() ); // Wait for completion sen1 = ReadADC(); // Read result CloseADC(); // Disable A/D converter if (off1>sen1) sen1 = (off1 - sen1); else { sen1 = sen1 - off1; } sen1=(sen1*50000)/1023; sen1=sen1*72; if (sen1>1810000) { sen1 = 1800000 - ( sen1 - 1800000); } hund = (sen1/1000000)%10+48; ten = (sen1/100000)%10+48; one = (sen1/10000)%10+48; //.................................................. .........................// while (BusyADC()); OpenADC( ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_8ANA_0REF, ADC_CH1 & ADC_INT_OFF ); Delay10TCYx( 5 ); // Delay for 50TCY ConvertADC(); // Start conversion while( BusyADC() ); // Wait for completion sen2 = ReadADC(); // Read result CloseADC(); // Disable A/D converter if (off2>sen2) sen2 = (off2 - sen2); else { sen2 = sen2 - off2; } sen2=(sen2*50000)/1023; sen2=sen2*72; if (sen2>1810000) { sen2 = 1800000 - ( sen2 - 1800000); } hunds = (sen2/1000000)%10+48; tens = (sen2/100000)%10+48; ones = (sen2/10000)%10+48; //........................................Set Angle............ if (PORTCbits.RC3 == 0) //if x is selected { if (PORTCbits.RC7 == 1){ //if the increment button is pressed while (PORTCbits.RC7 == 1); //wait till they release button if (set1 < 180) { ++set1; } } if (PORTCbits.RC5 == 1){ //if the increment button is pressed while (PORTCbits.RC5 == 1); //wait till they release button if (set3 < 18) { ++set3; } } } if (PORTCbits.RC3 == 0) //if x is selected { if (PORTCbits.RC6 == 1){ //if the decrement button is pressed while (PORTCbits.RC6 == 1); //wait till they release the button --set1; } if (PORTCbits.RC4 == 1){ //if the decrement button is pressed while (PORTCbits.RC4 == 1); //wait till they release the button --set3; } } //...................................... set 1 conversion for output to lcd s3=set3*10; setx = set1 + s3; if(setx<0) { setx = 0; } H = (setx/100)%10+48; T = (setx/10)%10+48; O = (setx/1)%10+48; //.................................................. .............................. if (PORTCbits.RC3 == 1) //if y is selected { if (PORTCbits.RC7 == 1){ //if the increment button is pressed while (PORTCbits.RC7 == 1); //wait till they release button if (set2 < 180) { ++set2; } } if (PORTCbits.RC5 == 1){ //if the increment button is pressed while (PORTCbits.RC5 == 1); //wait till they release button if (set4 < 18) { ++set4; } } } if (PORTCbits.RC3 == 1) //if y is selected { if (PORTCbits.RC6 == 1){ //if the decrement button is pressed while (PORTCbits.RC6 == 1); //wait till they release the button --set2; } if (PORTCbits.RC4 == 1){ //if the decrement button is //pressed while (PORTCbits.RC4 == 1); //wait till they //release the button --set4; } } //......................................set 2 conversion for output to lcd s4 = set4*10; sety = set2 + s4; if(sety<0) { sety = 0; } HH = (sety/100)%10+48; TT = (sety/10)%10+48; OO = (sety/1)%10+48; //........................................visual output for set angle = sensor angle. if (H == hund){ if ( T == ten){ if (O == one){ TRISCbits.TRISC1 = 0; //configure RC1 as input pin PORTCbits.RC1 = ~PORTCbits.RC1; // complement RC1 } else { TRISCbits.TRISC1 = 1; //configure RC1 as output pin } } } if (HH == hunds){ if ( TT == tens){ if (OO == ones){ TRISCbits.TRISC0 = 0; //configure RC0 as input pin PORTCbits.RC0 = ~PORTCbits.RC0; // complement RC0 } else { TRISCbits.TRISC0 = 1; //configure RC0 as output pin } } } //..................OUTPUT to LCD................... while( BusyXLCD() ); putrsXLCD(" Y= "); while( BusyXLCD() ); putcXLCD(HHH); while( BusyXLCD() ); putcXLCD(TTT); while( BusyXLCD() ); putcXLCD(OOO); while( BusyXLCD() ); } } | |
| |
|
| Tags |
| encoder, optical |
| Thread Tools | |
| Display Modes | |
| |
Similar | ||||
| Title | Starter | Forum | Replies | Latest |
| DC brushless motor with optical incremental encoder | Pepsiiuk | Datasheet/Parts Requests | 0 | 19th January 2009 12:15 AM |
| Advice needed - regarding use of optical encoder. | Denniswho | Electronic Projects Design/Ideas/Reviews | 2 | 10th April 2006 07:19 AM |
| Using a mouse optical encoder | shehry | Robotics Chat | 5 | 3rd February 2006 12:15 AM |
| Optical Encoder | YAN-1 | Micro Controllers | 4 | 14th October 2005 01:06 PM |
| using optical encoder frofeedback to 68HC11 | ivy | Micro Controllers | 1 | 8th December 2004 03:17 PM |