PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] rs232 und i2c gleichzeitig in einem programm???



highblackbon
11.12.2011, 17:34
hallo alle zusammen,

ich heisse jörg bin 30 jahre alt und bin nicht ganz neu hier,ich lese schon eine weile mit, hab aber noch keinen lösungsansatz
so richtig gefunden.

ich habe einen roboter gebaut und bin dabei ihn zu programmieren.(bilder im anhang)
ich benutze folgende hardware:
-rn control
-rn motorcontrol
-2 rb 35 motoren
-display LCDPC2004
-srf02 ultraschallsensor
zum programmieren nehm ich den bascom compiler.
das rn control ist über i2c mit dem rn motorcontrol verbunden.
den ultraschallsensor hab ich an der rs232 schnittstelle.
hab für beide die beispielprogramme erfolgreich getestet-die funktionieren.
ich möchte ein fahrprogramm schreiben das vom grundaufbau her so ähnlich funtioniert wie die rn motorcontrol beispielprogramme,nur das eben der srf02 dabei als entfernungssensor dient und bei einem hindernis ein ausweichmanöver eingeleitet wird.

meine fragen wären : kann ich beide schnittstellen gleichzeitig in einem programm verwenden??
wenn ja -wie?
ist es möglich evt eines der beispielprogramme für meine zwecke umzubauen?;)

über sachdienliche hinweise wär ich sehr erfreut....

mfg jörg

oberallgeier
11.12.2011, 18:29
Hallo Jörg, willkommen im Forum - und viel Erfolg.


... rn control ist über i2c ... ultraschallsensor ... an der rs232 ... kann ich beide schnittstellen gleichzeitig in einem programm verwenden?? ...Seit zwei Jahren hatte ich immer wieder versucht, I²C ans laufen zu bekommen, war nie was geworden. Habe diese Tage das Beispiel aus dem RNWissen genommen (TWI Slave mit avr-gcc - klick hier) (http://www.rn-wissen.de/index.php/TWI_Slave_mit_avr-gcc)- und es lief. Leider nicht auf Anhieb (klick) (https://www.roboternetz.de/community/threads/55744-I²C-Master-m328-kann-Slave-m328-nicht-lesen), da hat wohl das dortige Testprogramm eine Macke. Aber für Dich wichtig ist nur :

Beide Controller, sowohl der Master als auch der Slave, haben ihre UART-Ausgabe (ich nehme wegen der höher möglichen Übertragungsrate KEIN R S 232 sondern UART über U S B) und laufen problemlos. Selbst der Sniffer, den ich dazugebaut habe, funktioniert bei mir mittlerweile passabel. Er hört die Leitung ab und gibt die Daten auf der Seriellen aus (die Serielle ist dort eine Softwarelösung).

Fazit: die Antwort auf Deine Frage ist "Ja".

PICture
11.12.2011, 18:46
Hallo!


kann ich beide schnittstellen gleichzeitig in einem programm verwenden??
wenn ja -wie?

Beide schon, aber bei "one-core" CPU von Microcontroller (µC) leider nicht echt gleichzeitig. ;)

highblackbon
11.12.2011, 19:54
danke erstmal für eure antworten.ich hab mal versucht ein fahrprog mit ultraschall-entfernungsangabe zu schreiben.hier mal der code:

'################################################# ##
'I2CANSTEUERUNG.BAS
'Beispiel: zu RN-MotorControl
'
' Demonstriert einige Grundbefehle über den I2C-Bus
' Motorgeschwindigkeit und Motordrehrichtung
'
' Achtung:
' Diese Demo ist mit Bascom Compiler 1.11.7.9 getestet
' Ältere Bascom Versionen sollten geupdatet werden
'
'
' ------------- Hier die üblichen RN-Control Anweisungen --------------


$regfile = "m32def.dat"
$hwstack = 32
$framesize = 32
$swstack = 32
$crystal = 16000000 'Quarzfrequenz

'''''''''''''''''''''''''''i2c'''''''''''''''''''' ''
$lib "i2c_twi.lbx" 'Sorgt dafür das der Hardware I2C vom Chip genutzt wird
Config Scl = Portc.0 'Ports fuer I2C-Bus
Config Sda = Portc.1
Const Slaveid = &H58 'I2C SlaveAdresse von RN-MotorCOntrol
Config Twi = 100000 'I2C Geschwindigkeit immer 100000


'''''''''''''''''''''lcd''''''''''''''''''

Config Lcd = 20 * 4 'wir verwenden ein 4 x 20 Zeichen Display
Cursor On

' Im I/O Mode wird jeder Prozessor Pin einzeln angegeben
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4

'''''''''''''''''''''usm''''''''''''''

Declare Function Srf02_firmware(byval Slaveid As Byte) As Byte
Declare Function Srf02_entfernung(byval Slaveid As Byte) As Integer


Open "COMA.0:9600,8,N,2" For Output As #1 'Port PA0 wird als TX definiert
Open "COMA.1:9600,8,N,2" For Input As #2 'Port PA1 wird als RX definiert
Const Srf02_slaveid = 1 'Standard RS232 Slave ID von SRF02

Dim Entfernung As Integer


' ------------- Ende der üblichen RN-Control Anweisungen --------------


Cls
Locate 1 , 1
Lcd "RN-CONTROL V1.4 "
Locate 2 , 1
Lcd "Fahrprog1"
Wait 2


Do






Wait 3
'Beide Motoren mit Geschwindigkeit 75 anlaufen lassen
I2cstart
I2cwbyte Slaveid
I2cwbyte 35 'Kennung
I2cwbyte 2 'Befehl
I2cwbyte 3 'Motorwahl
I2cwbyte 100 'Geschwindigkeit
I2cstop
Wait 20





'Motor 2 stoppen (Geschwindigkeit=0)
I2cstart
I2cwbyte Slaveid
I2cwbyte 35 'Kennung
I2cwbyte 2 'Befehl
I2cwbyte 3 'Motorwahl
I2cwbyte 0 'Geschwindigkeit
I2cstop bis hierher läuft es -dann ist schluss!

Wait 3

Entfernung = Srf02_entfernung(srf02_slaveid)
Cls
Locate 1 , 1
Lcd "Entfernung:" ; Entfernung ; "cm"



Loop


'------------- Hilfsfunktionen für SRF02 ----------
Function Srf02_firmware(byval Slaveid As Byte) As Byte
Print #1 , Chr(slaveid) ; Chr(93);
Srf02_firmware = Waitkey(#2)
End Function
Function Srf02_entfernung(byval Slaveid As Byte) As Integer
Local Lob As Byte
Local Hib As Byte
Print #1 , Chr(slaveid) ; Chr(84); 'Messvorgang in cm starten
Inputbin #2 , Hib , Lob 'Warte auf Ergebnis
Srf02_entfernung = Makeint(lob , Hib)
End Function

bis zur rot markierten stelle funktonierts es,dannach macht das prog nix mehr.
ich hab bestimmt nen furchtbaren denkfehler darin..find ihn nur nicht.
vielleicht hat ja von euch jemand ne idee....


mfg jörg

Kampi
11.12.2011, 20:12
Mach mal ein I2Cinit vor dem Do.
Damit initialisierst du das I2C Interface des Controllers. Und dahinter noch ein Waitms 100. Ich hatte letzte Woche auch das Problem das der I2C nicht richtig lief, weil er nicht initialisiert wurde.
Was auch sein kann ist, wenn du einen abgeschalteten I2C Baustein am Bus hast dann stört er den Bus.......das ist mir auch schon bei einem SRF10 und einem SD21 passiert.

highblackbon
11.12.2011, 20:30
hallo Kampi.
hast recht ,ich habs i2c init vergessen.hab es geändert.
das programm startet den i2c und damit die motoren ,soweit sogut- nur den ultraschallsensor danach und dessen ausgabe,der teil startet nicht!
fehlt da eine anweisung??

mfg jörg

Kampi
11.12.2011, 20:48
Bis wohin läuft das Programm den? Mach das mal mit Print-Befehlen und schau wo das Programm stehen bleibt.

highblackbon
11.12.2011, 21:48
hab es im code oben rot markiert wieweit es läuft(bis hierher läuft es -dann ist schluss!) .
hmm....mit dem print befehl geb ichs doch aufm terminal aus-oder lieg ich da falsch? ich nutze aber das lcd-display als ausgabe!
das zeigt mir "RN-CONTROL (http://rn-wissen.de/index.php/RN-Control) V1.4 " und "fahrprog" an.das bleibt dann auch auf dem lcd display stehen und die motoren laufen an.das ist wie gesagt alles in ordnung so.nachdem dann die 20 sec oder so rum sind in denen die motoren laufen sollen,soll er über rs232 den ultraschallsensor abfragen bzw auf dem lcd display die entfernung ausgeben- das aber macht er nicht.....

mfg jörg

Kampi
11.12.2011, 22:10
So ich hab nochmal in der Doku geschaut. In der Doku vom SRF02 steht folgendes Programm:



Declare Function Srf02_firmware(byval Slaveid As Byte) As Byte
Declare Function Srf02_entfernung(byval Slaveid As Byte) As Integer

$regfile = "m32def.dat"
$framesize = 42
$swstack = 42
$hwstack = 42
$crystal = 16000000 'Quarzfrequenz

$baud = 9600 'Normale Hardware RS232 (hier hängt PC dran)
Open "COMA.0:9600,8,N,2" For Output As #1 'Port PA0 wird als TX definiert
Open "COMA.1:9600,8,N,2" For Input As #2 'Port PA1 wird als RX definiert
Const Srf02_slaveid = 0 'Standard RS232 Slave ID von SRF02

Dim Entfernung As Integer

Wait 3 'Warte 3 Sekunden

Print "SRF02 RS232 Testprogramm von robotikhardware.de"
Print "SRF02 Ultraschall-Firmware Version:" ; Srf02_firmware(srf02_slaveid)
Print "PA0 wird TX und PA1 wird als RX genutzt"

V = 1

Do

Entfernung = Srf02_entfernung(srf02_slaveid)
Print "Entfernung:" ; Entfernung ; "cm"
Wait 1
Loop

End

'------------- Hilfsfunktionen für SRF02 ----------
Function Srf02_firmware(byval Slaveid As Byte) As Byte
Print #1 , Chr(slaveid) ; Chr(93);
Srf02_firmware = Waitkey(#2)
End Function
Function Srf02_entfernung(byval Slaveid As Byte) As Integer
Local Lob As Byte
Local Hib As Byte
Print #1 , Chr(slaveid) ; Chr(84); 'Messvorgang in cm starten
Inputbin #2 , Hib , Lob 'Warte auf Ergebnis
Srf02_entfernung = Makeint(lob , Hib)
End Function


Dort verwenden sie die Adresse 0. Ich nehme nicht an das du die Adresse geändert hast? (siehst du an dem Blinken der LED nach dem Einschalten).

highblackbon
11.12.2011, 22:33
ich hab den sensor mal im i2c mode benutzt und da seine id geändert-wollte ja eigentlich 2 davon verbauen,deswegen.
jetzt hab ich aber am i2c den motortreiber dran und wollte deswegen den us sensor am rs232 nutzen.
ich hab auch dieses beispielprog welches du zeigst ,am laufen,mit id=1,also daran denk ich liegts nicht.mit id=0 passiert mit diesem sensor nix mehr,da müsst ich mal den anderen probieren...die werte die der erste mit id=1 ausgibt sind auch korrekt.

mfg jörg

PicNick
12.12.2011, 09:04
Wieso verwendest du Soft-UART ?

Ich wette, dein Porgramm steckt hier:


Inputbin #2 , Hib , Lob 'Warte auf Ergebnis

highblackbon
12.12.2011, 09:32
ok.warum? ich hab den teil aus der demo übernommen-die demo ist gleiche die auch kampi gepostet hat.

mfg jörg

highblackbon
26.12.2011, 15:46
hallo

um das thema mal hier abzuschliessen:
ich hab den srf02 und das rn motorcontrol über i2c mit dem rn control verbunden.
mit diesem ersten einfachen code läuft das ganze:



Declare Function Srf02_firmware(byval Slaveid As Byte) As Byte
Declare Function Srf02_entfernung(byval Slaveid As Byte) As Integer


$regfile = "m32def.dat"
$framesize = 60
$swstack = 60
$hwstack = 60

$crystal = 16000000 'Quarzfrequenz
'''''''''''''''''''''lcd''''''''''''''''''

Config Lcd = 20 * 4 'wir verwenden ein 4 x 20 Zeichen Display
Cursor On

' Im I/O Mode wird jeder Prozessor Pin einzeln angegeben
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4

Config Scl = Portc.0 'Ports fuer IIC-Bus
Config Sda = Portc.1





Dim Entfernung As Integer
Dim V As Byte

Cls
Locate 2 , 3
Lcd "moin chef"
Waitms 900
Cls
Locate 1 , 1
Lcd "RN-CONTROL V1.4 "
Cls
Waitms 800
Locate 2 , 6
Lcd "Fahrprog1"
Wait 1


I2cinit
Const Srf02_slaveid = &HE2

Cls
Locate 1 , 1
Lcd "SRF02 Ultraschall-Firmware Version:" ; Srf02_firmware(srf02_slaveid)
Wait 1

V = 1
Do

I2cinit
I2cwbyte &HE2 'Standard I2C Adresse von SRF02
Entfernung = Srf02_entfernung(srf02_slaveid)
Cls
Locate 2 , 1
Lcd "Entfernung:" ; Entfernung ; "cm"
Waitms 65
If Entfernung < 27 Then Gosub Hind

Cls
Locate 2 , 5
Lcd "vorwaerts..."


I2cstart
I2cwbyte &H58
I2cwbyte 35 'Kennung
I2cwbyte 5 'Befehl
I2cwbyte 3 'Motorwahl
I2cwbyte 1 'Richtung
I2cstop
Waitms 500
I2cstart 'Motor 1 starten (Geschwindigkeit=45
I2cwbyte &H58
I2cwbyte 35 'Kennung
I2cwbyte 2 'Befehl
I2cwbyte 1 'Motorwahl
I2cwbyte 195 'Geschwindigkeit
I2cstop
Waitms 250

I2cstart 'Motor 2 starten (Geschwindigkeit=45
I2cwbyte &H58
I2cwbyte 35 'Kennung
I2cwbyte 2 'Befehl
I2cwbyte 2 'Motorwahl
I2cwbyte 175 'Geschwindigkeit
I2cstop







Loop


End

'''''''''''''''''''''
Hind:


I2cstart
I2cwbyte &H58
I2cwbyte 35 'Kennung
I2cwbyte 2 'Befehl
I2cwbyte 3 'Motorwahl
I2cwbyte 0 'Geschwindigkeit
I2cstop

Waitms 500
I2cstart 'Motor Rechts drehen
I2cwbyte &H58
I2cwbyte 35 'Kennung
I2cwbyte 5 'Befehl
I2cwbyte 3 'Motorwahl
I2cwbyte 0 'Richtung
I2cstop
Waitms 100
I2cstart
I2cwbyte &H58
I2cwbyte 35 'Kennung
I2cwbyte 2 'Befehl
I2cwbyte 3 'Motorwahl
I2cwbyte 175 'Geschwindigkeit
I2cstop
Wait 2
I2cstart
I2cwbyte &H58
I2cwbyte 35 'Kennung
I2cwbyte 2 'Befehl
I2cwbyte 3 'Motorwahl
I2cwbyte 0 'Geschwindigkeit
I2cstop
'motor2 starten andersrum
I2cstart 'Motor Rechts drehen
I2cwbyte &H58
I2cwbyte 35 'Kennung
I2cwbyte 5 'Befehl
I2cwbyte 1 'Motorwahl
I2cwbyte 0 'Richtung
I2cstop

I2cstart
I2cwbyte &H58
I2cwbyte 35 'Kennung
I2cwbyte 2 'Befehl
I2cwbyte 1 'Motorwahl
I2cwbyte 185 'Geschwindigkeit
I2cstop
Waitms 250
I2cstart 'Beide Motoren Rechts drehen
I2cwbyte &H58
I2cwbyte 35 'Kennung
I2cwbyte 5 'Befehl
I2cwbyte 2 'Motorwahl
I2cwbyte 1 'Richtung
I2cstop
Waitms 250
I2cstart
I2cwbyte &H58
I2cwbyte 35 'Kennung
I2cwbyte 2 'Befehl
I2cwbyte 2 'Motorwahl
I2cwbyte 195 'Geschwindigkeit
I2cstop
Wait 4
I2cstart
I2cwbyte &H58
I2cwbyte 35 'Kennung
I2cwbyte 2 'Befehl
I2cwbyte 3 'Motorwahl
I2cwbyte 0 'Geschwindigkeit
I2cstop
Wait 1




Return
'------------- Hilfsfunktionen für SRF02 ----------


Function Srf02_firmware(byval Slaveid As Byte) As Byte
Local Firmware As Byte
Local Slaveid_read As Byte

Slaveid_read = Slaveid + 1

I2cstart
I2cwbyte Slaveid
I2cwbyte 0 'Leseregister festlegen
I2cstop

I2cstart
I2cwbyte Slaveid_read
I2crbyte Firmware , Nack
I2cstop

Srf02_firmware = Firmware
End Function



Function Srf02_entfernung(byval Slaveid As Byte) As Integer
Local Lob As Byte
Local Hib As Byte
Local Firmware As Byte
Local Temp As Byte
Local Slaveid_read As Byte

Slaveid_read = Slaveid + 1

'Messvorgang in starten
I2cstart
I2cwbyte Slaveid
I2cwbyte 0
I2cwbyte 81 'in Zentimetern messen
I2cstop


Waitms 65 'minimale Wartezeit für Messung bei SRF02

I2cstart
I2cwbyte Slaveid
I2cwbyte 2 'Leseregister festlegen
I2cstop


I2cstart
I2cwbyte Slaveid_read
I2crbyte Hib , Ack
I2crbyte Lob , Nack
I2cstop


Srf02_entfernung = Makeint(lob , Hib)
End Function


mfg jörg