PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Daten von Mikrocontroller zum PC



yoyoba
04.04.2010, 15:37
Moin zusammen,

ich bin derzeitig einwenig am mit meinem Programmierboard von Ulrich Radig am tüfeln, habe hier einige Spannungsmessung, welche jede Sekunde durchgeführt werden, diese würde ich gerne über RS232 an den PC senden, welcher diese dann in einem Textdokument oder Excel Tabelle speichert, leider bin ich in diesem Gebiet von Anfang bis Ende überfragt, mit welchen Befehlen kann ich diese Daten zum PC in ein Dokument senden?


MfG

H.Brill
05.04.2010, 08:13
An einem ähnlichen Problem bin ich im Moment
auch dran. Ich messe 2 Temperaturen mit 2 Dallas
Sensoren (1820) und schicke diese über die RS232.

Ich arbeite zwar nicht mit Excel sondern mit PureBasic
(www.PureBasic.de).

Wenn ich jetzt auf PC-Seite die RS232 immer polle,
friert mir meine GUI (Benutzeroberfläche) ein und es
kommen auch öfter nur Textfragmente an. Habs mal
in eine Textdatei geschrieben. Da werde ich um einen
Timer oder besser noch einen Thread nicht drum herum
kommen.

Wäre es besser, wenn ich den UART - Interrupt benutze,
um vom PC (zum Bsp. ein M senden) die Messungen
anzustoßen bzw. zu beenden ?



' Beispiel für das myAVR Board 1 & 2 mit LCD und 1wire Temperatursensoren an Pin 5 von Port C
' Zwei 1wire Temperatursensoren DS1820
$regfile = "m8def.dat"
$crystal = 3686400
$baud = 9600

' Pin für 1wire Schnittstelle festlegen, Schnittstelle wird von BASCOM durch Software realisiert
Config 1wire = Portc.5

Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim I As Byte
Dim Nr As Byte
Dim Sc(9) As Byte
Dim T As Integer
Dim T1 As Integer
Dim T2 As String * 4
Dim Ts As Integer
Dim T3 As String * 15

' Ersten angeschlossenen DS1820 finden und Adresse auslesen
Dsid1(1) = 1wsearchfirst()
Waitms 500
' Zweiten DS1820 suchen und Adresse auslesen
Dsid2(1) = 1wsearchnext()
Waitms 500

'Thermostat - Ts = Schalttemperatur x 10
Ts = 2500

Do
' Alle angeschlossenen DS1820 zum Messen veranlassen
1wreset
1wwrite &HCC
1wwrite &H44
Waitus 200
' Den ersten Sensor auswählen
1wverify Dsid1(1)
' Kommando READ SCRATCHPAD
1wwrite &HBE
Sc(1) = 1wread(9)
If Sc(9) = Crc8(sc(1) , 8) Then
' Genauere Temperaturberechnung auf 0,1 °C
I = Sc(1) And 1
If I = 1 Then Decr Sc(1)
T = Makeint(sc(1) , Sc(2))
T = T * 50
T = T - 25
T1 = Sc(8) - Sc(7)
T1 = T1 * 100
T1 = T1 / Sc(8)
T = T + T1
T = T / 10
T2 = Str(t)
' Temperatur in 0,1 Grad Schritten ausgeben
T3 = Format(t2 , "+00.0") + " C"
End If
Waitms 500
' Ausgabe alle 0,5 Sekunden
' Den zweiten Sensor auswählen
1wverify Dsid2(1)
' Kommando READ SCRATCHPAD
1wwrite &HBE
Sc(1) = 1wread(9)
If Sc(9) = Crc8(sc(1) , 8) Then
' Genauere Temperaturberechnung auf 0,1 °C
I = Sc(1) And 1
If I = 1 Then Decr Sc(1)
T = Makeint(sc(1) , Sc(2))
T = T * 50
T = T - 25
T1 = Sc(8) - Sc(7)
T1 = T1 * 100
T1 = T1 / Sc(8)
T = T + T1
T = T / 10
T2 = Str(t)
' Temperatur in 0,1 Grad Schritten ausgeben
T3 = T3 + "|" + Format(t2 , "+00.0") + " C" + Chr(0)
Print T3
End If
' Ausgabe alle 0,5 Sekunden
Waitms 500
Loop
End

Neutro
05.04.2010, 09:31
Hallo zusammen, ich denke mal das euch dieses Wiki weiterhelfen wird:
http://www.rn-wissen.de/index.php/Windows_Programm_zum_Steuern_des_AVR%27s
Hier wird die kommunikation zwischen PC und AVR ziehmlich gut veranschaulicht. Allerdings wird hier nicht beschrieben wie man die empfangenen Daten im Exel speichert.

Hoffe ich konnte euch ein wenig weiterhelfen.

Gruß

Neutro

yoyoba
18.04.2010, 12:15
Tut mir leid das ich jetzt erst antworte, war ein wenig verhindert, danke für den Link aber eine Frage bleibt mir noch...


if serialport1.BytesToRead > 0 then

kann man hier einstellen, welche bytes er ausliest? im moment liest er ja jeden byte aus, der größer als 0 ist! wenn ich z.b. nur bestimmte bytes übertragen haben will...


MfG

H.Brill
18.04.2010, 14:55
Der fragt den Serialport-Puffer ab, ob der größer 0 ist,
nicht ob das empfangene Byte > 0 ist. Ist aber in jeder
Programmiersprache, die ich kenne, gleich.

Wenn du nur bestimmte Zeichen übertragen haben
willst, kannst du das ja im Bascom - Programm bestimmen.
Alternativ kannst du auch einen x Bytes langen String
aus dem Port lesen und anschließend in deinem Windows-
programm filtern.

Ich lese in meinem PureBasic Programm genau 17 Zeichen
aus : -> 2 x 7 Bytes für die 2 Temperaturen
-> 1 Byte (ist ein Pipe-Zeichen ALT+124 |), das die beiden
Temperaturen voneinander trennt
-> + 2 Bytes (Chr(13) + Chr(10), das Bascom
beim Print - Befehl sowieso anhängt.

somit kann ich dann optimal ausfiltern :



Case #PB_Event_Timer
If IsSerialPort(#My_ComPort)
Bytes = AvailableSerialPortInput(#My_ComPort)
If Bytes >= 17
;O.k., here we go, read this one
ReadSerialPortData(#My_ComPort, @String, 17)
Sensor1 = Right(String, 9) ; 2 mehr wg. CR/LF
Sensor2 = Left(String, 7)
Endif
Endif

yoyoba
18.04.2010, 15:30
ist es auch andersherum möglich, dass ich zb eine konstante im bascom-programm leer lasse und diese später über VB dort festlege?

wenn ja wie? :-k


MfG

H.Brill
18.04.2010, 16:13
Mußt du näher erklären.
Verstehe den Sinn deines Vorhabens
nicht.

yoyoba
18.04.2010, 16:20
einfahc nur so... falls du zb ne produktionsreihe von irgentetwas hast und den leuten es selber überlassen willst wie sie ihre sachen einstellen, zb eine zeitschaltuhr, man konfiguriert sie über den pc, muss dort am anfang die constante eingeben, womit die selbstgebaute zeitschaltuhr dann arbeitet

H.Brill
18.04.2010, 16:43
Könnte man auch über ein EPROM machen.
Vorkonfiguration einmal per PC reinschieben,
neues Programm für Atmega schreiben, in dem
das EPROM ausgelesen wird.

Hab da ein serielles 8fach Relaisboard, das
mir jemand mal gebastelt hat. Der hat auch
so eine Art Schaltuhr über EPROM realisiert.

Hier kannst du auch noch was lesen.

http://rowalt.de/mc/avr/avrboard/06/avrb06.htm

yoyoba
18.04.2010, 20:11
es geht ja nicht ums auslesen sondern um das beschreiben der constante

peterfido
19.04.2010, 16:11
Eine Konstante kann nicht leer gelassen werden, da der Compiler während des kompilierens die Konstante durch den Wert ersetzt. Eine Variable kann später gesetzt per PC gesetzt und auch im EEprom gespeichert werden.

yoyoba
19.04.2010, 18:22
mh stimmt, solange die variable nur abgerufen - und nicht geschrieben wird, würde ja nichts passieren! hast du eine ahnung wie man soetwas in Visual Basic realisieren könnte, dass er die variable auf eine gewünschte zahl setzt?

mws-h
20.04.2010, 07:15
Für sowas benutzt Du am besten einen Befehlsinterpreter (gibt einige Beispiele hier im Forum und im Netz) der dir den Uart ausliest und dann je nach Befehl die entsprechenden Variablen beschreibt. Damit könntest Du auch beliebige Befehle an Deinen Controller schicken und auswerten.

Ich hab das z.B. für meinen Servocontroller so gemacht allerdings in C. Der liest die einzelnen Zeichen ein und wenn er einen String zusammen hat interpretiert er den und setzt die Befehle in Servosignale um. Interrupt gesteuert damit er das System nicht unnötig belastet und die Servosimpulse verarbeitet werden können.

Der Link von H.Brill beschreibt doch die Vorgehenweise sehr gut für Basic.