www.mikrocontroller.net

Forum: Codesammlung Mega8, ADC, UART. Excelblatt als Voltmeter

Autor: Frank Simon (Gast)
Datum:
Angehängte Dateien:

Der Mega8 bekommt über RS232 ein Startsignal und sendet den gemessenen
Spannungswert gleich zurück. Am PC zeigt ein Excelblatt den Messwert
an. Alles schön kurz.
Autor: Frank Simon (Gast)
Datum:
Angehängte Dateien:

Dies ist der Assemblertext.
Autor: Frank Simon (Gast)
Datum:
Angehängte Dateien:

Und dies ist das Excel-Blatt mit dem Makro.
Viel Spaß!
Autor: dirk (Gast)
Datum:

Bei mir gibs unter Excel 2003 folgenden fehler :
MSComm1 -> Projekt oder Prcedure nicht gefunden.
Fehlermeldung kommt beim Compelieren
Autor: zotos (Gast)
Datum:

Hallo Frank,
danke für das interessante Projekt. Leider läuft es bei mir trotz der
installierten "ioTrix.dll" nicht und meldet: Laufzeitfehler '8002'
Die Methode 'PortOpen' für das Objekt 'IMSComm' ist
fehlgeschlagen.

Gruß
Marcus
Autor: zotos (Gast)
Datum:

@Dirk: Du benötigst die 'ioTrix.dll' von http://www.ioproz.de
Autor: Frank Simon (Gast)
Datum:

1. Die ioTrix.dll braucht ihr nicht, ich hab nur leider vergessen, den
Verweis wegzuklicken. Sorry.
2. Für die serielle Schnittstelle brauchst Du MSCOMM32.OCX, hat M$
leider normalerweise nicht im Office-Paket dabei. Eine Alternative ist
hier:
http://www.timesoft.ch/down/msxmcom.exe
Ein anderer feiner Trick: das OCX per Hand nach ...\system32\
kopieren, unter Access (Extras/ActiveX) von Hand registrieren (so hab
ichs gemacht, funktioniert)
Autor: zotos (Gast)
Datum:

So bei mir läuft es jetzt ;o) Ich musste noch den CommPort umstellen da
ich Com1 nehme.

Cooles Teil!
Autor: Frank Simon (Gast)
Datum:

Ich freue mich, dass du dich freust.
Bei mir läuft das über einen USB-Konverter, daher die exotische
Portnummer.
Autor: Marcel (Gast)
Datum:

Ich bekomme in Excel leider nur Laufzeitfehler 429 "Objektdarstellung
durch ActiveX - Komponente nicht möglich". Zu Hause habe ich leider
nur OpenOffice ...
Autor: Frank Simon (Gast)
Datum:
Angehängte Dateien:

An Marcel:
1.Die verwendete Komponente (MSCOMM32) beschreibt ein COM-Objekt. Im
beiliegenden Demo habe ich eine ActiveX-DLL (die auch ein COM-Objekt
beschreibt) unter OO-Basic verwendet. Dafür muss sie in ein sog.
UNO-Objekt umgemodelt werden, das ist die entsprechende Technologie im
Open Office. Wie das geht siehst Du im Anhang. Wenn es dabei Probleme
gibt, kann ich dir im Moment aus Zeitgründen nicht helfen. Aber im
OO-Forum gibt es hervorragenden Support.
2. Hast Du die Alternative aus dem Posting von oben denn schon
probiert?
Viel Erfolg
Frank
Autor: Mirko (Gast)
Datum:

Hi,

irgendwie stimmt etwas mit dem Quellcode.

Die Zeile "out ADCSRA, temp" sollte nicht definiert sein?

Fehlermeldung: Undefined variable referenced?
Falsche Bezeichnung ?

Danke
Autor: Frank Simon (Gast)
Datum:

An Mirko, dessen Posting fälschlicherweise ganz vorne eingefügt wurde:
ADCSRA hat anscheinend manchmal auch den Namen ADCSR, das ist für die
Megas, die nur ein Statusregister haben. Bei mir gabs übrigens
verwirrenderweise keine Fehlermeldung. Andere Version des Includefiles?
Versuch einfach mal den anderen Namen.
Autor: Christopher (Gast)
Datum:

Hallo,
sehr interessantes Projekt!
Läuft das auch auf einem Mega32, bzw was muss ich im Source anpassen um
das einfach mal verwenden zu können um es anschließend zu verstehen zu
lernen?
Grüße
Christopher
Autor: Frank Simon (Gast)
Datum:

Hallo Christopher,
hab leider keinen 32er hier.
Laut Atmel-Übersicht hat der 32er nur ein paar Features mehr als der
8er: Speicher, Beine, PWM, Interrupts. Ich würd es also mit neuer
Include-Zeile
.include "m32def.inc"
probieren, dann mit Atmel-Studio assemblieren. Ich denke, das muss
klappen. Falls es ein paar Fehlermeldungen gibt, dann wegen umbenannter
Register oder Flags, die musst du dann in der Docu nachschlagen.
Viel Erfolg!
Frank Simon
Autor: Norbert Lukoski (Gast)
Datum:
Angehängte Dateien:

Hallo. Hab ein kleines Problem. Arbeite zum ersten mal mit dem AVR
Atmega8 und möchte über den ADC0 Eingang eine Spannung einlesen und
über 7-SegmentAnzeige ausgeben lassen. Spannung kommt am Eingang an und
ich denke das der ADC im frei laufenden Betrrieb läuft, aber er spuckt
komische Zahlen auf der Anzeige aus. Meine MEinung ist, dass es an der
Ergebnisroutine liegt. Wenn wir in meine VAriable "value" einen Wert
definieren rechnet er den entsprechenden Wert aus und gitb ihn auch
richtig auf der Anzeige aus. Aber wenn er sich die Werte über den
Eingang ADC0 holen soll und diese dann in ADCL und ADCH reinschreibt
kommt nur Null raus. Kannst du mir vielleicht helfen?
Autor: Frank Simon (Gast)
Datum:

Hallo,
ich lese erst das Hi-Byte, ist m.E. in dieser Reihenfolge nötig.
Guck mal, obs daran liegt. Bei mir sieht das so aus:

U = ((ADCL+(ADCH<<8))<<6);

Good luck
Autor: Frank Simon (Gast)
Datum:

Pardon,
war falsch, seh ich gerad selber. Weiß nicht, worans bei Dir liegt.
Autor: Daniel (Gast)
Datum:

Habe Problem mit Excel-Sheet: Kommt immer Fehlermeldung

"Laufzeitfehler 429"
Objekterstellung durch ActiveX-Komponente nicht möglich


Liegt es vielleicht daran das ich einen USB-Konverter verwende!
Autor: Frank Simon (Gast)
Datum:

Hallo, der Comport muss die passende Nummer haben. Du erfährst sie im
Gerätemanager.
Autor: Daniel (Gast)
Datum:

Habe ihn richtig eingestellt!!Verwende IOTrix und MScomm! kommt immer
der selbe Fehler "429......"
Autor: Frank Simon (Gast)
Datum:
Angehängte Dateien:

1.) Ist "Microsoft Comm Control 6.0" unter Extras/Verweise angeklickt?
Bei mir steht dann unten "Pfad: C:\Windows\System32\MSCOMM32.OCX"
2.) Ich weiß mittlerweise, wie man mögliche Registrierungsprobleme mit
dem OCX elegant umgeht. Du musst einen bestimmten Schlüssel in die
Registry importieren, das geht z.B. durch einen Doppelklick auf die im
Anhang liegende Datei.
Sag bitte Bescheid, ob's das war.
Good luck!
Autor: Daniel (Gast)
Datum:

Hat geklappt!Danke!
Autor: Frank Simon (Gast)
Datum:

Super, dann viel Spass beim Messen!
Autor: Daniel Berger (Gast)
Datum:

Wie genau kann ich die Excel datei (Voltmeter) ausfuehren ?! Kommt immer
nen Fehler das die Bibliothek oder das Projekt nicht gefunden wurden
Autor: Frank Simon (Gast)
Datum:

Hallo,
schau mal unter Extras/Verweise nach, welcher Verweis fehlt. Dann
googelst Du danach oder liest hier weiter oben.
Autor: Dirk W. (bastelator) Benutzerseite
Datum:
Angehängte Dateien:

Hallo zusammen,

habe das Excelblatt heute an meine Bedürfnisse (Entladekurvenerfassung
für Akkus) angepasst und es sechskanalig gemacht -- ein Kanal kann
jeweils groß dargestellt werden (ist für Lehrerexperimente in der
Schule ganz praktisch).

Das Programm erwartet einen sekündlichen String im Format

V;0000;0000;0000;0000;0000;0000;

wobei die Nullen für einen Ascii-String mit Werten zwischen "0000"
und "1024" steht. Im Anhang der Screenshot...
Autor: Dirk W. (bastelator) Benutzerseite
Datum:
Angehängte Dateien:

... und hier das Excel-Blatt. Der erste Versuch in VBA, aber ich weiß
nicht, ob ich mir das noch einmal antue.

Ziemliches Gemurkse, entsprechend sieht auch der Code aus... Wenn's
jemand noch verbessern / korrigieren würde, würde ich mich freuen.

Gruß,
Dirk
Autor: Dirk W. (bastelator) Benutzerseite
Datum:
Angehängte Dateien:

Ach ja, speichern kann man die Werte jetzt auch automatisch. Im Anhang
noch der C-Code für den verwendeten ATMega88.

(auch das geht schöner, ich weiß. Aber es läuft wie es soll ;))
Autor: Lukas (Gast)
Datum:

Hallo zusammen,

ich habe das Einkanal-Voltmeter auf mein µController-System angepasst.

Ich verwende aber leider keinen Atmel sondern einen PIC.

Mein Testprogramm sendet in 1 Sekunden abständen die Dezimalzahl 255.

Auf meinem Excel Blatt erscheint dann 99,213 Volt und nach kurzerzeit
die

Fehlermeldung Laufzeitfehler '6' Überlauf.

Wäre sehr nett wenn mir jemand weiter helfen könnt.

mfg Lukas
Autor: Lars (Gast)
Datum:

Hallo Dirk,
war auf der Suche nach einem Programm zur Anzeige von mit µC per RS232
zum PC gesendeten ASCII Zeichen. Eigentlich ging es um graphische
Ausgabe (ähnlich Plot bzw. Logger oder "Langzeit-Oszi").
Wollte mir Dein 6-Kanal-Voltmeter.xls mal anschauen. Habe XP Pro ohne
jeden SP und jetzt schon Office97 mit Visual Basic neu installiert.
Vorher noch VB Runtime 6.0 . vbe6.dll existiert nicht auf meinem
Rechner, dafür eine vbe.dll und eine vbeext1.olb, beide vom 14.12.1996
(von der Office Installation?). Ich weiß, alles etwas wild, aber ich
habe keine Ahnung.
Bin jetzt schonmal so weit, daß der "Laufzeitfehler 429" nicht mehr
kommt, dank der mscomm32.reg von Frank.
Jetzt kommt aber "Fehler beim Compilieren des Codes" und er bleibt
hängen in der Zeile

z = Split(s, ";")

Offensichtlich kennt (mein Visual Basic ? "er"?) den Befehl split nicht.

Was kann ich tun?
Danke!
Autor: gatsby (Gast)
Datum:

Hallo Dirk,

die Laufzeitfehlermeldung liegt bestimmt daran, dass die Funktion
z=Split(s,";") den falschen string erhält.
Was macht die Funktion denn?
Wenn du einen string s hast, der wie folgt aussieht s="V;255", dann wird
mit z=Split(s,";") daraus z="255".
Es wird also der vordere Teil des strings s="V;" abgehackt und übrig
bleibt dein Wert.
Du musst also mit deinem PIC einen string "V;255" senden oder die zeile
z=Split(s,";") einfach auskommentieren.

Gruss
der grosse
Autor: gatsby (Gast)
Datum:
Angehängte Dateien:

Hallo

ich habe das Programm noch ein bisschen "aufgebohrt".

Neu:
-Auswahl des COM-port
-analoge Balkenanzeige aufgehübscht
-Spannungsbereiche 2,5V,5V,10V,20V als "1023"-Wert
-Für jeden Kanal einen eigenen Spannungsbereich

Viel Spass
Autor: gatsby (Gast)
Datum:
Angehängte Dateien:

Hallo nochmal,

habe gerade gemerkt, dass der Testmodus in meinem Programm noch aktiv
ist.

'*****************************************************
'** Test
'** Mit test=1 wird der Empfang von Daten simuliert
'*****************************************************
test = 0
test = 1
'*****************************************************

Das sollte eigentlich so aussehen.
'*****************************************************
'** Test
'** Mit test=1 wird der Empfang von Daten simuliert
'*****************************************************
test = 0
'test = 1
'*****************************************************

Also bitte ändern oder eben nochmal downloaden.
Autor: Stephan Henning (stephan-)
Datum:

Fehler beim Compilieren, mit Excel 97.

"Dim MSComm1 As MSComm"
Autor: Lars (Gast)
Datum:

Hallo Gatsby,
vielen Dank, daß Du noch einmal reingeschaut und Dich der Sache
angenommen hast!
Ich glaube, ich muß jetzt mal mein System etwas genauer beschreiben:
Ich arbeite derzeit mit einem Picaxe 28X1 (picaxe.com, basiert auf Pic,
ist so eine Art Basic-Briefmarke. Suuuper einfach, ging sofort und fand
ich daher toll). Der sendete früher sekündlich einfach munter
komma-separierte ASCII-Strings an COM1 (z.B
"10bit-Wert,10bit-Wert2,...10-bit-Wert4,cr,lf"). Klappte ganz
hervorragend mit dem Terminalprogramm im Picaxe-IDE-Editor,
Hyperterminal und dem Programm Stampplot von Selmaware
http://www.selmaware.com/stampplot/index.htm .
Habe den zu sendenden String jetzt so abgeändert, wie Dein Programm ihn
sehen möchte: "V;10-bit-Wert". Klappt aber immer noch nicht. Glaube auch
nicht, daß es daran lag, es ist wohl eher etwas Grundsätzlicheres.
Ich arbeite mit XP, Office97, "Microsoft Visual Basic Copyright
1987-1996" und einem zuvor installierten "Visual Basic 6.0 Runtime und
Controls.exe". Beim Starten Deiner Excel-Datei erscheinen nacheinander
folgende Meldungen von Visual Basic: zuerst "Fehler bei Laden", dann
"Projekt oder Bibliothek nicht auffindbar". Unter Verweise springt er
diesmal an die Stelle mit der Refedit.dll . Habe bei mir eine solche
unter \system32 gefunden und bei Verweise eingetragen. Beim Laufenlassen
kommt dann: "Fehler beim Kompilieren - Sub oder Function nicht gefunden"
und der Befehl "split" ist schwarz markiert. Habe das noch ein paarmal
probiert, mit und ohne abspeichern nach dem neuen .dll Verweis, keine
Änderung.
Ich habe KEINE AHNUNG von Visual Basic, ist für mich absolut kryptisch
und viel zu komplex. Wäre vielleicht anders, wenn ich schonmal ein paar
Beispielprogramme oder so gesehen hätte. Dachte mir also laienhaft:
o.K., kommt also mit "split" nicht klar, nimmst Du also split raus und
weist den einkommenden String direkt an z (so: z=s) und passt den
gesendeten String an (sertxd "10-bit-Wert" - ohne "V" und ";"). Diesmal
kam dann natürlich die Meldung: "Keine Zuweisung an Datenfeld möglich".
Hätte ich mir auch denken können, das eine ist ein Text, das andere eine
Zahl, logisch. Kenne aber den Umwandlungsbefehl "Variable =
MACHNEZAHLAUSASCII(ASCII)" in VB nicht, finde auch nichts in der Hilfe.
Keine Doku, kein Handbuch, nichts da. Für mich eben kryptisch. Wollte
eigentlich auch gar nicht soo tief da einsteigen, weil es einfach nach
viel Zeit aussieht. Würde daher sagen, wenn Du sofort weißt, wo bei mir
der Fehler liegt: Super! Wenn es aber bedeutet, daß ich jetzt erst noch
drei VB Bücher lesen muß und meinen Rechner neu installieren, dann ist
mir das, glaube ich, zuviel (und auch schade um Deine Zeit).
"fundamentalistische" Grüße (ob nun visuell oder nicht) von Lars
Autor: Lars (Gast)
Datum:

Nachtrag:
habe jetzt mal noch etwas weiter rumgespielt und bin die Zeile z =
split() usw. ganz umgangen, indem ich sie auskommentiert habe und
anstelle von z im weiteren Verlauf s eingetragen habe. Habe auch das "V"
als Anforderung und nötiges Format rausgenommen und sende erstmal nur
noch jeweils einen Wert zwischen 0 und 1023. Jetzt meckert VB zwar nicht
mehr rum, es kommt aber über ein 0,00V auch nicht hinaus. Es scheint
jetzt nur noch an Inkompatibilitäten im Sende- und erwartetem
Empfangsformat zu liegen, oder? Kann ich nicht einfach (wie ganz früher
bei Stampplot) senden:
sertxd (#AD0,",",#AD1,",",#AD2,",",#AD3,cr,lf)
senden (wobei "#" für die Umwandlung in eine Zeichenkette steht, das
Komma von den meisten anderen Programmen sehr gut als Separator
verstanden wird und cr und lf für den nötigen Neuanfang und
Zeilenumbruch sorgen)?
Wie müßte Dein VB Programm dann aussehen? Der Vorteil dieser Version
wäre, daß der gesendete String dann von den unterschiedlichsten
PC-Programmen aus verstanden und verwertet werden könnte!
- Lars
Autor: gatsby (Gast)
Datum:
Angehängte Dateien:

Hallo Lars,

dann probier mal das angehängte Programm.
Wenn ich dich richtig verstanden habe, dann sieht dein String so aus
  "64,128,796,1005" + CR + LF
Wichtig !! Die Werte sind ASCII-Zeichen und keine Hex Werte !!!

Ich habe mal das empfangene Telegramm simuliert mit der Zeile
 s = "64,128,196,255" + vbCrLf

Programmbeschreibung:
Hier werden die Zeichen von der seriellen Schnittstelle aufgesammelt bis
ein Linefeed empfangen wird.
           s = ""
           Do
              DoEvents
              a = MSComm1.Input
              s = s + a
           Loop Until a = vbLf
Danach sollte der string wie oben simuliert aussehen.
Dann gehts weiter mit

          'hier wird das CR und das LF gelöscht
          s = Left(s, Len(s) - 2)
          'hier werden 2 dummy Werte an den string angehängt
          'weil das Programm ja auf 6 Kanäle ausgelegt ist
          s = s + ",0,0"

Dann geht das Programm normal weiter.

Du kannst es ja mal im Simulations modus im single step testen.
Wenn es richtig laufen soll, dann einfach wieder im Programm

'*****************************************************
'** Test
'** Mit test=1 wird der Empfang von Daten simuliert
'*****************************************************
test = 0
'test = 1
'*****************************************************

die Zeile auskommentieren.


Viel Erfolg
Autor: Lars (Gast)
Datum:

Hallo Gatsby,
mensch, tolles Forum hier! Ehe ich heute reingeschaut habe, wurde Dein
Programm schon 3x runtergeladen!
Bei mir hat es aber leider wieder nicht funktioniert. Können aber nur
noch kleine Sachen sein.
Zunächst hat VB bei mir bei der Variable a (bei "a = MSComm1.Input")
rumgemeckert; daß diese nicht definiert sei obwohl irgendwas mit "Option
explicit" angegeben worden sei usw. Habe a daher erstmal bei "Dim ..."
zu den String-Variablen gestellt. War doch richtig, oder? Zumindest
hörte dann das Meckern auf.
Bleibt nach wie vor der Fehler mit der Anweisung "split". Da meldet er
immer einen "Fehler beim Kompilieren". Habe dann mal mit F1
nachgeschaut:
"Split-Eigenschaft:
True, wenn das Fenster geteilt ist. Boolean Schreib-Lese-Zugriff.
Anmerkungen:
FreezePanes kann den Wert True haben und gleichzeitig kann Split den
Wert False haben und umgekehrt.
Diese Eigenschaft ist nur für Tabellenblätter und Makroblätter gültig."
Heißt das, das Split bei mir gar nicht für die von Dir gewünschte
Separierung verwendet werden kann?
Habe dann im "Objektkatalog" die "Refedit" aufgerufen, "split" ist dort
gar nicht dabei?! Wo ist split denn drin, bzw. wie kann ich ihm das
"alte split" ausreden und das neue reinnehmen? Wie gesagt (auch für die,
die neu dazu gestoßen sind) Ich habe eigentlich KEINE AHNUNG von Visual
Basic und Makros! Kann bisher höchstens in BASCOM-AVR oder Picaxe-Basic
ein paar kleine Programme schreiben.
- Lars
Autor: gatsby (Gast)
Datum:
Angehängte Dateien:

Hallo Lars,

dann eben auf die harte Tour mit dem Split-Befehl.

          'das ersetzt Split(s, ",")
          count = 1
          For n = 1 To Len(s)
           b = Mid(s, 1, 1)
           If b = "," Then
             count = count + 1
           Else
             z(count) = z(count) + b
           End If
           s = Mid(s, 2)
          Next n

Das mit dem "DIM a as STRING" war richtig. Bei meiner VB version
brauchte ich es nicht explizit anzugeben. Ich hoffe, dass ich diesmal
keine DIMs mehr vergessen habe.

Und wieder gilt, wenn das Programm nicht mehr im Test modus laufen soll,
die Zeile

'*****************************************************
'** Test
'** Mit test=1 wird der Empfang von Daten simuliert
'*****************************************************
test = 0
'test = 1
'*****************************************************

auskommentieren.
Ich hoffe es funzt jetzt.
Autor: Lars (Gast)
Datum:
Angehängte Dateien:

Hallo gatsby,
hat immer noch nicht funktioniert. "Fehler beim Laden". Sagte aber
nicht, was es war bzw. was fehlte. "Bitte schauen sie in der
Fehlerprotokolldatei nach". Habe den ganzen Rechner nach evtl.en Dateien
abgesucht - nichts. Auch unter VB selbst konnte ich keine solche finden.
Habe daher schrittweise Teile Deines Codes (voltmeter_C) in die letzte
mir bekannte Version (modifizierte voltmeter_6kanal) überspielt, die
genau diesen Fehler eben noch nicht zeigt. Das Resultat (Vorsicht, kein
fertiges Programm!!!) hängt hier dran.
Bin jetzt zumindest soweit gekommen, daß er überhaupt erst einmal eine
order mehrere Datenpakete empfängt. Mit "loop until s = vbcrlf" konnte
er leider nichts anfangen, daher meine Rumprobiererei mit der
Zeichenanzahl. Mit diesen Änderungen empfängt er hin und wieder etwas
und zeigt dies erstmal mit Message-Boxen an (was anderes fiel mir nicht
ein zur Kontrolle). Hier sieht man, daß er manchmal auch ganze
"Zeilenpakete", d.h. mehr als eine Zeile, gleichzeitig empfängt und
versucht, diese zu verarbeiten. Hierbei springt er danach dann natürlich
oft in der Zeile "z(count) = z(count) + b" raus. Außerdem meckerte er
auch mehrmals über die Zeile mit dem " ... Left(...". Offensichtlich
versteht mein VB unter dem Befehl "Left" etwas anderes (Du meintest doch
bestimmt sowas wie Linksschieben, oder?
Ich könnte es sehr gut verstehen, wenn Du jetzt langsam keine Lust mehr
hast!
Wenn aber doch, so wäre es sicherlich sinnvoll, ausgehend von meiner
angehängten Datei, die Punkte:
- zuverlässige Erkennung einer gesendeten Zeile mit mindestens vier
kommaseparierten Meßwerten (0..1023) und "evtl. noch etwas mehr"
- Abtrennung des "evtl. etwas mehr" in der empfangenen Zeile
- Rausspringen bei z(count)...
zu klären. Außerdem würde mich ja außerdem noch interessieren, warum er
bei Deinem voltmeter_C einen "Fehler beim Laden" anzeigte, bei der hier
jetzt angehängten Datei hingegen nicht! Liegt es vielleicht daran, daß
mein Excel und/oder VB älter als Deines ist und nicht so viele
Funktionen/Anweisungen kennt?
Danke! Lars
Autor: Lars (Gast)
Datum:
Angehängte Dateien:

Habe hier noch mal angehängt, wie meine Ausgabezeile im Picaxe-Editor
aussieht (# steht für Umwandlung in ASCII-Zeichen) und was im
Hyperterminal empfangen wird (gemessen: zwei leere 1,5Volt-Batterien an
Kanal 1).
Autor: gatsby (Gast)
Datum:
Angehängte Dateien:

Oh, oh, oh, oh, Da geht jetzt aber viel durcheinander!!

Hallo Lars,

so wird das nichts mit deinem angehängten Testprogramm.

' "Fehler beim Laden". Sagte aber
' nicht, was es war bzw. was fehlte. "Bitte schauen sie in der
' Fehlerprotokolldatei nach".

Ich habe keine Ahnung was da los ist.


1. Fehler
          'If test = 0 Then
            'If MSComm1.Input = "V" Then
                s = MSComm1.Input  <---- das löscht dir ein Zeichen
                DoEvents
Da später der Befehl s="" folgt, fehlt dir ein Zeichen aus deinem
Telegramm.

2. Fehler
Die Zeile "loop until s = vbcrlf" hiess eigentlich mal
"loop until a = vblf".
Deine Zeile prüft s ab, was ein string mit mehreren Zeichen ist und
daher so gut wie nie ausgerechnet nur cr+lf werden kann.
Meine Zeile prüft genau 1 Zeichen ab, ob es lf (ascii 10) ist. Wenn du
Schwierigkeiten mit der Konstanten vblf hast, so macht diese Zeile das
Gleiche "loop until a = Asc(10)"

3. Fehler
Das ist Schrott!!
            Do
              DoEvents
              a = MSComm1.Input
              s = s + a
            Loop Until MSComm1.InBufferCount > 6  's = vbCrLf

Die MSComm ist so eingestellt, dass sie sich bei jedem Zeichen meldet (
siehe    MSComm1.RThreshold = 1 in UserForm_Initialize()). Dieses eine
Zeichen wird in der Zeile   a = MSComm1.Input  sofort abgeholt.
Damit kann
   Loop Until MSComm1.InBufferCount > 6
höchstens mal 1 aber niemals > 6 werden, es sei denn, das Programm wird
durch deine MsgBox Ausgabe ausgebremst während der PIC fröhlich
weitersendet. Nur dann Laufen einmal Zeichen im InBuffer auf, die nicht
abgeholt wurden.

4. Fehler
Wenn du diese Zeilen
         ' Else
             'z(count) = z(count) + b
auskommentierst, dann geht natürlich der ganze Rest des Programms nicht
mehr.


Ich kann dir jetzt nur noch Hilfestellung zur Selbsthilfe geben. Setze
einen Haltepunkt auf die FOR Zeile und wenn dein PIC ein vollständiges
Telegramm gesendet hat, dann sollte das Programm dort anhalten.
         'das ersetzt Split(s, ",")
          count = 1
          For n = 1 To Len(s)
           b = Mid(s, 1, 1)
           If b = "," Then
             count = count + 1
           Else
             z(count) = z(count) + b
           End If
           s = Mid(s, 2)
          Next n

Nun solltest du im single step mal prüfen, welche Daten du empfangen
hast in s und wie die z(count) zusammengesetzt werden und wie sie
schliesslich aussehen.
Hier nochmal das Programm, das sich vielleicht jetzt wieder starten
lässt.

Damit möchte ich mich nun aus dem Thread abmelden. Vielleicht
informierst du aber noch die Gemeinde, wie das Projekt geendet hat und
stellst dein schliesslich lauffähiges Programm hier ein.
Das würde mich rein persönlich noch interessieren.
Oder vielleicht äussert sich ja mal einer der vielen "Downloader" über
seine Erfahrungen.


Viel Erfolg
Gatsby
Autor: Lars (Gast)
Datum:

Hallo Gatsby,

habe wieder ausführlich getestet. Hauptfehler: "Fehler beim Laden". Bei
Einzelschritt springt er dann immer wieder zur Sub nocomm. Findet also
den Com-Port nicht?
Vielleicht probiere ich es irgendwann noch einmal mit einem neueren
Excel. Gebe jetzt auch erst einmal auf.
Als (schlechtere) Alternative habe ich jetzt ein RS232 (oder I2C)
LCD-Display. Damit kann ich mir die Werte auch seriell anzeigen lassen.
Die Umrechnung muß dann natürlich der Pic machen.
Trotzdem vielen vielen Dank, daß Du Dir so große Mühe gegeben hast!
Ich wünsche Dir Frohe Ostern und viel Spaß beim weiteren Programmieren
und Löten!

Lars
Autor: Reinhard (Gast)
Datum:
Angehängte Dateien:

Super Thread, vielen Dank für die gute Idee und Umsetzung!
Ich habe das Grundgerüst des Excel-Files verwendet, um die Messdaten
eines preiswerten 2-Kanal-Thermometers (TCM320 von Voltcraft, zu
beziehen beim großen C***) aufzuzeichnen und auch grafisch online
anzuzeigen.
Und das Ganze läuft dann als Langzeitaufzeichnung, um Vor- und
Rücklauftemperaturen einzelner Heizkörper im Haus aufzuzeichnen, damit
man zu sinnhaften Parametern für den hydraulischen Vor-Abgleich der
Ventile kommt.
Ich versuche mal, die Datei anzuhängen...
Autor: Reinhard (Gast)
Datum:
Angehängte Dateien:

Und hier noch ein Bild.
Autor: Gatsby (Gast)
Datum:
Angehängte Dateien:

Hallo Reinhard,

ich habe noch eine kleine Änderung in dein Programm eingefügt, sodass
sich die UserForm nun rechts oben in dem Tabellenblatt einblendet.
Ist nur für die Optik.
Kannst du bitte mal den string posten, den der uC sendet?
Sieht es so aus?
"xx1234567890123456"
.||..||....|+-------- Nachkommastelle 2.Messwert
.||..||....+--------- Vorkommastelle  2.Messwert
.||..|+-------------- Nachkommastelle 1.Messwert
.||..+--------------- Vorkommastelle  1.Messwert
.|+------------------ chr(170)
.+------------------- chr(170)

Gruss
Gatsby
Autor: Reinhard (Gast)
Datum:
Angehängte Dateien:

Oh, eine Antwort mit herzlicher Anteilnahme, vielen Dank, damit hatte
ich ja gar nicht gerechnet!

Danke, Gatsby!
Sorry, ich war lange nicht hier...

Ja, gerne poste ich den String, der sieht in Hex folgendermaßen aus:

AA AA 19 09 18 08 20 02 17 03 16 05 18 04

Startkenner ist AA AA
19 Kanal1, akt.Temp. Vorkomma (19°C)
09 Kanal1, akt.Temp. Nachkomma (,9°C), dementsprechend geht's weiter mit
18 Kanal1, Min.Temp. Vorkomma
08 Kanal1, Min.Temp. Nachkomma
20 Kanal1, Max.Temp. Vorkomma
02 Kanal1, Max.Temp. Nachkomma
17 Kanal2, akt.Temp. Vorkomma
03 Kanal2, akt.Temp. Nachkomma
16 Kanal2, Min.Temp. Vorkomma
05 Kanal2, Min.Temp. Nachkomma
18 Kanal2, Max.Temp. Vorkomma
04 Kanal2, Max.Temp. Nachkomma
keine Endekennung

Der kleine Controller liefert 9600, 8, N, 1.

Vielleicht hat noch jemand Antworten auf 2 Fragen:

1. Ich möchte  die Aufzeichnung der Messwerte gleich beim Aufruf der
Excel-Datei automatisch starten und nicht erst die beiden Click-Boxes
aktivieren müssen. Wie kann ich das bewerkstelligen? Wenn ich in der
Form die beiden Values mit TRUE vorbelege, läuft das Script ja nicht in
die Routine chk1_Click...
Ich habe das zwar schon realisiert, aber nur quick&dirty, indem ich
chk1_Click gleich aus der init-Routine aufrufe (dann erscheint das Form
nicht). Die Datei soll nachts über den Taskplaner gestartet werden und
sich nach 23,5h selbst beenden (das funzt, ist aber sehr unsauber). Wenn
es hier reinpasst, hänge ich die Datei mal dran.

2. Ich habe an dem uralten Aufzeichnungs-PC noch eine weitere COM(2) zur
Verfügung. Ein weiteres Thermometer damit einzulesen und die Daten in
dasselbe Tabellenblatt zu schreiben wäre mein Wunsch. Hat jemand dazu
auch eine Idee?

Vielen Dank für weiterführende Impulse,
schönen Gruß
Reinhard
Autor: Mini Float (minifloat)
Datum:

Reinhard schrieb:
> Ich habe an dem uralten Aufzeichnungs-PC noch eine weitere COM(2) zur
> Verfügung. Ein weiteres Thermometer damit einzulesen und die Daten in
> dasselbe Tabellenblatt zu schreiben wäre mein Wunsch. Hat jemand dazu
> auch eine Idee?

Machst du eben zwei MSCOMM-Objekte und holst von denen Wechselweise
Daten ab.
Wenn beim einen Comport-Objekt keine Daten im Lesepuffer sind, dann wird
eben versucht, den Lesepuffer des anderen Comport-Objekts zu lesen.
Es gibt doch sicher eine Methode(ich meine damit eine Funktion des
Objekts), mit der man feststellen kann, ob und wieviele Zeichen im
jeweiligen Lesepuffer sind. Wenn von einem Comport-Objekt genügend Daten
eingetrudelt sind, dass man sie verarbeiten kann, dann wird das getan.
Und weiter gehts in der Schleife...

mfg mf
Autor: Reinhard (Gast)
Datum:

Danke, MiniFloat,
das schaue ich mir demnächst einmal an.
Klar, da gibts ne Abfragemöglichkeit für die InBuf-Länge, müsste gehen.

Schöne Grüße
Reinhard

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net