mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik von pc eine variable in Atmega uebergeben


Autor: Dietmar Baumgart (dietmar74)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo zusammen,

habe ein kleines problem und zwar:

ich habe einen atmega8 ich sende sachen vom vb.net in den avr, das funst 
alles super sehe ich alles im lcd, jetzt sende ich im eine variable und 
die soll er dann in sich im eeprom speichern, aber ergend wie macht er 
es nicht.


im atmega wird alles gesplittet funktion ach ok.
ich sende zb "2 zustand" mit der case funktion sieht er die 2 geht von 
daher dann in ein sub sieht da noch dann "zustand" und gibt mir seine 
werte aus als print.

aber wenn ich sende " program ampere 100", dann sehe ich im lcd den 
eingang richtig, er sieht auch dann "program" geht auch in das sub 
dafuer, sieht da "Ampere" aber dann ueber nimmt er nicht die "100"

program bsp. der ablauf ist ja so ok deshalb nur der teil fuer die 
uebergabe:
achso es ist bascom.
'Beispiel des splits
     'program          AMPERE            123
 'Command_array(1) Command_array(2) Command_array(3)

Dim Ampereeeprom As Eram String * 3
Dim Ampere As String * 3
..
..
..
Case "AMPERE"
         Ampere = Command_array(3)
         Ampereeeprom = Ampere
         Locate 1 , 1
         Lcd Ampere ; " " ; Ampereeeprom

habe ich da einen denk fehler oder muss ich es noch durch mit input oder 
inkey machen, weil funktion mit denn beiden war nicht vorhanden.

danke im vorraus an alle die mir helfen koennen.

dietmar

Autor: Dietmar Baumgart (dietmar74)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hat keiner eine idea.

gruss dietmar

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich vermisse WRITEEEPROM (und READEEPROM)
http://avrhelp.mcselec.com/index.html

Autor: Dietmar Baumgart (dietmar74)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das ist wohl richtig aber mit der deklarierung
(Dim Ampereeeprom As Eram String * 3) sollte laut aussage es auch so 
gehen, da Eram eine direckter string vom eeprom ist.
oder habe ich da was falsch verstanden.
weil im beispiel bascom ist writhe oder read nicht vorhanden.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah du meinst die Beschreibung beim DIM

"ERAM variables only can be assigned to SRAM variables, and ERAM 
variables can be assigned to SRAM variables. You can not use an ERAM 
variable as you would use a normal variable." 
http://avrhelp.mcselec.com/dim.htm

Folgendes wäre demnach problematisch, weil keine Zuweisung einer ERAM 
variablen an/von einer SRAM Variablen: Lcd Ampere ; " " ; Ampereeeprom

Und aus Sicht der EEPROM Beanspruchung ist problematisch, dass 
Ampereeeprom immer geschrieben wird auch wenn altes Ampereeeprom und 
neues Ampere gleich sind.

Autor: Dietmar Baumgart (dietmar74)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo stefan danke schon mal fuer deine antwort,

mein groesstes problem ist momentan wohl, das der Command_array(3) nicht 
an Ampere uebergeben wird, weil ich sehe den im lcd keinen wert von 
ampere, aber ich kann vom program sehen das er bis dahin koreckt laeft, 
aber ergend wie denke ich mal das er den wert nicht uebergibt oder 
uebernimmt.

ich habe die funktion mal erweiter mit dem befehl, ausgabe an lcd case 
aufgerufen und die ausgabe kommt auch richtig, aber die zeilen ampere 
und ampereeeprom seht nur 0 0. wo dran ich sehe das er den wert wohl 
nicht uebernimmt. wo ist jetzt mein genk fehler.

Case "AMPERE"
         Ampere = Command_array(3)
         Ampereeeprom = Ampere
         Locate 1 , 1
         Lcd Ampere ; " " ; Ampereeeprom
         Locate 2 , 1
         Lcd " CASE Aufgerufen"

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann würde ich mir ansehen, wie Command_array(3) erzeugt wird...

Und was zu dem fraglichen Zeitpunkt (Ampere = Command_array(3)) 
tatsächlich darin enthalten ist:
Case "AMPERE"
         ' Debugcode
         Ampere = "123"
         Locate 2 , 1
         Lcd Ampere ; " DBG[" ; Command_array(3) ; "]"
         ' Originalcode
         Ampere = Command_array(3)
         Ampereeeprom = Ampere
         Locate 1 , 1
         Lcd Ampere ; " " ; Ampereeeprom

Autor: Dietmar Baumgart (dietmar74)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke schon mal im vorraus gleich mal ausprobieren.

Autor: Dietmar Baumgart (dietmar74)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo stefan,

also ich sehe

ich send 100 ampere
LCD
123
123 DBG(100)

da dran sehe ich split ist ok

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LCD Anzeige ist so?

+-------------------+ LCD
|123                | Zeile 1
|123 DBG[100]       | Zeile 2
+-------------------+

Dein () statt [] in in obigem Code zähle ich mal als Tippfehler.

Das sieht dann so aus, als ob die Zuweisung Ampere = Command_array(3) 
nicht funktioniert. Der Wert in Ampere aus Zeile2 ist nach der Zuweisung 
immer noch in Amspere drin und erscheint in Zeile 1.

Und die Zuweisung Ampereeeprom = Ampere funktioniert nicht. In Zeile 1 
taucht Ampere auf, aber nicht Ampereeeprom, das ja den gleichen Wert 
haben müsste.

Mit dem bisherigen Quelltext geht es hier nicht weiter. Dieser Bug hat 
sich sonstwo gut versteckt.

Autor: Dietmar Baumgart (dietmar74)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
stimmt der der wert wird nicht ins eeprom geschrieben und ich verstehe 
nicht warum

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es ist ja noch schlimmer!

Der Wert wird schon nicht in Ampere geschrieben. Dort steht bei der 
Ausgabe von Zeile 1 immer noch der Inhalt vom Debugcode (Ampere = "123") 
drin, obwohl es eine Zuweisung Ampere = Command_array(3) gibt und 
Command_array(3) den Text 100 enthält (sichtbar an der Ausgabe 
DEBG[100]).

Command_array ist doch als Array von Strings dimensioniert, oder? Nur 
zur Sicherheit!

Wenn schon die einfache Kopieraktion von Command_array(3) nach Ampere 
scheitert, wäre es wundersam, wenn die kompizierte Kopieraktion von 
Ampere nach Ampereeeprom funktionieren würde.

Also den EEPROM Code zeitweise rausnehmen und an die Behebung von 
Problem #1 gehen. Danach kann man sich mit dem EEPROM befassen.

Autor: Dietmar Baumgart (dietmar74)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja das ist richtig alles in string

Autor: Dietmar Baumgart (dietmar74)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also der wird wird jetzt uebernommen und auch richtig.
du musst nur den abfrage von lcd ampere nach Ampere = Command_array(3) 
setzen.
weil sonst nimmt er immer als erstes Ampere="123"

Autor: Dietmar Baumgart (dietmar74)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jetzt fehlt nur noch das verflixte eeprom

Case "AMPERE"
         Ampere = Command_array(3)
         Locate 2 , 1
         Lcd Ampere ; " DBG[" ; Command_array(3) ; "]"
         Ampereeeprom = Ampere
         Writeeeprom Ampere , Label2
         Readeeprom Ampere , Label2
         Ampere = Ampereeeprom
         Locate 4 , 1
         Lcd "NEUE AMPERE" ; Ampere

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Ampere="123" Zuweisung bei (1) war extra im Debugcode drin, damit 
ich sehe, ob überhaupt eine Zuweisung eines sicheren Strings an Ampere 
möglich ist. Über den Inhalt von Command_array(3) hatte ich zu dem 
Zeitpunkt noch keine Sicherheit.

In

Case "AMPERE"
         ' Debugcode
         Ampere = "123"                    ' (1)
         Locate 2 , 1
         Lcd Ampere ; " DBG[" ; Command_array(3) ; "]"
         ' Originalcode
         Ampere = Command_array(3)         ' (2)
         Ampereeeprom = Ampere
         Locate 1 , 1
         Lcd Ampere ; " " ; Ampereeeprom   ' (3)

ist ja danach bei (2) die Originalzuweisung drin. Die von dir berichtete 
LCD Ausgabe passt aber nicht dazu: In (3) taucht in der Zeile 1 des LCDs 
die 123 auf, d.h. (2) funktioniert nicht.

Es bringt meiner Meinung nach nur Verwirrung, wenn man die DIM ERAM 
Methode mit der WRITEEEPROM/READEEPROM Methode mischt. Also bei einer 
Methode bleiben. Wenn du READEEPROM/WRITEEEPROM ausprobieren willst, 
vergiss $EEPROM/$DATA nicht!

Case "AMPERE"
         READEEPROM Ampere , LabelAmpere
         LOCATE 1 , 1
         LCD "Ampere alt: " ; Ampere
         IF Ampere <> Command_array(3) THEN
           WRITEEEPROM Command_array(3) , LabelAmpere
           READEEPROM Ampere , LabelAmpere
         END IF
         LOCATE 2 , 1
         LCD "Ampere neu: " ; Ampere
...
END

Datenimeeprom:
$EEPROM
LabelAmpere:
DATA "999"
$DATA
END

Autor: Dietmar Baumgart (dietmar74)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jetzt gibt er mir nur noch fehler
invalid datatyp labelampere
variable no deminsoniert

aber ich danke dir jetzt schon mal fuer deine hilfe

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann stimmt die Position des Labels nicht. Ich habe de Position am 
Programmende aus einem Bespiel des Manuals übernommen. Verschiebe den 
$EEPROM/$DATA Block an den Programmanfang, so dass Labelampere früher 
bekannt ist. Hier ist ein Minimalbeispiel für den BASCOM-Simulator:
$regfile = "m8515.dat"
$crystal = 4000000
$baud = 19200
$hwstack = 32
$swstack = 10
$framesize = 40

$sim   ' BASCOM Simulator etwas beschleunigen, rausnehmen im Realcode

Datenimeeprom:
$eeprom
Labelampere:
Data "999"
$data

' Default LCD Pins für den Simulator
Config Lcd = 16 * 4

Dim Ampere As String * 3
Dim Command_array(3) As String * 3

Cls
Do
  Command_array(3) = Str(rnd(999)) ' Simulierte Eingabe
  Locate 1 , 1
  Lcd "C_A(): " ; Command_array(3)
  Readeeprom Ampere , Labelampere
  Locate 2 , 1
  Lcd "EEPROM alt: " ; Ampere
  If Ampere <> Command_array(3) Then
    Locate 3 , 1
    Lcd "Update EEPROM"
    Writeeeprom Command_array(3) , Labelampere
    Readeeprom Ampere , Labelampere
  End If
  Locate 4 , 1
  Lcd "EEPROM neu: " ; Ampere
Loop
End

Autor: Dietmar Baumgart (dietmar74)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das war es, er mag die eepromm sachen nicht am ende stehen haben, welch 
ein scheiss beim suchen. aber ich danke dir sehr bei der hilfe des 
problemes, ich will hoffen ich habe dir nicht zuviel zeit geraubt, ab 
sonntag abend.

danke dietmar

wenn ich andere probleme habe kann man dich dann erreichen.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> wenn ich andere probleme habe kann man dich dann erreichen.
Null Problemo: Ich treibe mich häufiger hier rum :)

Autor: Frank Petermeier (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Dietmar,

kannst Du bitte mal den Code für VB.net (der Teil der sich mit dem 
Senden an COM beschäftigt) posten ?

Danke und Gruss
Frank

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
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.