PDA

View Full Version : Shiftout - shiftin question



Lasse1
- 3rd April 2010, 23:10
Hello.
I have a compass-module from Hitachi. I have had it connected to a Basic stamp with good result. Now i would like to run it with a PIC. But the program get stucked in the loop below. It assumes to send out (%1100) at shiftout and that is what it should get back at shiftin, but something went wrong here. I use PIC16F690 and I think I tryed to connect and program it to every pin in every thinkable combination.
Do anyone have some idea who can help me?
I am a new PIC-user.





DO ' Status flag checking loop
HIGH En: LOW En ' Measurement status command

SHIFTOUT DinDout,clk,MSBFIRST,[Report\4]
SHIFTIN DinDout,clk,MSBPOST,[Status\4] ' Get Status


LOOP UNTIL s = Ready ' Exit loop when status is ready

mackrackit
- 3rd April 2010, 23:27
Hi and welcome to the forum.

When using MSBFIRST you have to


Include "modedefs.bas"

Near the beginning of your code.

It is also a good idea when posting a problem to post the whole code. The problem may not be where you think...

If the above does not fix the problem tell us the model of the part you are connecting to.

Lasse1
- 4th April 2010, 10:39
Thank you very much for your quick respons.

Here comes the whoole beguinning of my code, the rest is in progress and can absolute confuse you, so I don´t include it. I am absolut sure that the program stucks at the shiftout/shiftin-loop, and as you can see it starts and goes there very soon.
As you can see I allready included the "modedefs.bas"-file. (I tried to attache my code in a box now, but dont know how so I copy it in below).

The connected module is a Hitachi HM55B

I tried a lot of ideas, pauses, changed chiftout-commands and things.

I hope you or anyone can have some idea.

Friendly regards / Lasse




include "modedefs.bas"

DinDout var portb.6 ' P6 transceives to/from Din/Dout
Clk var portb.5 ' P5 sends pulses to HM55B's Clk
En var portb.4 ' P4 controls HM55B's /EN(ABLE)
rela var porta.0
knapp var portb.6
Reset CON %0000 ' Reset command for HM55B
Measure CON %1000 ' Start measurement command
Report CON %1100 ' Get status/axis values command
Ready CON %1100 ' 11 -> Done, 00 -> no errors
NegMask CON %1111100000000000 ' For 11-bit negative to 16-bits

x VAR Word ' x-axis data
y VAR Word ' y-axis data
s VAR byte ' Status flags
angle VAR Word ' Store angle measurement
EE VAR byte
Promangle VAR byte
btnwk VAR Byte
droj VAR byte
define shift_pauseus 100

HIGH rela
droj = %0001


goto huvud


' -----[ Subroutines ]--------------------------------------------------------
compass:
' Compass module subroutine

HIGH En: LOW En ' Send reset command to HM55B
SHIFTOUT DinDout,clk,MSBFIRST,[Reset\4] 'OBS! jag har ersatt MSBFIRST med ,1,

HIGH En: LOW En ' HM55B start measurement command
SHIFTOUT DinDout,clk,MSBFIRST,[Measure\4] 'Ersatt MSBFIRST med ,1, även här
s = 0 ' Clear previous status flags

DO ' Status flag checking loop
HIGH En: LOW En ' Measurement status command

SHIFTOUT DinDout,clk,MSBFIRST,[Report\4]
SHIFTIN DinDout,clk,MSBPOST,[Status\4] ' Get Status


LOOP UNTIL s = Ready ' Exit loop when status is ready

SHIFTIN DinDout,clk,MSBPOST,[x\11,y\11] ' Get x & y axis values

HIGH En ' Disable module

IF (y.BIT10 = 1) THEN y = y | NegMask ' Store 11-bits as signed word
IF (x.BIT10 = 1) THEN x = x | NegMask ' Repeat for other axis
return
' End subroutines-------------------------------------------------------

huvud:
DO ' Main loop

tillb1:


gosub compass ' Get x, and y values

angle = x ATN -y ' Convert x and y to brads
angle = angle */ 180 + 1 ' Convert brads to degrees

mackrackit
- 4th April 2010, 15:15
Looks really close to the Basic Stamp code but one big difference when switching to PBP is many of the chips have analog built in.

Just about every pin on the 690 has analog. So read through this
http://www.picbasic.co.uk/forum/showthread.php?t=561
and the data sheet.

For the 690 to turn off the analog you will need to add this near the beginning.


CM1CON0 = 0 'Should turn off the Comparators
CM2CON0 = 0
ANSEL = 0 'Turns ADC off


You may want to start off with a simple "blinky" program just to make sure the 690 is running correctly.

Lasse1
- 4th April 2010, 22:31
Thank you!
It was really good information. I missed this analog thing. Now the PIC seems to work more logic, or moore like a stamp. But it still dont work with this compass-module. I think that I will start to test the same things I allready have done before I typed this new strip, and maybee et will work. If you don´t have any moore good information I maybee have missed?
I get back here and tell how it was going.
/ Lasse

mackrackit
- 5th April 2010, 10:29
What version of PBP are you using?

And you may want to look at the source code compared to your code. There was a couple things I think missing but have not had a chance to really pick it over.

But first, is the PIC® running? Can you make an LED blink at an expected rate. Maybe it is not running at the correct speed?

Lasse1
- 5th April 2010, 14:44
Hello again.
Thanks for your engagement!
It is still dont working.

I think that I have the latest and best PBP-version. I baught it last week.
The code is allmost a copy from the sourse-code (made for Basic stamp where it works). And I checked the speed. It seems to me as it is correct. I light a led up and paused for 10 000. Checked, and it was 10 sek.
I think I tryed everything. Now I am really drained of ideas.
You are more than welcome to came up with new ideas.
Friendly regards / Lasse

mackrackit
- 5th April 2010, 14:58
Looking at your code again


SHIFTIN DinDout,clk,MSBPOST,[Status\4] ' Get Status

LOOP UNTIL s = Ready ' Exit loop when status is ready

I do not see a "Status" array variable defined but I do see a "s" variable.

Lasse1
- 5th April 2010, 16:34
Thanks again.
I think that I tried it before. Type "SHIFTIN DinDout,clk,MSBPOST,[S\4]" instead of "status". But now I tried again. It dont work. Do you think that it is some different depending of witch pins I use? Do I need to try different pins every change I try?
Friendly regards / Lasse