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


von Dietmar B. (dietmar74)


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

von Dietmar B. (dietmar74)


Lesenswert?

hat keiner eine idea.

gruss dietmar

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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

von Dietmar B. (dietmar74)


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.

von Stefan B. (stefan) Benutzerseite


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.

von Dietmar B. (dietmar74)


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"

von Stefan B. (stefan) Benutzerseite


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:
1
Case "AMPERE"
2
         ' Debugcode
3
         Ampere = "123"
4
         Locate 2 , 1
5
         Lcd Ampere ; " DBG[" ; Command_array(3) ; "]"
6
         ' Originalcode
7
         Ampere = Command_array(3)
8
         Ampereeeprom = Ampere
9
         Locate 1 , 1
10
         Lcd Ampere ; " " ; Ampereeeprom

von Dietmar B. (dietmar74)


Lesenswert?

danke schon mal im vorraus gleich mal ausprobieren.

von Dietmar B. (dietmar74)


Lesenswert?

hallo stefan,

also ich sehe

ich send 100 ampere
LCD
123
123 DBG(100)

da dran sehe ich split ist ok

von Stefan B. (stefan) Benutzerseite


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.

von Dietmar B. (dietmar74)


Lesenswert?

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

von Stefan B. (stefan) Benutzerseite


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.

von Dietmar B. (dietmar74)


Lesenswert?

ja das ist richtig alles in string

von Dietmar B. (dietmar74)


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"

von Dietmar B. (dietmar74)


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

von Stefan B. (stefan) Benutzerseite


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

von Dietmar B. (dietmar74)


Lesenswert?

jetzt gibt er mir nur noch fehler
invalid datatyp labelampere
variable no deminsoniert

aber ich danke dir jetzt schon mal fuer deine hilfe

von Stefan B. (stefan) Benutzerseite


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:
1
$regfile = "m8515.dat"
2
$crystal = 4000000
3
$baud = 19200
4
$hwstack = 32
5
$swstack = 10
6
$framesize = 40
7
8
$sim   ' BASCOM Simulator etwas beschleunigen, rausnehmen im Realcode
9
10
Datenimeeprom:
11
$eeprom
12
Labelampere:
13
Data "999"
14
$data
15
16
' Default LCD Pins für den Simulator
17
Config Lcd = 16 * 4
18
19
Dim Ampere As String * 3
20
Dim Command_array(3) As String * 3
21
22
Cls
23
Do
24
  Command_array(3) = Str(rnd(999)) ' Simulierte Eingabe
25
  Locate 1 , 1
26
  Lcd "C_A(): " ; Command_array(3)
27
  Readeeprom Ampere , Labelampere
28
  Locate 2 , 1
29
  Lcd "EEPROM alt: " ; Ampere
30
  If Ampere <> Command_array(3) Then
31
    Locate 3 , 1
32
    Lcd "Update EEPROM"
33
    Writeeeprom Command_array(3) , Labelampere
34
    Readeeprom Ampere , Labelampere
35
  End If
36
  Locate 4 , 1
37
  Lcd "EEPROM neu: " ; Ampere
38
Loop
39
End

von Dietmar B. (dietmar74)


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.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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

von Frank Petermeier (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.