PDA

View Full Version : Counting better ?



Franko
- 14th August 2005, 03:33
Hi,
I'm trying to get this to count pulses from an opto detector which goes High when the beam is broken.
Problems are,it stops the Hmtr at three pulses instead of four and if the beam isn't broken in quick succession,hmtr continues to run no matter how many times beam is broken.
My complete thanks to Melanie for the first (most so far) part of code!



DEFINE OSC 4
CMCON=7

'Declare Variables,Constants and Aliases for Ports


In1 VAR PORTA.1 'pulse input from selector 24vac/dc via optocoupler
In2 VAR PORTA.2 'pulse input from selector 24vac/dc via optocoupler
In3 VAR PORTA.3 'pulse input from selector 24vac/dc via optocoupler
Button1 VAR PORTA.4 'pulse input from selector 24vac/dc via optocoupler
Hmtr VAR PORTB.0 ' motor on/off
DATAPLS VAR PORTA.0 'sense output from passthru opto
Alert VAR PORTB.1 'Beeper
CounterA VAR BYTE 'counter
i VAR WORD 'General purpose variable


'Set initial state of ports

Hmtr=0 ' motor off
TRISA = %11111111 'Make all Porta pins Inputs
TRISB = %00000000 'Make all Portb Outputs
Pause 500 'Settling time


'Start of program

runloop:
While In1=1 'Wait here for input pulse
CounterA=0 'Rest time counter
Wend



Timerloop:

While Button1=1 'Wait for dispense button to be pressed
CounterA=CounterA+1 'Increment counter by 100ms
IF CounterA=200 Then Startloop 'If 20 sec elapses,goto start and await new activation

Pause 100 'Wait 100ms for smooth operation
Wend



runit:

High Hmtr
Pause 100
While DATAPLS=0 'wait for High from passthru opto
Wend
GoSub cnt

GoTo runloop


cnt:
PulsIn DATAPLS, 1, i
IF i > 4 Then
Low Hmtr
Else
GoTo runit
EndIF
Return


Any suggestions ?

Thank you

yettie
- 15th August 2005, 01:37
franko,

what is your configuration for you PORTA inputs? did you used a pull down resistor to ground? You have an alternative to use internal weak pull-up features (OPTION_REG=7). PIC have sensitive inputs if you used pull downs. I had some problems that I also count the noise spikes if i used external pull downs, and most likely in activating motors. the motors are inductors that could spread some unwanted signals seen by the microcontroller. proper hardware design could prevent this kind of problems.

also, use
...(code here in betweens) for ease. thanks

regards,

Franko
- 15th August 2005, 16:19
Hi Yettie,
The config for porta pins are as inputs (if I did the code right).inputs A.1 and A.4 are pulled high via a 470 ohm. A.0 is pulled low via a 470.

I've never tried setting the internal pull up/dn but I will.The motor is power by a seperate 24vdc supply but with a common ground.The motor is switched by a relay which is controlled by the PIC via a NPN transistor and the coil of the relay has a diode across the coil and is correct direction.

I presume the problem is with the way I've done the code as I'm still learning (and loving it). I'll use the Quote function in the future as you said.

Thanks for your ideas.

Franko
- 17th August 2005, 00:19
Is it that no one sees anything wrong with this ? There must be something wrong with how I've done it.

I'm not asking for anyone to write it for me,rather just some advice on the correct way to make the motor low after four (or whatever) pulses.



runit:

High Hmtr
Pause 100
While DATAPLS=0 'wait for High from passthru opto
Wend
GoSub cnt

GoTo runloop


cnt:
PulsIn DATAPLS, 1, i
IF i > 4 Then
Low Hmtr
Else
GoTo runit
EndIF
Return
Thanks

CocaColaKid
- 17th August 2005, 00:34
Isn't using a 470R resistor a little low for a pull-up? Using a value this low will only increase the current the IO has to produce in order to change the pins state.

yettie
- 17th August 2005, 01:29
franko,

some points:
- cokekid seems to be right. try to increase the pull-up to 10K.
-
Problems are,it stops the Hmtr at three pulses instead of four and if the beam isn't broken in quick succession,hmtr continues to run no matter how many times beam is broken.
seems to be your PULSIN DATAPLS,1,i is the culprit. if theres anyway you can monitor your WORD "i", verify it. If you have a serial port, plug it. otherwise you'll be convinced of what you will find out. then recode. it's my style of debugging.

Franko
- 17th August 2005, 20:19
Yeah, I agree with you CocaColaKid and yettie, I usually use 1K or 10K (depending).But, I breadboarded this kinda quickly and grabbed what I had the most of.

I'll switch them to 10K and see if that makes any difference.

Yetti, I'm not sure what you mean by...

" seems to be your PULSIN DATAPLS,1,i is the culprit. if theres anyway you can monitor your WORD "i", verify it."

But I'll keep trying different methods.

Thanks for the advice,
Franko

yettie
- 18th August 2005, 02:14
franko,

good day!

i mean, i think that your PULSIN method is the problem. try to monitor your variable WORD 'i' after your PULSIN method, such as,



...
PULSIN DATAPLS,1,i
SEROUT2 porta.0,16780,["i: ",#i] ;connect to hyperterminal at 2400, 8N1, no parity.
...


just like that.

also I'm in doubt of what you are doing. are you actually trying to count the number of pulses at DATAPLS pin? when you use the PULSIN method, you are actually measuring the period of high signal (since your second argument is '1': PULSIN DATAPLS,1,i). if your period is less than (40us at 4MHz) it will never satisfy your IF statement, therefore the motor will not stop. hope i enlightened your mind, somehow.

regards,

Franko
- 18th August 2005, 03:00
Yettie,
Your right, I'm going about it in the wrong way. I am trying to count the pulses at the DATAPLS pin, NOT to measure the time it's high.

You have indeed enlightened me, I'll keep working at it.

Thank you very much !

yettie
- 19th August 2005, 01:03
franko,

good day!

i hope you will share your conclusions after all this just let me know. ok?

regards,

Franko
- 19th August 2005, 02:55
I sure will. Providing I come to a conclusion.

I'll keep at it.

Franko
- 23rd August 2005, 01:18
Well,
Here is how I got it to count 4 pulses and stop "Hmtr". This works perfect every time although I'm sure there is a way that I could be able to just change a single number from say 4 to 5 in order to change the count, I just haven't figured it out yet.

But, if the last pulse doesn't occur at (While DATAPLS=0) the motor continues to run. Of course.

Can I use Timer1 ETC. to set a maximum motor run time of say 10 sec. ?

Thanks, I appreciate any help.






High Hmtr
Pause 10
While DATAPLS=0
Wend
Low Hmtr
Pause 50

High Hmtr
Pause 10
While DATAPLS=0
Wend
Low Hmtr
Pause 50

High Hmtr
Pause 10
While DATAPLS=0
Wend
Low Hmtr
Pause 50

High Hmtr
Pause 10
While DATAPLS=0
Wend
Low Hmtr
Pause 50

GoTo Startloop

yettie
- 23rd August 2005, 02:26
franko,

yes, you can use TIMER1 module. provided that you initialized it properly and then poll a counter if it reached a 10s mark. I've been using TIMER1 register for some time. A advice you set the prescaler to 1:8 setting since you have a way to long to wait.

I could have just gave you some of ideas since it will be more satisfying if you find it yourself.

have a nice day!

regards,

Franko
- 23rd August 2005, 02:37
Will the timer run independently from the main code ? Like "in the background" ?

I ask this since the main program will be stuck at the (While) statement.

Thanks

yettie
- 23rd August 2005, 05:27
franko,

yes. once the initialization process of TIMER1 interrupt is complete and activating the start of counter, the timer will run in background as you work on your main code. it will only then be entering the interrupt service routine once it reached the overflow anytime and anywhere while you are working on your main routine.

regards,

Franko
- 24th August 2005, 01:35
I read about the timer(s) running in the background in Melanie's Olympic timer.

I've looked through the data sheets. How does one learn more about how to use the timer functions ? Proper way to write the code ? Reccomended books ?

Thanks,
Franko

yettie
- 25th August 2005, 01:27
franko,

good day! i had not read any reading materials except for the microchip datasheet. you can have a guide there of what bits you will manipulate. for TIMER1, such bits are T1CON, PIE1.1, PIR1.1, and for interrupts INTCON. you would want to experiment it and discover what you can do. I bet it will be more satisfying. Melanie's olympic timer example is your best guide. I'm sure you can do it.

regards,