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.