To LUGNET HomepageTo LUGNET News HomepageTo LUGNET Guide Homepage
 Help on Searching
 
Post new message to lugnet.robotics.handyboardOpen lugnet.robotics.handyboard in your NNTP NewsreaderTo LUGNET News Traffic PageSign In (Members)
 Robotics / Handy Board / 1608
1607  |  1609
Subject: 
Vector2x SPI interrupt driven code
Newsgroups: 
lugnet.robotics.handyboard
Date: 
Wed, 5 Mar 1997 03:38:47 GMT
Original-From: 
<tomb@netperceptions.AVOIDSPAMcom>
Viewed: 
2060 times
  
Well it works.  A couple people have asked for it.  Turns out the
stupid V2X docs are wrong again!  Like the product, but bad docs will
kill it!

Even if you don't have a V2X, I have seen enough traffic asking about
using the SPI for things on the HB, and this proves it can be done.

The EOC level is wrong, it is HI not LO like the timing diagrams
show.  I kinda saw it on the scope, but I ignored it, figuring I was
doing something wrong (the docs are right aren't they :-P).  Tonight,
I decided not to ignore it, and I built an inverter using a NPN
transistor, on the EOC output.

I noticed also, that I changed the CPOL, and it works, I didn't fix
this to match the docs, I may, if I notice any trouble.  It could be
that the docs are wrong there also (surprise surprise).

It outputs the heading directly, I didn't actually write a cute C
routine, I should have, but something like:

main()
{
  comp_init(1);
  for(;;)
printf("heading %d\n", head_word);
}

should give you a really nice compass.  Notice that the interrupt
routine double buffers things, so this *SHOULD* provide accurate
results most of the time.

The heading does 0-359 and is pretty darn stable (I did a lot of !! on
the command line of IC).

I'll clean it up, I think I have to steal one of the motor control
lines (like the poloroid thing did), but I think I'll steal motor 3 or
4 reverse, that will allow control of the compass P/C line.  This will
still motor 3 forward with compass, and only a minor problem with
motor 3 reverse (maybe).

To use this, you will have to run a jumper from ground (tab of
regulator works great), to the P/C line of the compass *AFTER*
powering things up.  P/C has to be high at reset or powerup, float
works, otherwise you get lockups.

Fred, after I clean this up, and put some more stuff with it, you want
to package it up?

*
* icb file: "compspi.asm"
*
* Tom Brusehaver  02/16/96 working 03/04/97
*
* Run the V2X in master mode, this keeps collecting the "current"
* heading, resulting in having almost real-time, constant input from
* the compass.
*
*       Pin Connections
*     V2X            HC11
*   pin    desc   pin   desc    Notes
*    13     EOC  invert! SS      Sync bit counters between master and slave
*     2     SDO          MOSI    Data coming in
*     3     SDI          MISO    Data going out
*     1     SCLK         CLK     Bit clock
*     5     P/C         gnd after startup
*
* NOTE: I had to invert the EOC pin.  I used a NPN transistor, Base
*      connected to EOC pin, Collector connected to SS(HC11), and
*      pulled up with a 390 ohm resistor. Emitter connected to ground.
*      pretty simple really.
*


#include <6811regs.asm>

ORG MAIN_START

subroutine_initialize_module:
#include <ldxibase.asm>
* X now has base pointer to interrupt vectors

* get current vector; poke such that when we finish we go there
LDD SPIINT,X         ; SPI Interrupt
STD interrupt_code_exit+1   ; fix $0000 at end.

* install ourself as a new vector
LDD #interrupt_code_start
STD SPIINT,X
rts

* variables

variable_temp_word: FDB 0    ; read each byte and store here
variable_head_word: FDB 0    ; after reading 2 bytes move them here
variable_byte_count: FDB 0 ; read first or second byte?
variable_debug_vec:     FDB 0    ; --for now--

subroutine_comp_init:
* put SPI in slave mode
LDAA #%00000100
STAA DDRD
LDAA SPDR        ; read it
* LDAA #$CC ; SPIE, SPE !DWOM, !MSTR, CPOL, CPHA, E/2
LDAA #$C8 ; SPIE, SPE !DWOM, !MSTR, !CPOL, CPHA, E/2
STAA SPCR

LDAA SPSR ; clear SPIF
LDAA SPDR ;

ldaa    #$0f
sta     variable_debug_vec      ; --fornow--debug

CLI
RTS

* interrupt program begins here
interrupt_code_start:
ldaa    #$4f
sta     variable_debug_vec      ; --fornow--debug

LDAA SPDR   ; get our byte
LDAB variable_byte_count
CMPB #0                    ; wouldn't have to
BNE byte2_output
STAA variable_temp_word    ; just save the current byte away
INCB   ; increment byte count
STAB    variable_byte_count
BRA end_out
byte2_output:
STAA variable_temp_word+1  ; save the current byte, and move to
STAA variable_head_word+1
    LDAA    variable_temp_word    ; valid data holding location
STAA    variable_head_word    ;
LDAB #$0
STAB    variable_byte_count
end_out:
LDAA SPSR ; clear SPIF (maybe?)
LDAA SPDR ;

CLI

* end of interrupt program.
interrupt_code_exit:
JMP $0000 ; this gets fixed above



Message has 1 Reply:
  Re: Vector2x SPI interrupt driven code
 
Not sure who you are? tomb? Anyways, I noticed mention of a compass.... I once looked into the idea of using a flux gate compass to obtain heading info. After finding that the inexpensive (affordable) models would only obtain info at a resolution of (...) (28 years ago, 5-Mar-97, to lugnet.robotics.handyboard)

6 Messages in This Thread:



Entire Thread on One Page:
Nested:  All | Brief | Compact | Dots
Linear:  All | Brief | Compact
    

Custom Search

©2005 LUGNET. All rights reserved. - hosted by steinbruch.info GbR