Jerson,
this is very simple encoder. I have light to voltage chip, reading the encoder, the encoder is divided into 4 sections, 2 white and two black, read black show ADC below 127 and white ADC above 127.
ken
Jerson,
this is very simple encoder. I have light to voltage chip, reading the encoder, the encoder is divided into 4 sections, 2 white and two black, read black show ADC below 127 and white ADC above 127.
ken
That's a SOLAR CELL!
I get the feeling you might end up making a small program just to test the ability of your sensor to read the black/white patches in the first place rather than assuming your sensor/PIC will read everything the way you hope it will. Something like this:reading the encoder, the encoder is divided into 4 sections, 2 white and two black, read black show ADC below 127 and white ADC above 127.
Change the value 127 above to find a 'trip point' for the counter itself.Code:........setup......... ledout var port...some port here main: adcon0.2=1 'Start Conversion waitonadc: if adcon0.2 = 1 then waitonadc oldoutput_pot = adresh *256 + adresl if oldoutput_pot > 127 then ledout = 1 else ledout = 0 endif goto main
See what happens with that. If that works for you, then you should be all set.
(Also, you may want to check the manual for your use of the ADCIN command)
************************************************** ***********************
Why insist on using 32 Bits when you're not even able to deal with the first 8 ones ??? ehhhhhh ...
************************************************** ***********************
IF there is the word "Problem" in your question ...
certainly the answer is " RTFM " or " RTFDataSheet " !!!
*****************************************
I just want to count the revolution, so even if the trip point is not on the 'dot' it do not matter. What matters here is that I want to be able to calculate the transitions from black to white and white to black. After four transistions I get a revolution .
The problem in my program is that it is not showing anything on the LCD.
ken
crap.. I forgot to define my ADC:
Define ADC_BITS 8 ' Set number of bits in result
Define ADC_CLOCK 3 ' Set clock source (3=rc)
Define ADC_SAMPLEUS 50 ' Set sampling time in uS
ken
I dont know if it works, I m at work now, I will see when I get home tonight
skimask, what do you mean by tripping?
:is this it...
ADCON0.2 = 1 'Start Conversion
ADCIN 1, Output_Pot 'analog pin 1 (RA1) get the 8 bit result
Precisely. Depending on the way you've wired the sensor, you could see a logic 1 for black or a logic 0 for black. You can just read the digital input after configuring the pins tris register for input mode. Easier than reading the ADC and all its associated overhead. This overhead would eventually cause you to lose counts. I will still prod you into looking at the interrupt option.
What you've done will work, but at speeds relatively slower than the speed at which you read the ADC.
A simple routine could have an interrupt set up possibly on RB0. And the interrupt code would do something as simple as this
This code will ensure that you catch each and every pulse that comes its way irrespective of the Pauses in your mainline code.Code:CounterISR: dummyread = PortB ' clear the cause of the interrupt Counter = Counter+1 return ' from interrupt
This code is just a guide, please dont hold me to it.
JF
OOo I get the digital part now, no need for ADC.
I have never used interrupt, can you explain the code snippet you provided above?
should this work?
Mainloop:
'Calculate the distance
Output_Pot = PortB.3
if OldOutput_Pot == Output_Pot then
goto Mainloop
endif
if OldOutput_Pot != Output_Pot then
counter = counter +1 'If oldOutput_pot is different then Output_pot
OldOutput_Pot = Output_Pot
if counter =4 then
Revolution = Revolution + 1
counter =0
endif
endif
lcdout $FE,1, "Counter:",dec counter
lcdout $FE,$C0, "Revolution:",dec Revolution
pause 150
GOTO Mainloop
end
ken
Well, then get rid of the digital inputs and make sure the LCD is working in the first place...
And besides, in the beginning of the program, OldOutput_Pot = 0 and Output_Pot = 0 therefore, they're both equal and Mainloop keeps executing! Unless you've preset one or the other to a different value...
I got the circuit working now without the ADC, thats the one I will use.
BUT,I also tried the ADC, it only works in 10 bit mode when I try the 8 bit mode, nothing appears on the LCD. Here the progrm, but before here is the two lines I changed for the 8 bit mode:
ADCON1 = %10000010
Define ADC_BITS 8 ' Set number of bits in result
why is this happening?
INCLUDE "modedefs.bas" 'Includes supoprt for PicBasic language
@ DEVICE pic16F88, INTRC_OSC, CCPMX_ON
OSCCON=$60 ' use internal 4MHZ osc
ANSEL = 0
CMCON = 7 ' Turn OFF the comparators so pins can be used as digital I/O-pins
ADCON1 = %00000010 ' Analog to digital configuration register (ADCON)
' Set PORTA to digital
' Define ADCIN parameters
Define ADC_BITS 10 ' Set number of bits in result
Define ADC_CLOCK 3 ' Set clock source (3=rc)
Define ADC_SAMPLEUS 50 ' Set sampling time in uS
ADCON1 = %10000010 ' Analog to digital configuration register (ADCON)
' Set PORTA to digital
'/////////////////////////
'// LCD configuration //
'/////////////////////////
DEFINE LCD_DREG PORTB ' Set LCD Data port
DEFINE LCD_DBIT 4 ' Set starting Data bit (0 or 4) if 4-bit bus
DEFINE LCD_RSREG PORTB ' Set LCD Register Select port
DEFINE LCD_RSBIT 1 ' Set LCD Register Select bit
DEFINE LCD_EREG PORTB ' Set LCD Enable port
DEFINE LCD_EBIT 0 ' Set LCD Enable bit
DEFINE LCD_BITS 4 ' Set LCD bus size (4 or 8 bits) '4 therefore put wire at 4, 5, 6 and 7 of LCD
DEFINE LCD_LINES 2 ' Set number of lines on LCD
DEFINE LCD_COMMANDUS 2500
DEFINE LCD_DATAUS 250
DEFINE CHAR_PACING 2000
pause 1000
'/////////////////////////
'// PIN configuration //
'/////////////////////////
TRISA = %11100111 ' Set PORTA to all input
TRISB = %00001100 ' Set PORTB to all output
PortA = 0
'///////////////////////////////////////////////
'// Variable Declaration and initialization //
'///////////////////////////////////////////////
Output_Pot var byte
OldOutput_Pot var byte
Revolution var word
counter var byte
revolution = 0
Output_Pot = 0
OldOutput_Pot = 0
counter = 0
'Get initial value
'ADCON0.2 = 1 'Start Conversion
ADCIN 1, OldOutput_Pot 'analog pin 1 (RA1) get the 8 bit result
pause 50
if OldOutput_Pot > 512 then
OldOutput_Pot =1
else
OldOutput_Pot =0
endif
Mainloop:
'ADCON0.2 = 1 'Start Conversion
ADCIN 1, Output_Pot 'analog pin 1 (RA1) get the 8 bit result
pause 50
'Calculate the distance
if Output_Pot > 512 then
Output_Pot =1
else
Output_Pot =0
endif
if OldOutput_Pot == Output_Pot then
goto Mainloop
endif
if OldOutput_Pot != Output_Pot then
counter = counter +1 'If oldOutput_pot is different then Output_pot
OldOutput_Pot = Output_Pot
if counter =4 then
Revolution = Revolution + 1
counter =0
endif
endif
lcdout $FE,1, "Counter:",dec counter
lcdout $FE,$C0, "Revolution:",dec Revolution
pause 150
GOTO Mainloop
end
Bookmarks