Forum: Mikrocontroller und Digitale Elektronik Bin ich blind? Bascom Code will nicht


von Norbert (Gast)


Lesenswert?

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

von Peter R. (peterfido)


Lesenswert?

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?

von screwdriver (Gast)


Lesenswert?

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

von Norbert (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.