PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] CMPS03 und PicBasic



michel
18.12.2003, 13:20
Kann jemandem mir kurz erklären wie ich ein CMPS03 ( Kompass sensor ) mit PICBasic programieren kann ( also Werte ablesen ) und auf was ich aufpassen muss wenn ich ein 16f877 benutzen.
Danke

Jürgen
18.12.2003, 14:22
Hi, ich hab das deutsche Datenblatt bzw. Beschreibung dazu erst mal in den Download Bereich gestellt, das hatte noch gefehlt.

Schau mal hier http://www.robot-electronics.co.uk/htm/cmps2axe.htm, vielleicht findest Du da was. Hier sind Beispiele zu vielen Controllern http://www.robot-electronics.co.uk/shop/Examples.htm

Ansonsten kann Jörg sicher noch was zu schreiben, er hat die Module ja im Angebot.

http://www.roboter-teile.de/images/cmps03_400.jpg

Joerg
18.12.2003, 15:58
Hallo,


Ansonsten kann Jörg sicher noch was zu schreiben, er hat die Module ja im Angebot.


Hmm, und ich kann jetzt zu jedem der gebräuchlichen Controller mit jedem verwendbaren Compiler was schreiben :roll:

Aber ich werd's trotzdem mal machen. Das CMPS03 ist ja relativ einfach anzusteuern, das einzige Problem ist das I2C Interface richtig hinzubekommen. Für den Kompasswert braucht man nur ein 16bit-Register auszulesen.

Dazu habe ich mir mal die Hilfedatei zum PicBasic (Proton+) angesehen und das Beispiel daraus angepasst.
Kann das hier aber weder compilieren noch ausprobieren, noch habe ich irgendwelche Ahnung von Basic, also keine Garantien dass das funzt.
Ich weiß auch nicht, ob der PicBasic das Hardware-I2C des PIC16F877 nutzt, oder ob das softwaremäßig emuliert wird.

DIM VAR1 as WORD ' We'll read 16-bits
DIM Address as WORD ' 16-bit address required
SYMBOL Control 192 ' Adresse CMPS03
Address = 2 ' Read the value at address 2
VAR1 = BUSIN Control , Address ' Read the word from the CMPS

Evtl. muss noch High- und Lowbyte von VAR1 vertauscht werden, keine Ahnung wie man das in Basic macht.
Aber dann sollte das also gehen. Stutzig werde ich nur, wenn ich in der Hilfe solche Bemerkungen stehen, wie:
Because of the subtleties involved in interfacing to some I2C devices, the compiler's standard BUSIN, and BUSOUT commands were found lacking somewhat. Therefore, individual pieces of the I2C protocol may be used in association with the new structure of BUSIN, and BUSOUT
. See relevant sections for more information.

Da ich das aber unmöglich für alle Controller und Compilervarianten machen kann und werde, möchte ich alle bitten, die eine brauchbare Implementierung eines kurzen Testprogramms (Minimalroutinen) für verschiedene Controller haben, mir diese zur Verfügung zu stellen. Ich werde die Programme dann als Beispiele auf meiner Webseite zur allgemeinen Nutzung zur Verfügung stellen.

HTH und Viele Grüße
Jörg

Frank
18.12.2003, 17:54
Da ich das aber unmöglich für alle Controller und Compilervarianten machen kann und werde, möchte ich alle bitten, die eine brauchbare Implementierung eines kurzen Testprogramms (Minimalroutinen) für verschiedene Controller haben, mir diese zur Verfügung zu stellen. Ich werde die Programme dann als Beispiele auf meiner Webseite zur allgemeinen Nutzung zur Verfügung stellen.

Aber Du bist doch unser Experte! :-) Scherz - natürlich kann niemand alle Microcontroller kennen und Beispiele dazu liefern, versteht sich! Die Idee kurze kurze Beispiele zu posten finde ich auch gut. Allerdings wäre es schön wenn die Beispiele auch hier im Forum, zum Beispiel in diesem Software, Algorithmen und KI (https://www.roboternetz.de/phpBB2/viewforum.php?f=11) gepostet werden könnten. Am besten immer gleich mit aussagekräftigem Betreff z.B. "Beispielcode für PIC und CMPS03 ". Dann hätten vielleicht noch mehr User gleich was von. Außerdem wird der Beitrag dann bald auch über die Suchmachinen erreichbar - was wieder einigen hilft.

Gruß Frank

Joerg
18.12.2003, 18:42
Hi Frank,

bitte nicht flasch verstehen, wenn hier jemand nach einer Variante fragt, wo ich mit einem Codebeispiel helfen kann, dann poste ich das natürlich gern auch hier.

Andererseits macht es keinen Sinn, das Forum mit zig Varianten von dem gleichen Programm vollzuspammen nur für den Fall das es mal interessant sein könnte.
Ich find aber die Idee von Gerry (Devantech) nicht schlecht, auf einer Seite tabellarisch Beispiele zu verlinken. Der Link darauf wurde hier ja auch schon mehrfach genannt. Ich möchte perspektivisch das auch anbieten, schon allein weil ich der deutsche Distributor für die Teile bin und damit auch in der Pflicht stehe.

Viele Grüße
Jörg

Frank
18.12.2003, 19:02
Nein Jörg,
hab ich schon richtig aufgefasst. Ich finde es nur sinnvoll es hier ruhig in das Forum Software, Algorithmen und KI (https://www.roboternetz.de/phpBB2/viewforum.php?f=11) zu posten! Das Forum ist ja extra für solche Beispiele gedacht, von daher wäre es kein vollspammen. Und wenn es zuviel Beispiele für den Kompass werden sollten, dann kann ich das immer noch zusammenfassen oder halt unseren Grundlagenbereich etwas ergänzen. Wir haben da ja auch ein Bereich wo Sensoren aufgelistet werden, da könnte ich das schon gut einbauen. Also ruhig Codefetzen posten.
Nicht nur was das Kompassmodul betrifft, als einfache Algorithmen wie Multiplikation, Division von Fließkommazahlen bei unterschiedlichen Microprozessoren u.s.w.! Ich denke irgend jemanden wird es sicher helfen. Gerade Einsteiger suchen immer wieder so was vergebens.

Gruß Frank

19.12.2003, 15:49
Danke fuer die Antwort, habe leider nix gefunden was brauchbar ist. Ich habe alle möglichkeiten der Komandos I2CWRITE un IC2READ von
PICBASIC COMPILER probiert aber ohne Erfolg...probiere jetze der PWM Ausgang auszuwerten ....

Nobody
19.12.2003, 16:03
Versteh ich nicht. Dachte man kann die Kommandos einfach per I2C Bus, wie üblich, senden und empfangen. I2C Routinen gibt es doch eigentlich genug für jeden Controller

19.12.2003, 16:06
ich verstehe es auch nicht :?

Joerg
19.12.2003, 16:32
Hallo,


Ich habe alle möglichkeiten der Komandos I2CWRITE un IC2READ von
PICBASIC COMPILER probiert aber ohne Erfolg...probiere jetze der PWM Ausgang auszuwerten ....


wahrscheinlich gibt es mehrere PICBASIC Varianten, das was ich mir angesehen habe, ist von der Firma Crownhill, nennt sich Proton+ Picbasic und hat kein I2CWRITE und I2CREAD.
Schreib doch einfach mal, wie du's gemacht hast, dann kann man vielleicht doch helfen.


Versteh ich nicht. Dachte man kann die Kommandos einfach per I2C Bus, wie üblich, senden und empfangen. I2C Routinen gibt es doch eigentlich genug für jeden Controller

sicher, nur heißen die überall anders, wollen teilweise die Adressparameter um ein bit verschoben, nutzen mal die Hardware und mal nicht.

Es ist nur eben so, dass man sich in die Entwicklungsumgebung seiner Wahl samt Controller seiner Wahl teilweise ganz schön tief reinknien muss, um die I2C Routinen vernünftig nutzen zu können.
Allerdings gibt es auch Entwicklungsumgebungen, da ist es mit einem einfach i2cread oder wie auch immer die Funktion heißt, getan.

Viele Grüße
Jörg

20.12.2003, 23:29
Danke fuer ihre Hilfe, hier ist das code was ich ausprobiert habe :

DEFINE OSC 20
DEFINE HSER_BAUD 38400 'Baud = 38400
DEFINE I2C_SLOW 1

DPIN var PORTD.2 ' I2C data pin
CPIN var PORTD.1 ' I2C clock pin
B0 var byte
B1 var byte
B2 var byte
addr var byte

addr=1
loop:
I2CWRITE DPIN,CPIN,$C0, addr
pause 10
I2CREAD DPIN,CPIN,$C0,[B1]
pause 10
Hserout [dec B1," "]
pause 500
Hserout [13,10] ' Print CR LF
Goto loop

Ich habe auch mal mit $C1 im I2CREAD commando probiert aber nix , immer das selbe output : 08 !!?????

Joerg
21.12.2003, 00:30
Hallo,

das sieht so aus, dass immer das Register 0 (Version) gelesen wird. Das I2CWRITE würde ich weglassen, dafür

I2CREAD DPIN,CPIN,$C0,addr,[B1]

schreiben. Hoffe mal das es geht.

BTW, es gibt dutzende PICBASIC Versionen, alle mit verschieden I2C-Zugriffen. :?

HTH und Viele Grüße
Jörg

michel
23.12.2003, 09:59
Hallo,
Danke für ihre Hilfe....leider geht es nicht
I2CREAD DPIN,CPIN,$C0,addr,[B1] liefert mir immer nur $20 !!??
Ich habe jetzt fast alle Kombinationen ausprobiert und werde einfach nicht schlau dabei... ( bin vielleicht beklopft !!) Ich werde mal weiter mit dem PWM Ausgang arbeiten...

Michel

Joerg
23.12.2003, 12:44
Hallo Michel,

zu dem Thema, habe ich das gleiche Ausgangsprogramm in einem Thread eines italienischen Forums gefunden:
http://www.xar.it/mars/topic.asp?TOPIC_ID=35&FORUM_ID=3&CAT_ID=2&Forum_Title=MarkIII+robot&Topic_Title=MarkIII+e+CMPS03

In einem Posting kam dann übrigens genau die von mir vorgeschlagene Zeile, allerdings bin ich des italienischen nicht mächtig, deshalb verstehe ich die Begründung nicht, warum es nicht ging, evtl. hängt das mit dem I2C Bus Timing zusammen (Einstellung des 100kHz Bustakts bei 20MHz CPU?).

Jedenfalls gibt es auch ein angeblich funktionstüchtiges Programm (für 4MHz Clock), was ich hier mal kopiere:

http://on1djj.rug.ac.be/Grasmaaier/Compass.bas

////////////////////////
Clear

Define OSC 4 ' Set Xtal Frequency

Red_LED Var PortB.1 ' Assign the green LED to this pin
Green_LED Var PortB.2 ' Assign the red LED to this pin
' IR_Sensor Var PortB.4 ' Assign the IR Sensor to this pin
SCL VAR PortB.0 ' I²C Clock
SDA VAR PORTB.7 ' I²C Data
Compass CON $C0 ' I²C adres van compas
Reg1 CON 1 ' Adres register 1 : Byte
Reg2 CON 2 ' Begin adres register 2 : Word
RegCalibrate CON 15 ' Calibrate adres (write 255 to caibrate)
BearingReg VAR Word
Teller VAR Byte


Pause 500

High Red_LED
Pause 100
Low Red_LED
High Green_LED
Pause 100
Low Green_LED


'PIN mode with 4-bit
'Set LCD Data port
DEFINE LCD_DREG PORTA
'Set starting Data bit (0 or 4) if 4-bit bus
DEFINE LCD_DBIT 0
'Set REGISTER Select port
DEFINE LCD_RSREG PORTB
' Set LCD Register Select bit
DEFINE LCD_RSBIT 5
' Set LCD Enable port
DEFINE LCD_EREG PORTB
' Set LCD Enable bit
DEFINE LCD_EBIT 6
' Set LCD bus size (4 or 8 bits)
DEFINE LCD_BITS 4
' Set number of lines on LCD
DEFINE LCD_LINES 2

@ bcf LCDinitFlag

Symbol Cmd = $FE
Symbol ClearLCD = 1
Symbol Home = 2
Symbol Line2 = $C0
Symbol CursorOff = $0C
Symbol LineOn = $0E
Symbol BlinkOn = $0F
Symbol Left = $10
Symbol Right = $14
Symbol Procent = $25
Symbol ShiftLeft = $08

I2CREAD SDA,SCL,Compass,0,[teller] ' Reg0 software version CMPS03
LCDOUT Cmd, ClearLCD, "Compass TEST v", dec teller


Loop:

I2CREAD SDA,SCL,Compass,Reg2,[BearingReg] ' 16 bit
'LCDOUT Cmd, Line2, dec BearingReg dig 3, dec BearingReg dig 2, dec BearingReg dig 1, ".", dec BearingReg dig 0
LCDOUT Cmd, Line2, dec3 BearingReg/10, ".", dec1 BearingReg//10, $DF ' 000.0° - 359.9°


' I2CREAD SDA,SCL,Compass,Reg1,[Teller] ' 8 bit
' LCDOUT Cmd, Line2, dec teller dig 2, dec teller dig 1, dec teller dig 0

Pause 100

Goto Loop

Calibrate:

For Teller = 1 to 4
LCDOUT Cmd, ClearLCD, "kwadrant", dec Teller
' Wacht op gebruiker (IR-remote)
I2CWRITE SDA,SCL,Compass,RegCalibrate,[255]
Next
/////////////////////


Hoffe das hilft jetzt wirklich, ein schönes Weihnachtsfest und
Viele Grüße
Jörg

Sommer
01.04.2005, 00:10
Hi,

na ist da nun schonn was rausgekommen mit den I2C?
Bei mir kommen zwar Variable werte zwischen 2400 und 3200 aber
damit kann i nix genaues anfangen da es net das ist was es sein sollte.

Also wenn ich nun HBUS Adresse Register mach geht nix auch wenn ich danach nochmal die zweite Adresse Sende also Nummer ein 192 Register 2 as Word und dann nochmal die 193 nachsende immer das gleiche!

Hat es jemand mit Proton+ geschafft?

by Ulli