von pc eine variable in Atmega uebergeben

OP #1606725
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
Persönliche Seite #1606837
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.
OP #1606851
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"
Persönliche Seite #1606858
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
Persönliche Seite #1606987
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.
Persönliche Seite #1607001
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.
Persönliche Seite #1607078
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
Persönliche Seite #1607154
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
OP #1607182
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren