Archiv verlassen und diese Seite im Standarddesign anzeigen : C# Kommunikation zwischen RP6 und Computer
Mc Delta
31.05.2010, 18:17
Hallo an alle,
Ich würde gerne wissen, wie ich eine Datenübertragung zwischen dem RP6 und meinem Computer mithilfe des USB-Interfaces herstellen kann. Ich würde das gerne in Visual C# realisieren.
Ziel soll es sie, dass man einen Button licken kann und daraufhin wird ein Befehl vom Computer zum RP6 gesendet. Der RP6 lässt, nachdem er den Befehl empfangen hat seine LEDs aufleuchten.
Vielleicht gibt es schon Leute die mehr Erfahrung damit haben als ich. Dann bitte den minimal C#-Code zur initialisierung und senden eines Wortes posten. Oder irgendwelche Vorschläge.
Danke!
Fabian E.
31.05.2010, 19:08
Ähm, du hast doch die ganze Zeit auf mein Projekt verwiesen in deinen Beiträgen...
Bei mir ist alles in C# geschrieben...
Schau dir einfach mal im Projekt die Datei "RP6PortWrapper.cs" an.
Du kannst aber auch mal bei Google nach "C#" und "Serial Port" suchen.
Da solltest du was finden.
Vom Prinzip her:
//Init
Port = new SerialPort(portName, baudRate, Parity.None, 8, StopBits.One);
//Öffnen
Port.Open();
//Senden
Port.Write(str);
//Empfangen
string received = Port.ReadExisting();
//Schließen
Port.Close();
Du verwendest einfach die Serialportklasse im Namespace System.IO.Ports, die hat zwar die ein oder andere Macke funktioniert aber ansich ganz gut.
Wie die verwendet wird hat bereits Fabian E. ganz gut beschrieben. Eventuell braucht du noch das SerialPort.DataRecieved Event.
Mc Delta
01.06.2010, 18:32
Danke erst mal für deine Antwort.
Das Minimalprogramm (eine Form und ein Button zum senden) ist jetzt fertig und es treten keine Errors auf.)
Nun ist die Frage, wie kann ich mit dem RP6 das gesendete Datenwort auslesen? Kann ich dafür die Standart RP6-lib benutzten? Aus deinen Programmcodes werde ich nicht so richtig schlau. Könntest du bitte wieder nur das minimale posten. Wäre wirklich super.
private void button1_Click(object sender, EventArgs e)
{
SerialPort port = new SerialPort("com1", 9600, Parity.None, 8, StopBits.One);
MessageBox.Show("connecting......");
port.Open();
port.Write("connect");
}
Fabian E.
01.06.2010, 18:48
Dazu kannst du doch einfach mal in die Anleitung gucken. Dort steht, wie man Daten von UART liest.
Mc Delta
01.06.2010, 18:51
Die anleitung vom RP6 oder vom Mega 32?
Fabian E.
01.06.2010, 19:06
Beides, wenn du aber auf der M32 auslesen willst musst du natürlich in die anleitung gucken ;)
Mc Delta
02.06.2010, 17:30
Ok,
jetzt habe ich ein Programm was mir anzeigt, wenn "connect" gesendet wird. Es funktioniert auch, weil wenn ich im Terminal connect eingebe und dann Enter drücke leuchten die LEDs auf. Doch meine Form funktioniert noch nicht einwandfrei. Die LEDs blinken nicht wenn ich auf Button1 klicke sondern erst wenn ich Die MSGBox bestätige.
Hast du eine Ahnung woran das liegen könnte?
Mc Delta
02.06.2010, 17:32
#include "RP6RobotBaseLib.h"
int main(void)
{
initRobotBase();
char receiveBuffer[7];
while(true)
{
receiveBytes(7);
waitUntilReceptionComplete();
copyReceivedBytesToBuffer(&receiveBuffer[0]);
if(strcmp(receiveBuffer,"connect"))
{
setLEDs(0b111111);
}
}
}
hätte ich fast vergessen!
Fabian E.
02.06.2010, 18:18
Naja dafür brauche ich schon den C# Code ;)
Mc Delta
02.06.2010, 20:49
steht ein paar Beiträge darüber.
Ganz einfach...das Programm bleibt an der Stelle wo die Messagebox aufgeht "hängen". D.h. erst wenn du die Messagebox schließt werden die darauf folgenden Programmzeilen ausgeführt.
Mc Delta
02.06.2010, 21:50
Also muss ich die Messagebox weglassen?
Wenn du nich immer drauf klicken willst ja. Ansonsten, erstell dir halt ein eignes Form das du dann mit Form.Show() aufrufst. Dann wird auch der Code danach ausgeführt.
Martinius11
03.06.2010, 01:43
Es gab mal in der c´t ein großes Mitmachprojekt in dem ziemlich das selbe gemacht wurde.
Mc Delta
03.06.2010, 08:34
Meinst du hier im Forum für den RP6 oder woanders?
Ich habe die MSGbox jetzt rausgenommen und alles läuft so wie es sollte.
Nur will ich nicht die UARTlib des RP6 verwenden sondern mit AVR-Studio ein solches Sende- und Empfangsprogramm schreiben.
@Fabian,
verwendest du eigentlich die Lib vom RP6 um über UART zu kommunizieren?
Fabian E.
03.06.2010, 10:16
Ja klar, warum auch nicht?
Die Lib stellt dir ja nur Methoden bereit, mit denen du Sachen senden und empfangen kannst.
Der Großteil der Arbeit kommt ja dann noch, nämlich die Auswertung der empfangenen Befehle.
Mc Delta
04.06.2010, 11:27
Mal eine allgemeine Frage:
Ist es möglich den RP6 ohne das sich ein Programm auf ihm befindet über das Interface zu programmieren?
-schumi-
04.06.2010, 11:53
Damit der mit dem Interface was anfangen kann muss (soweit ich weis) der Bootloader auf dem Atmega32 drauf sein. Der "Programmspeicher löschen"-Button im RP6Loader löscht nur das Programm das du im Programmers notepad geschrieben hast, der Bootloader bleibt da.
Aber man kann den RP6 auch über ISP programmieren (ohne Bootloader)
MfG
-schumi-
Mc Delta
04.06.2010, 12:00
Köönte ich denn auch über RS232 Texte übertragen?
Mc Delta
04.06.2010, 12:05
Und kann ich dann auch Daten vom PC empfangen?
Fabian E.
04.06.2010, 15:29
Warum willst du denn nicht mit dem Interface arbeiten?
Das ist die einfachste und billigste Lösung.
Mc Delta
04.06.2010, 15:51
Die billigste will ich nicht sagen und die Einfachste auch nicht unbedingt.
Schließlich benötigt man dafür einen Bootloader. Für einen In System Programmer so weit ich weiß nicht.
Fabian E.
04.06.2010, 16:49
Nein, aber du brauchst für ISP ein ISP-Kabel. Wenn du das nicht selbst bauen willst ist das auch sehr teuer.
Und für das Interface ist doch schon alles dabei.
Welchen Vorteil hast du, wenn du ISP benutzt?
Mc Delta
04.06.2010, 18:04
Ich habe de In System Programmer selber gebaut. Für höchstens 4 Euro.
Mir geht es darum, nicht nur den RP6 flashen und anfunken zu können sonder ich will auch einen M32 ohen schnickschnack benutzten können. Und das mit möglichst simplen Programmen und ohne die Libs vom RP6.
Mc Delta
04.06.2010, 18:09
Wenn das alles über eine Schnittstelle geht die man mit zwei RFM-Modulen überbrücken kann wäre das super
-schumi-
04.06.2010, 19:45
Köönte ich denn auch über RS232 Texte übertragen?
Ja, das ist einfacher als man denkt
Man muss nur den Port mit der richtigen Bitrate starten und (ich glaub) DTR auf high setzen, sonst gibts nen dauerreset
Eine Schaltung um +-12V auf TTL (0-5V) zu kriegen und andersherum gibts hier:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=53581
(Vor-vorletzter Beitrag (von mir) das Bild zum runterladen)
Ein Programm zu Schreiben und Empfangen für Textdateien hab ich mal in FreeBASIC realisiert (Keywords sind leicht verständlich, also sollte eigentlich kein Problem sein, notfalls in der Befehlsrefferenz auf "freebasic-portal.de" nachgucken):
ACHTUNG: "com3" muss durch den entsprechenden Port ersetzt werden!
DECLARE FUNCTION TinyInput (Question AS STRING ,Original AS STRING) AS STRING
DIM AS STRING*1 temp
DIM AS STRING inputtemp, key
DIM AS INTEGER letternumber, oldlocx, oldlocy
SCREENRES 800, 600, 32
oldlocx = 1
oldlocy = 1
OPEN com "com3: 38400, N, 8, 1,cs0,ds0,cd0,rs" AS #1 '----- Das "com3" muss durch den enstprechenden Port ersetzt werden!!
COLOR RGB(0, 100, 0), RGB(255, 255, 255)
CLS
DO
oldlocx = POS
oldlocy = CSRLIN
PRINT " ";
LOCATE oldlocy, oldlocx
LINE (8*oldlocx-8, 8*oldlocy-1)-(8*oldlocx-8, 8*oldlocy-8), 0
key = INKEY$
IF key <> "" AND key <> CHR(13) THEN
IF key = CHR(27) OR key = CHR(255)+"k" THEN CLOSE #1: system
COLOR RGB(200, 0, 0)
inputtemp = TINYINPUT(">> ", key)
COLOR RGB(0, 100, 0)
FOR letternumber = 1 TO LEN(inputtemp)
PUT #1,, MID(inputtemp, letternumber, 1)
NEXT
PUT #1,, CHR(10)
ENDIF
WHILE LOC(1) > 0
IF key = CHR(27) THEN CLOSE #1: SYSTEM
GET #1,, temp
oldlocx = POS
oldlocy = CSRLIN
PRINT " ";
LOCATE oldlocy, oldlocx
PRINT temp;
WEND
LOOP
CLOSE #1
FUNCTION TinyInput (Question AS STRING ,Original AS STRING) AS STRING
DIM AS INTEGER Cur_line, Cur_pos, Cursorpos
DIM AS STRING key
Cur_line = CSRLIN
Cur_pos = POS
Cursorpos = 2
PRINT Question; Original;
LINE (8*(Cur_pos+LEN(Question)+Cursorpos)-16, 8*Cur_line-1)-(8*(Cur_pos+LEN(Question)+Cursorpos)-16, 8*Cur_line-8), 0
DO
DO
key = INKEY$
LOOP UNTIL key <> ""
IF key = CHR(13) THEN
EXIT DO
ELSEIF key = CHR(8) AND Cursorpos > 1 THEN
Original = LEFT(Original, Cursorpos-2)+RIGHT(Original, LEN(Original)-Cursorpos+1)
Cursorpos = Cursorpos-1
ELSEIF key = CHR(255)+"S" AND Cursorpos < LEN(Original)+1 THEN
Original = LEFT(Original, Cursorpos-1)+RIGHT(Original, LEN(Original)-Cursorpos)
ELSEIF (key = CHR(255)+"M") AND Cursorpos < LEN(Original)+1 THEN
Cursorpos = Cursorpos+1
ELSEIF (key = CHR(255)+"K") AND Cursorpos > 1 THEN
Cursorpos = Cursorpos-1
ELSEIF LEN(key) = 1 AND key <> CHR(27) AND key <> CHR(8) then
Original = LEFT(Original, Cursorpos-1)+key+RIGHT(Original, LEN(Original)-Cursorpos+1)
Cursorpos = Cursorpos+1
END IF
LOCATE Cur_line, Cur_pos+LEN(Question)
PRINT SPACE(LEN(Original)+2);
LOCATE Cur_line, Cur_pos+LEN(Question)
PRINT Original;
LINE (8*(Cur_pos+LEN(Question)+Cursorpos)-16, 8*Cur_line-1)-(8*(Cur_pos+LEN(Question)+Cursorpos)-16, 8*Cur_line-8), 0
LOOP
LOCATE Cur_line, Cur_pos+LEN(Question)
PRINT SPACE(LEN(Original)+2);
LOCATE Cur_line, Cur_pos+LEN(Question)
PRINT Original
TINYINPUT = Original
END FUNCTION
(anbei die *exe falls du keinen FreeBASIC Compiler hast, gibts aber KOSTENLOS auf "freebasic-portal.de")
MfG
-schumi-
[EDIT]
hab ich vergessen: an welchem Port wird der RP6 voraussichtlich hängen, damit ich es richtig compilieren kann?
Mc Delta
04.06.2010, 21:38
Bei mir hängt er auch an Com3! Schade das man mit RS232 nicht flashen kann!?
-schumi-
05.06.2010, 09:59
"auch an Com3" - dann brauch ich sogar nicht nochmal compilieren (3 sec.) :cheesy:
Funzt übrigens auch mit dem USB-interface (das ist ja nichts anderes als eine RS232, nur mit TTL-Pegel)
Ich poste dann Heute noch ein kürzeres Beispiel mit schönen Kommtentaren (hm, vieleicht das wo die Akkuspannung ausgelesen wird..) :-)
MfG
-schumi-
Mc Delta
05.06.2010, 10:25
Ich habe mir gerade einen Max232 aus einem altem DVBT-Empfänge ausgelötet und werde jetzt eine Grundschaltung aufbauen.
-schumi-
05.06.2010, 14:49
So, hier wie vesprochen da Beispiel zum Akkuspannung auslesen, einfacher und ausführlichst kommentiert, damit kannst du glaub ich mehr anfangen...
(am besten in Notepad reinkopieren, sonst sind teilweise die Kommentare so verschoben und das Ganze is wahnsinnig unübersichtlich)
DECLARE SUB RP6_reset () ' Die SUBs sind dann Befehle mit Parametern,
DECLARE SUB RP6_getID (Board AS STRING) ' der Code dazu steht am Ende des Progs
DECLARE SUB errorhandler (errormessage AS STRING)
DECLARE function RP6_Batteryvoltage () AS double ' Wie eine SUB, nur das man es als Variable
' verwendet, Code steht auch am Ende
DIM AS STRING sendstring, receivestring, inputtemp, Board ' Variablen: String = Satz bzw. Buchstaben
DIM AS STRING*1 temp ' String, in den nur 1 Buchstabe rein passt
DIM AS INTEGER letternumber ' Ganzzahl, 16 Bit (-32768 bis 32767)
DIM AS DOUBLE batvoltage ' Gleitpunktzahl, 64 Bit,
' 16 Nachkommastellen
SCREENRES 640,480,32 ' Fenster machen: 640*480 Pixel, 32 Bit Tiefe
COLOR 0, RGB(255,255,255) ' Farbe: Text Schwarz, Hintergrund Weis
CLS ' Fenster mit Hintergrundfarbe löschen
PRINT ' Nächste Zeile
PRINT "Resetting.."; ' Text ausgeben
RP6_RESET ' SUB wird aufgerufen (siehe unten)
PRINT " Done"
OPEN com "com3: 38400, N, 8, 1,cs0,ds0,cd0,rs" AS #1 'Com3 wird geöffnet mit:
' - 38400 Baud Übertragungsgeschwindigkeit
' - keine Parität (N steht für none)
' - 8 Datenbits
' - 1 Stopbit
' - CTS abschalten
' - DSR abschalten
' - "Carrier Datect"-Dauer abschalten
' - unterdrücke RTS-Erkennung
PRINT
PRINT "Trying to get right ID..";
RP6_GETID Board ' Hier wird von der SUB ein Wert (welches Board
' am PC hängt) in den Parameter geschrieben,
' hätte man auch als Function machen können
PRINT " Done"
PRINT "Got right ID from "+Board
PRINT
IF Board = "Base-Board" THEN ' Weil nur das Base-Board die Akkuspannung
' auslesen kann
PRINT "Reading batteryvoltage..";
batvoltage=RP6_BATTERYVOLTAGE () ' Hier wird die Function aufgerufen
PRINT " Done"
PRINT "Batteryvoltage is ";
PRINT USING "#.##"; batvoltage; ' Inhalt von batvoltage (Zahl) in der Form
' X.XX ausgeben. ";" heißt nicht in die
' nächste Zeile, sondern dahinter
' weiterschreiben
PRINT " V" ' für Volt
ENDIF
'Hier wird noch ausgegeben was der RP6 sendet bis man das Programm beendet
DO
if (LOC(1) > 0) THEN ' Falls was im Com-port-Puffer drin ist
GET #1,,temp ' Buchstabenweise in temp speicher
PRINT temp; ' auf den Bildschirm malen
ENDIF
LOOP UNTIL INKEY$=CHR(27) OR INKEY$ = CHR(255)+"k" ' ESC gedrückt oder auf das X geklickt wird
CLOSE #1 ' Com-Port wieder Schließen
SYSTEM ' Programm beenden (zu System zurück kehren)
'==================== SUBs & Functionen ================================================== ==========
SUB RP6_reset () ' RP6 resetten, damit der Bootloader
' auf Befehle wartet
' (Im Terminal des RP6Loaders "[RP6BOOT]")
OPEN com "com3: 38400, N, 8, 1,cs0,ds0,cd0" AS #1 ' Com-Port öffnen, aber RTS setzen, damit der
' RP6 resettet
SLEEP 2 ' 2ms lang resetten
CLOSE #1 ' Den Com-Port wieder schließen
END SUB
SUB RP6_getID (Board AS STRING) ' Jedes Board hat eine andere ID, damit der
' RP6Loader unterscheiden kann was
' angeschlossen ist. Das ist wichtig
' weil nur die Base-Station die Akkuspannung
' auslesen kann
DIM AS STRING receivestring
DIM AS STRING*1 temp
DIM AS LONG starttime ' Ganzahl 32 Bit
DIM AS INTEGER letternumber
starttime = TIMER ' TIMER gibt immer die Sekunden seit
' Mitternacht zurück
receivestring = ""
DO ' Schleife
IF (LOC(1) > 0) THEN ' Falls im Port (geöffnet als #1) was drinliegt
GET #1,,temp ' dann in Buchstabenweise in temp speichern
receivestring=receivestring+temp ' und an receivestring anfügen
ENDIF
IF starttime+3<TIMER THEN ERRORHANDLER "Not able to get RP6BOOT-message!" 'falls 3+ sec. vorbei
' dann die ERRORHANDLER-sUB aufrufen mit dem
' String als Parameter
LOOP UNTIL INSTR(receivestring,"[RP6BOOT]") ' Gehe zu Schleifenanfang bis "[RP6BOOT]" im
' receivestring enthalten ist
PUT #1,,CHR(72) ' Buchstabe mit dem ASCII-wert 72 an Com-Port
' senden (immer noch als #1 geöffnet)
starttime=TIMER
receivestring=""
DO ' nochmal das Gleiche, nur für die Controler-ID
if (LOC(1) > 0) THEN
GET #1,,temp
receivestring=receivestring+temp
letternumber=letternumber+1
ENDIF
IF starttime+3<TIMER THEN ERRORHANDLER "RP6 is not sending a Controller-ID!"
LOOP UNTIL letternumber>8 ' ...bis er 8 Buchstaben gesendet hat
IF INSTR(receivestring, "RP6:"+CHR(1)+CHR(1)+CHR(4)+CHR(5)) THEN 'Code für das BaseBoard
Board="Base-Board"
ELSEIF INSTR(receivestring, "RP6:"+CHR(2)+CHR(1)+CHR(4)+CHR(3)) THEN 'Code für das M32
Board="M32-Control-Board"
ELSE ' Falls es keine der beiden
' ID's ist
Board="No Board found! - Got wrong ID!"
ERRORHANDLER "No Board found! - Got wrong ID!"
ENDIF
END SUB
SUB errorhandler (errormessage AS STRING)
PRINT
PRINT
PRINT "ERROR--ERROR--ERROR"
PRINT
PRINT "Details: "+errormessage
PRINT
PRINT "ERROR--ERROR--ERROR"
CLOSE #1 ' Nach dem Errorhandler wird das Programm
' nicht mehr weiter ausgeführt, also Port
' schließen
SLEEP ' Auf Tastendruck warten
SYSTEM ' Beenden
END SUB
FUNCTION RP6_Batteryvoltage () AS DOUBLE ' Diese Function ist eine DOUBLE-Variable
DIM AS LONG starttime
DIM AS STRING receivestring
DIM AS INTEGER letternumber
DIM AS STRING*1 temp
PUT #1,,CHR(149) ' Buchstabe mit dem ASCII-wert 149 senden
starttime=TIMER
receivestring=""
letternumber=0
DO ' Das selbe wie in der RP6_getID-sUB
if (LOC(1) > 0) THEN
GET #1,,temp
receivestring=receivestring+temp
letternumber=letternumber+1
ENDIF
IF starttime+3<TIMER THEN ERRORHANDLER "Can't get batteryvoltage!"
LOOP UNTIL letternumber>2 ' Bis er 2 Buchstaben gesendet hat
rp6_batteryvoltage=(ASC(receivestring,1)+256*ASC(r eceivestring,2))/100 'Der Wert für die
' Akkuspannung besteht aus 16 Bit. Die sind
' aufgeteilt in 2 mal 8 Bit, die die ASCII-Werte
' Der jeweils gesendeten Buchstaben entsprechen
' Dann das ganze nur noch durch 100 teilen
END FUNCTION
Anbei noch die *.exe
MfG
-schumi-
Mc Delta
05.06.2010, 18:14
Danke dafür!
Ich habe im Netz bei der Suche nach einer Funkverbindung für den Mega 32 zum PC das Flashcraft-Funkboard entdeckt. Leider ist die Homepage momentan down aber ich habe trotzdem alle wichtigen Dateien "sichergestellt". Download (http://www.mikrocontroller.net/attachment/57372/Flashcraft.zip)
Ich habe noch mal eine Frage:
Brauche ich um Daten mit dem Modul zu verschicken und den Mikrocontroller zu programmieren einen Bootloader auf ihm?
-schumi-
05.06.2010, 21:07
Wenn du ihn wie gewohnt mit Programmers Notepad und den RP6-M32-Libs programmieren möchtest schon.
Wobei "einen" Bootloader wohl der falsche Ausdruck ist, eher so: den Bootloader, der schon auf dem RP6 und dem M32 drauf ist
Dazu brauchst du nur folgende Leitungen, bzw. Funkverbindungen:
PC: <--------> RP6 (bzw. M32):
Tx ---------> Rx
Rx <--------- Tx
RTS --------->MReset
Mc Delta
06.06.2010, 10:07
Die Leitungen werden das geringste Problem sein.
Wenn ich jetzt einen nagelneuen Mega 32 kaufe, dann ist der doch "sauber" (ohene Software und Bootloader)?
Die RP6 Base und auch die M32 haben einen Bootloader vorinstalliert (Steht auch in der anleitung) Ohne den könntest du keine Programme über das USB-Interface bzw. eine RS232 schnittstelle in den Controller laden.
Wenn du dir jetzt einen nagelneuen Atmega32 kaufst hat der keinen Bootloader drauf. Den müsstest du dann über ISP flashen
(Wobei ich deine Problematik mit dem Bootloader nicht ganz nachvollziehen kann, is doch praktisch den Controller über so ein Interface flashen zu können).
Mc Delta
06.06.2010, 10:37
Die Problematik besteht darin, dass Ich nicht weiß woher ich einen passenden Bootloader für den Mega 32 herhole und wie ich ihn über ISP in den Controller laden soll. Habe ich eben noch ncht gemacht.
PS: Ein Board wo ich einen M32 reinstecken kann den ich dann über ISP flashen kann besitze ich.
Carlos31
06.06.2010, 11:49
hier ist der bootloader vom rp6 ,
https://www.roboternetz.de/phpBB2/viewtopic.php?t=33779
Mc Delta
06.06.2010, 17:38
Kennt jemand von euch ein universell einsetzbares Terminalprogramm mit zugehörigem Bootloader für den Mega 32?
PS: Ich spreche nicht vom RP6 sondern allgemein über den Mega 32!
-schumi-
06.06.2010, 20:38
"mit zugehörigem Bootloader" - Den Bootloader für den Atmega32 allgemein gibt es so gesehen nicht.
Du kannst dir auch selbst einen schreiben, der auf deine Bedürfnisse zugeschnitten ist. Wenn du für die Kommunikation die selbe Anschlussbelegung nimmst wie beim RP6 bzw. M32-Board (also Tx, Rx und MReset) müsstest du auch dem Bootloader vom RP6 oder dem M32 nehmen können, der ist ja schließlich nicht schlecht.
(Abgesehen dass du dann immer noch wie für den RP6 gewohnt proggen und den RP6Loader nutzen kannst, musst dir nur selbst eine Lib basteln, denn dein Atmega32 wird warscheinlich keine Ketten und ACS usw. haben)
Wenn du den nimmst kann ich dir HTerm als Terminalprogramm empfehlen
Mc Delta
07.06.2010, 13:40
Kann ich damit dann auch über RS232 programmieren oder ist der Bootloader vom RP6 nur auf USB zugeschniten?
Kann man mit Hyper Terminal auch Hex-Dateien versenden?
-schumi-
07.06.2010, 14:19
"oder ist der Bootloader vom RP6 nur auf USB zugeschniten? " - Der ist gar nicht auch USB zugeschnitten, sondern auf die Kommunikation via RS323, das Problem dabei ist folgendes:
Der PC hat die Pegel -12V und +12V
Der RP6 hat die Pegel 0 und +5V (nennt sich TTL-Pegel)
Um den PC-Pegel auf den vom Roboter anzupassen braucht man einen RS323-Pegelwandler oder du nimmst die Schaltung von mir (siehe link den ich dir gegeben hab)
Dann kannst du ihn ohne irgendeine Veränderung den RP6 über die RS232 des PC's programmieren, du musst nur den USB-Treiber für das Interface wieder deinstallieren, damit der RP6Loader im RS323-Modus startet
(genau um das geht es in dem link)
Das Teil, dass du beim Programmieren zwischen den RP6 und dem USB-Anschluss klemmst ist eine RS323 Schnittstelle mit TTL-Pegel (0V und +5V), die man mit USB ansteuert.
Das mit dem Hex via HTerm versenden wird so warscheinlich nicht gehen. Wie das ganz genau geht weis ich nicht, sonst hätte ich es schon mit FreeBASIC realisiert, um Programme im Programmers Notepad per Tastenkombination hochladen zu können.
Aber du kannst dann ja immer noch den RP6Loader nehmen
Mc Delta
07.06.2010, 17:05
Also dann mach ich jetzt folgendes:
1. Ich schreibe den Bootloader vom RP6 auf den Mega 32
2. Ich setze die Fusebits neu (wie eigentlich ich brauche doch BootsZx und BootRST?)
3. Ich baue die RS232 Schaltung wie im leichten Einstieg (Wiki) beschrieben auf.
4. Ich deinstalliere den USB-Treiber vom RP6
6. Ich lade ein einfaches Test-Programm auf den Mega 32 und hoffe das alles funktioniert.
Hallo,
wie die Fusebits gesetzt werden müssen steht in dem Bootloader PDF.
Das USB Interface vom RP6 IST ein normales RS232 (TTL) Interface.
Das ist ein USB<-> Seriell Adapter - nur eben mit Mikrocontroller kompatiblem 5V Pegel.
Den USB Treiber brauchst Du nicht zu deinstallieren.
Im RP6Loader Ordner /config/rp6loader.cfg da den Eintrag
BootLoader.useNativeLib.windows=JD2XX
in
BootLoader.useNativeLib.windows=RXTX
umändern.
(der RP6Loader darf währendessen natürlich nicht laufen!)
Der RP6Loader wurde u.a. deshalb für den RP6 geschrieben eben weil es sowas in der Art für die AVRs nicht gab/gibt.
(d.h. Programmierung + Terminalprogramm in einem über nur ein gemeinsames Kabel, plus Hexfile Liste)
MfG,
SlyD
PS:
Die Bootloader sind natürlich recht speziell und man muss auch einen Start/Stop/Reset Taster passend wie beim RP6 anschließen bzw. beim M32 über den I2C Bus.
Hier die standard Einstellungen für die I/Os:
Base Bootloader:
Clock: 8 MHz
Initial Pin Settings:
#define INIT_DDRA 0b00000000
#define INIT_PRTA 0b00000000
#define INIT_DDRB 0b01011000
#define INIT_PRTB 0b00000000
#define INIT_DDRC 0b10001100
#define INIT_PRTC 0b00000000
#define INIT_DDRD 0b11110010
#define INIT_PRTD 0b00000001
M32 Expansion Bootloader:
Clock: 16 MHz
Initial Pin Settings:
#define INIT_DDRA 0b00000000
#define INIT_PRTA 0b00000000
#define INIT_DDRB 0b10111000
#define INIT_PRTB 0b01000000
#define INIT_DDRC 0b00000000
#define INIT_PRTC 0b11111100
#define INIT_DDRD 0b10010010
#define INIT_PRTD 0b01100001
Einige der Pins schalten natürlich auch während des Bootens (LEDs und SPI Register).
Fabian E.
07.06.2010, 19:17
Kurze Frage, gibts eigentlich auch dem Code für den RP6Loader irgendwo?
Ich hätte nämlich Lust, mir das ganze in C# selbst zu schreiben, da mir der Loader naja etwas zu langsam in der Bedienung ist...
Ist der Code irgendwie sonderlich kompliziert?
Mc Delta
07.06.2010, 21:06
Das ist irgendwie auch nicht gut "ausgeschildert" und ich weiß nicht ob der Code überhaupt bei der mitgelieferten CD drauf ist.
Ich denke für den Code müsstest du direkt bei AREXX anfragen. Da die auch geld mit ihren Entwicklungen machen wollen denke ich jedoch nicht dass die den einfach so rausrücken
Fabian E.
07.06.2010, 21:22
Naja, der Loader an sich wird ja nicht verkauft... Auch ohne den Loader (bzw mit dem Source) muss ich mir ja noch den RP6 kaufen.
Es wird ja primär der Roboter verkauft und nicht die Software oder?
Kann vielleicht SlyD was dazu sagen?
radbruch
07.06.2010, 21:42
Hallo
Die kompletten Sourcen des Loaders würden uns vermutlich überfordern;) Aber nur das Flashprotokoll würde auch schon ausreichen um Flashfunktionen in eigene Anwendung einzubauen.
Gruß
mic
Hi
Die kompletten Sourcen des Loaders würden uns vermutlich überfordern;) Aber nur das Flashprotokoll würde auch schon ausreichen um Flashfunktionen in eigene Anwendung einzubauen.
Muss man einen Programmcode vollständig verstehen um ihn zuändern ? ^^
radbruch
07.06.2010, 21:55
Es sollte eine Brücke für arexx sein...
Mc Delta
07.06.2010, 21:56
Nein, du musst nur das ändern was du verstehst. \:D/
Der Quellcode ist nicht verfügbar (habe ich hier auch schon öfters erläutert).
Ein gewisser "Kopierschutz" muss sein - bei Produktion in China findet man sein Programm sonst schnell leicht verändert in völlig anderen geklonten Produkten wieder...
> Protokoll
Ich hatte das vor kurzem hier mal indirekt als Debug Ausgabe gepostet - mal die SuFu verwenden.
MfG,
SlyD
-schumi-
07.06.2010, 23:37
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=49584&highlight=
Da ist es. Hab dort vor einiger Zeit auch mal ne Frage dazu gestellt (ganz unten, logischerweise), die mir bis heute leider keiner beantworten konnte/wollte
(Ich weis, jede menge Text, aber da hab ich gerade n Laptop repariert und das hat so ne geile Tastatur :-))
ja sorry - hab ich gelesen hatte aber keine Zeit da zu antworten und habs dann vergessen ;)
Morgen...
Btw. für vieles hilft google umgehend (Hexfile Aufbau, CRC16 ... ).
radbruch
08.06.2010, 00:14
Hallo
Ein gewisser "Kopierschutz" muss sein - bei Produktion in China findet man sein Programm sonst schnell leicht verändert in völlig anderen geklonten Produkten wieder... Ich vermute, auch hier in Deutschland würden sich einige Hersteller für den Code interessieren ;)
Gruß
mic
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.