mikrocontroller.net

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


Autor: Norbert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter R. (peterfido)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: screwdriver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Norbert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.