PDA

View Full Version : PicBasic Lookup command



queenidog
- 27th July 2011, 00:04
I have a little snippet of code where I lookup a value and send it to PortA (Lolite=PortA) of my PIC16F887. Here is the code:
For d = 0 To 7
Lookup d,[$1,$3,$7,$f,$1f,$3f,$7f,$ff],out
Lolite=out
pause 100
Next d

-My variables are declared
Using the debugger in MicroCode Studio:
-Var "out" has proper value inserted for each value of "d"
-Lolite DOES NOT equal out.

For the first 4 or 5 values of d, Lolite =0, then for the next value of d, it jumps to $10.

Why, oh why, oh why?

mister_e
- 27th July 2011, 00:42
Is Lolite a Byte or Word?

queenidog
- 28th July 2011, 00:31
Lolite is a byte.

I looked at that...but I don't see anything wrong. Lolite is a byte, out is a byte and all the values are bytes.

What am I missing?

mister_e
- 28th July 2011, 01:24
Weird, have you tried on a stripped version of your codeÉ

Could you post the whole thing here?

Assuming Lolite is an alias to PORTA, have you disable the analog and/comparator on PORTA ?

queenidog
- 29th July 2011, 13:43
Here is the "complete" code. This is a test area where I have all my equates and variable declarations for a bigger code, but I check little pieces at a time. The piece I'm checking now is the "snippet" I showed in previous post.


; Define LOADER_USED to allow use of the boot loader.
Define LOADER_USED 1

;Aliases use Var, symbols use = sign
;Code D,C,B, A in that order, from Snowflake to Arm to Light

;SNOWFLAKES
East Var PortD.0 ;Use Port D for Snowflakes and background
Cent var PortD.1 ;connect to enable line of 74373 latches
West var PortD.2
Back Var PortD.3 ;likely always set to "on" to keep background lit

;ARMS
Blu var PortC.0 ;Use Port C bottom nibble for arms
Org var PortC.1
Red var PortC.2
Grn Var PortC.3
Armson var PortC
Armsoff var PortC
;LIGHTS
LoLite var PortA
HiLite var PortB

L0 Var PortA.0
L1 var PortA.1 ;Low Lamps 0-7 Lo.0=first inside, using port A
L2 var PortA.2
L3 var PortA.3
L4 var PortA.4
L5 var PortA.5
L6 var PortA.6
L7 var PortA.7

H0 VAR PortB.0
H1 VAR PortB.1
H2 VAR PortB.2
H3 VAR PortB.3 ;High lamps 8-11 Hi.11=last outside, using port B

x var byte ;index variable for low lamps 0-7
y var byte ;index variable for high lamps 8-11
del var byte ;use var Word if value>255
d var byte
out var byte


;****************Program Start******************
Initialize:

TRISA= %00000000 ;set portA to all output
TRISB= %00000000 ;set PortB to all output
TRISC = %00000000 ;Set PORTC to all output
TRISD= %00000000 ;Set PortD to all output
Low Blu
Low Org
Low Red
Low Grn
LoLite=0
HiLite=0
low east ;initialize
low cent
low west
;high east
High Cent
;High West

;Armson=$0F ; all arms on, same as High Blu, High Red, etc
ArmsOff=$00; all arms off
d=0

Main: Gosub growspin
goto main

;*********************Subroutines***************** **********


growspin:For d = 0 To 7
Lookup d,[$1,$3,$7,$f,$1f,$3f,$7f,$ff],out
Lolite=out
pause 100 ;first 8 in about 2/sec for pause=100
Next d ;entire snowflake in about 1 sec
;For d = 0 To 3
;Lookup d,[$1,$3,$7,$f],out
;Hilite=out ;
;pause 100 ;
;Next d
;pause 500 ;hold all at end for 1/2 second
LoLite=0
Return

queenidog
- 29th July 2011, 21:58
I figured it out. Not having played with too many CPU/MPU/MCU that are multi purpose I was not aware that the port could be analog or digital
Initializing Ansel to 0 fixed the problem. The code works now.
Thanks for reading this and attempting to help me.
Reading the spec sheet (all of it), triumphs again!!

queenidog
- 29th July 2011, 23:53
Okay, one problem solved...now another. I'm using RA6 and RA7 and want to use the internal oscillator. I think I have to set bit 2 of CONFIG1 to 1 in order to select INTOSCIO.
I tried config1= config1|%00000100 (|= OR) but I get a compile error. I can't find anything via Google, via other programs on how to do this.
I'm using PIC Basic Pro. I don't want to disturbe the other bits, which is why I'm using OR.

anyone?

mister_e
- 30th July 2011, 00:23
http://www.picbasic.co.uk/forum/showthread.php?t=543

queenidog
- 1st August 2011, 17:36
I had tried everything to get RA6 and RA7 working and when they were not (by noting the lights connected to these pins were not lighting up) I started poking around first with my logic probe, and then my oscilloscope. Would you believe it? The two signals WERE coming out of the MCU to my breadboard, and through the interface chips, but not at the end of my 4 foot ribbon cable. That's right, the signals I was looking for were there, but I had a HARDWARE problem! I had tested the cable out previously, ringing it out with an ohmmeter, but by scoping it I could see the signal wasn't getting through the 16 pin ribbon connector cable. A couple quick squeezes with pliers fixed the problem.

Long time ago a colleague would use the term "check the wiring" for every little problem that came up. I laughed at him...

Thanks to those who responded. Oh, btw, I didn't need to change the config bits.

midali
- 18th June 2016, 20:00
I have something strange with loockup command. I play with a RC transmitter...
If I turn on the pic with signal>185 then duty = 0 ; then I reduce the signal value under 185 , then duty=divf
If I move quickly the transmitter-stick (signal from 150 ) to maximum (200) I obtain random different values for duty, like 250 ,191, 90, 223 and sometime 255.
If I move slow the transmitter-stick , then duty = divf all time, so work perfectly.

Can somebody explain me whats happen here , please ? I'm very confused..!!


#CONFIG
__config _CONFIG1, _FOSC_INTOSC & _MCLRE_OFF & _CP_ON & _CLKOUTEN_OFF
__config _CONFIG2, _PLLEN_OFF & _LVP_OFF
#ENDCONFIG

DEFINE OSC 4
OSCCON = %01101000
@ ERRORLEVEL -306 ; turn off crossing page boundary message
include "lcd.bas"
ADCON0 = %00000000
ADCON1 = %00000000
CM1CON0 = 0 ' COMPARATORS OFF
CM1CON1 = 0
CM2CON0 = 0 ' COMPARATORS OFF
CM2CON1 = 0
CPSCON0 = 0 'CAPACTIVE SENSE MODULE OFF
RCSTA.7 = 0 'SERIAL PORT OFF

OPTION_REG.7 = 1 'DISABLE PULL UP

TRISA = %00000000
TRISB = %00000000
TRISC = %00000000

ANSELA = %00000000
ANSELB = %00000000

PORTA = %00000000
PORTB = %00000000
PORTC = %00000000

WPUB = %00000000
LATC = 0

divf var byte : divf = 0
signal var byte
value var byte : value =0
duty var byte : duty = 0

gosub lcdrst:pause 300

main:
pulsin portb.0 , 1 , signal
if signal > 185 then signal = 185

if signal > 160 then
value = (signal - 160) ' value max 25
lookup value ,[0,30,40,50,65,80,90,100,117,136,153,168,180_
,191,201,209,217,223,233,237,241,244,247,250,255],divf
else
divf = 0
value = 00
endif
if duty <> divf then duty = divf

lcdout $fe, $80 , "Value = " , dec3 value
lcdout $fe, $C0 , "DUTY = " , dec3 DUTY

goto main

'-------------------------- LCD -----------------------------
lcdrst:
lcdout, $fe, 1
pause 10
return

HenrikOlsson
- 18th June 2016, 20:26
If I turn on the pic with signal>185 then duty = 0 ; then I reduce the signal value under 185 , then duty=divf
The first value in the LOOKUP table is returned when value is 0. You have 25 entries in the table so value should range from 0 to 24. When signal is >185 value is 25 which points outside of the table in which case divf remains unchanged - so if this is at startup it remains at 0.


If I move quickly the transmitter-stick (signal from 150 ) to maximum (200) I obtain random different values for duty, like 250 ,191, 90, 223 and sometime 255.
If I move slow the transmitter-stick , then duty = divf all time, so work perfectly.
This I don't think has anything to do with the LOOKUP command. Have you looked at the actual pulses being measured by the PIC, is it possible that they actually ARE varying in widht (due to noise in the stick or whatever) and that the PIC is doing exactly as it should?

/Henrik.

midali
- 18th June 2016, 20:31
Thank you very much for explanation , Henrik....
.
The pulses are 100% ok , I verified with a osciloscope,

midali
- 18th June 2016, 20:43
SOLVED !
1000 x thanks , HENRIK

I modified the the loockup table :


lookup value ,[30,40,50,65,80,90,100,117,136,153,168,180_
,191,201,209,217,223,233,237,241,244,247,250,255,2 55,255],divf

HenrikOlsson
- 18th June 2016, 20:48
OK, are you saying that the randomness when moving the stick quickly is gone as well? I didn't expect that....

/Henrik.

midali
- 18th June 2016, 20:52
Now all are ok !

midali
- 18th June 2016, 20:54
Now all are ok! The problems was from lookup table, was missing one value.