Hi,
ich habe ein etwas umfangreicheres Programm für einen RC-Sender, das an
genau einer Stelle spinnt.
Nun habe ich das Problem auf einen überschaubaren Teil herunter
gebrochen und habe den Effekt immer noch mit dem untenstehenden
Programm.
Das Array Rateup(64) wird nicht aus dem Array E_rateup(64) geholt (in
Read_eram), bei allen anderen Variablen funktioniert es.
Kurze Erläuterung: Fill_eram soll beim ersten Start nach dem Flashen
halbwegs brauchbare Werte ins EEprom schreiben.
Beim nächsten Start werden die Werte aus dem EEprom in die normalen
Variablen geladen (ohne E_). Die kann ich in dem richtigen Programm
verändern und verlasse ich diesen Programmmodus, werden sie im EEprom
abgelegt. Funzt mit allem wunderbar, nur nicht mit Rateup(64).
Rateup(1) wird korrekt mit 100 angezeigt, also das Füllen des EEprom
geht.
Rateup(2) ist aber 0.
Das Spielchen kann ich mit jedem Byte aus dem Array machen, manuell wie
Rateup(7) = E_rateup(7) geht.
Nur in Read_Eram eben nicht.
Wie man sieht, habe ich das Array schon woanders im EEprom speichern
lassen - keine Änderung.
Anderen Mega habe ich auch schon ausprobiert - das Gleiche.
Interrupts gibt es in dem Testprogramm auch nicht mehr.
Was übersehe ich da? Was kann ich noch probieren?
Mir gehen die Ideen aus, was es noch sein könnte.
Hier das reduzierte Programm:
--------------------------------------------------------------
$regfile = "M32DEF.DAT"
$crystal = 16000000
$hwstack = 128
$swstack = 64
$framesize = 32
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 ,
Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
Config Lcd = 16 * 2
Cursor Off
Ddrb.3 = 1
Swon Alias Portb.3 'the main
switch for power
Button Alias Pinb.4 'the
pushbutton for ON
Portd = 255 'Pullups Dig
in 0-10
Portb.0 = 1
Portb.1 = 1
Portb.2 = 1
Menu Alias Pind.0
Ok Alias Pind.1
Plus Alias Pind.2
Minus Alias Pind.3
Dim Stickup(8) As Integer
Dim Stickdown(8) As Integer
Dim Neutral(8) As Integer
Dim Invert(8) As Byte
Dim Modelno As Byte
Dim Rateup(64) As Byte
Dim Ratedown(64) As Byte
Dim E_stickup(8) As Eram Integer
Dim E_stickdown(8) As Eram Integer
Dim E_neutral(8) As Eram Integer
Dim E_invert(8) As Eram Byte
Dim E_modelno As Eram Byte
Dim E_rateup(64) As Eram Byte At 200 'index =
(modelno - 1) * 8 + channel
Dim E_ratedown(64) As Eram Byte At 300
Dim I As Byte 'just
counting
Dim J As Byte 'just
counting
Dim K As Byte 'just
counting
Modelno = E_modelno 'read model
number from Eram
If Modelno = 255 Then Gosub Fill_eram 'fill up
with default values at first start
Gosub Read_eram 'get saved
values from eram
'###################################################
Cls
Rateup(1) = E_rateup(1)
Lcd Rateup(1)
Locate 1 , 8
Lcd Rateup(2)
Locate 2 , 1
Lcd Ratedown(1)
Locate 2 , 8
Lcd Stickup(1)
Do
Loop
'####################################################
Fill_eram:
For I = 1 To 8
'#### set default values ####
Stickup(i) = 250
Stickdown(i) = 250
Neutral(i) = 512
Disable Interrupts
E_stickup(i) = Stickup(i)
E_stickdown(i) = Stickdown(i)
E_neutral(i) = Neutral(i)
Enable Interrupts
Next I
For K = 1 To 64
Rateup(k) = 100
Ratedown(k) = 100
Invert(k) = 0
Disable Interrupts
E_rateup(k) = Rateup(k)
E_ratedown(k) = Ratedown(k)
E_invert(k) = Invert(k)
Enable Interrupts
Next K
Modelno = 1
E_modelno = Modelno
Return
Read_eram:
Modelno = E_modelno
For I = 1 To 8
Stickup(i) = E_stickup(i)
Stickdown(i) = E_stickdown(i)
Neutral(i) = E_neutral(i)
Next I
For K = 1 To 64
Rateup(k) = E_rateup(k)
Ratedown(k) = E_ratedown(k)
Invert(k) = E_invert(k)
Next K
Return
----------------------------------------------------------
Gruß,
Norbert
Stack schon mal testweise erhöht? Schon probiert statt k das i zu nehmen? Evtl für jede Variable eine eigene Schleife nehmen, da eeprom Blockweise geschrieben wird. Evtl ein paar NOPs einbauen... eratedown passt?
Norbert schrieb: > Dim Invert(8) As Byte > Dim E_invert(8) As Eram Byte > For K = 1 To 64 > Rateup(k) = E_rateup(k) > Ratedown(k) = E_ratedown(k) > Invert(k) = E_invert(k) > Next K Invert und E_invert sind Arrays von 8 byte Länge. In der Schleife hättest Du gerne 64 Byte. MfG screwdriver
Hi, Danke Danke Danke! Das wars, die nicht deklarierten Arrayvariablen von Invert haben in das Array von Rateup hineingeschrieben, deshalb auch 0 und nicht 255. Invert muß auch 64 lang sein, von der Schleife her ist es also richtig, war nur nicht korrekt deklariert. Prima, jetzt läuft es, vielen Dank nochmal. Gruß, Norbert
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.