- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 4 von 6 ErsteErste ... 23456 LetzteLetzte
Ergebnis 31 bis 40 von 55

Thema: C# Kommunikation zwischen RP6 und Computer

  1. #31
    Erfahrener Benutzer Roboter-Spezialist Avatar von -schumi-
    Registriert seit
    30.12.2009
    Ort
    Wasserburg am Inn / Bayern
    Alter
    31
    Beiträge
    449
    Anzeige

    E-Bike
    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)
    Code:
    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(receivestring,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-
    Angehängte Dateien Angehängte Dateien

  2. #32
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    04.03.2010
    Beiträge
    205
    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
    Ich habe noch mal eine Frage:
    Brauche ich um Daten mit dem Modul zu verschicken und den Mikrocontroller zu programmieren einen Bootloader auf ihm?
    Nichts existiert durch sich allein!
    Bild hier  

  3. #33
    Erfahrener Benutzer Roboter-Spezialist Avatar von -schumi-
    Registriert seit
    30.12.2009
    Ort
    Wasserburg am Inn / Bayern
    Alter
    31
    Beiträge
    449
    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

  4. #34
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    04.03.2010
    Beiträge
    205
    Die Leitungen werden das geringste Problem sein.
    Wenn ich jetzt einen nagelneuen Mega 32 kaufe, dann ist der doch "sauber" (ohene Software und Bootloader)?
    Nichts existiert durch sich allein!
    Bild hier  

  5. #35
    shedepe
    Gast
    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).

  6. #36
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    04.03.2010
    Beiträge
    205
    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.
    Nichts existiert durch sich allein!
    Bild hier  

  7. #37
    Benutzer Stammmitglied
    Registriert seit
    04.08.2007
    Ort
    Bregenz
    Alter
    48
    Beiträge
    72

  8. #38
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    04.03.2010
    Beiträge
    205
    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!
    Nichts existiert durch sich allein!
    Bild hier  

  9. #39
    Erfahrener Benutzer Roboter-Spezialist Avatar von -schumi-
    Registriert seit
    30.12.2009
    Ort
    Wasserburg am Inn / Bayern
    Alter
    31
    Beiträge
    449
    "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

  10. #40
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    04.03.2010
    Beiträge
    205
    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?
    Nichts existiert durch sich allein!
    Bild hier  

Seite 4 von 6 ErsteErste ... 23456 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests