Just checked, it works, but not as it should - even on same sequence, it always reads different values.
Code:taki: COUNT PORTC.4, 70, LABEL if label=0 then goto taki endif LCDOUT $FE,$c0, DEC(LABEL), " " PAUSE 5 GOTO TAKI
Just checked, it works, but not as it should - even on same sequence, it always reads different values.
Code:taki: COUNT PORTC.4, 70, LABEL if label=0 then goto taki endif LCDOUT $FE,$c0, DEC(LABEL), " " PAUSE 5 GOTO TAKI
try this:
taki:
While PORTC.4=0
WEND
COUNT PORTC.4, 70, LABEL
LCDOUT $FE,$c0, DEC5 LABEL
PAUSE 5
GOTO TAKI
The actual issue is different I guess.
The system used is IDPPM - Differential Pulse Position Modulation.
Now I changed algorithm, and it detects pulses, there are 34 pulses, and it does it properly. But quantity of pulses is always 34, only pauses between them change, so COUNT is not proper implementation I guess.
P.S. above code displays only 00000
I was thinking that 1 is represented with missing pulse.
You can try something like this
Code:DEFINE PULSIN_MAX 65535 ' Limit wait-for-pulse and maximum-pulse count While PORTC.4=0 'wait for rising edge of start pulse WEND FOR I=0 TO 33 PULSIN PORTC.4,0,W3 IF W3>XXX THEN GOTO GotData NEXT I
A side note, a statement like
IF PORTC.4=1 THEN
actually sets PORTC.4 high.
Is this bug or feature?
I've added 1 transistor signal inverter, but no help. Also, your code does not work.
OK, I will give up with this idea.
This, to me, is the classic problem of how to tell (program) your micro controller to recognize and interpret the pattern.
The human brain combined with an eyeball can recognize it... now you just need to figure out how to translate that into code.
I would start by watching for the start pulse, which is longer than the other pulses. Then keep track of the width of the following pulses (or the width of the "low" part. Then watch for one or more extended "low" pulses.
Since you only need to differentiate between 0 and any other number/key press, then just watch for an extended "low" in a given time period after the extended "high" start pulse. If in the given time period you do not get any extended "low" pulses then the digit is "0" other wise if you get an extended "low" pulse then the keypress was non-zero.
Since the quantity of pulses in each character is always 34 then you should be able to just set up a counter to increment whenever the pulse is low and stop incrementing when the pulse goes back high. Then if the counter has incremented above a certain threshold then that particular "low" pulse was a "wide" one and indicates a non zero digit. (I hope that makes sense)
I believe it is easily do-able. you just need to distill it down to how to detect the extended low pulse that indicates a non-zero digit pressed.
that is how I would attack the challenge.
Last edited by Heckler; - 8th July 2016 at 15:13.
Dwight
These PIC's are like intricate puzzles just waiting for one to discover their secrets and MASTER their capabilities.
Code for that is in post #11 except it waits for transition from low to high to start measure 34 low intervals.
Bookmarks