PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Variable und BASCOM (ATMEGA644) Projekt Midicontroller



stekohl
16.10.2008, 21:49
Hallo Leute,

noch ein Problem mit Bascom.

Ich nutze einen Atmege644 im DIP 40 Bauform mit einem EasyAVR4 Board von Mikroelektronika. (Board finde ich ok, der Pascalcompiler ist allerdings "etwas" verbugt)

Meine Anwendung soll später mal ein Midifußcontroller werden. Für alle Nichtmusiker, um per Fusstasten diverse Midieffekte und -geräte anzusteuern.

Ich habe per PC 200 Dateien mit dem Namen "bankxx.bnk" angelegt, 200 Unterverzeichnisse mit dem Namen "bankxx" und in jedem unterverzeichniss je 14 Dateien mit dem Namen "bxxpxx.bnk".



Nun habe ich Angefangen für die einzelnen Komponenten meines geplanten Projektes immer das angefangenen Programm zu erweitern.

Mit dem Atmega644 ist es ja Aufgrund des 4096Byte SRAM möglich mit SD-Karten und FAT zu arbeiten. Was auch klappt, es bleiben noch genug SRAM für eigene Variablen über.

Nun bin ich evtl. etwas meschuge oder verstehe Bascom ein wenig zu sehr als Q-Basic ;-). Ich habe jedoch immer wieder das Problem, dass dimensionierte Variablen einfach auf NULL gesetzt werden (anderer Thread).

Beispiel:


Do
Cls
Chdir "\"
Bankname = ""
Zaehler = 0
Infodat = ""
Waitms 10
Z = Rnd(199) 'Hier werden die Variablen zugeordnet
Waitms 23
X = Rnd(13)
Incr Z 'hiermit umgehe ich BANK0
Incr X 'hiermit umgehe ich PRESET0

Inii = "bank" + Str(z) + ".bnk"
Open Inii For Input As #1
Input #1 , Zaehler , Bankname
Close #1

If Z = 0 Then 'Hier will ich sehen ob Z noch einen Wert hat
Lcd Z ; " bank"
End
End If
Inii = "bank" + Str(z)
Chdir Inii
Inii = "b" + Str(z) + "p" + Str(x) + ".bnk"
Open Inii For Input As #1
Input #1 , Preset(1) , Midi1(1) , Midi2(1) , Pedal1(1);
Close #1

If Z = 0 Then ' Oder verliert hier die Variable ihren Wert
Lcd Z ; "preset"
End
End If
Lcd Z ; " " ; X ; " " ; Bankname ; " " ; Zaehler
Lowerline
Lcd Preset(1) ; " " ; Midi1(1)

Loop


Ich habe per PC 200 Dateien mit dem Namen "bankxx.bnk" angelegt, 200 Unterverzeichnisse mit dem Namen "bankxx" und in jedem unterverzeichniss je 14 Dateien mit dem Namen "bxxpxx.bnk".

Die Routine soll einfach per Random (Variable Z)eine der 200 Bankdateien öffnen und den Banknamen laden. Dann wird per chdir in das dazu passende Unterverzeichniss gewechselt. Danach per Random (Variable X) eine der 14 Presetdateien ausgelesen.
Ich will mit diesem Test einfach mal sehen wie hoch die Latenz ist. Später sollen dann die Presetdaten nicht mehr einzeln, sondern alle 14 in Arrays geschrieben werden.

Der Witz ist, dass die Variable Z schon nach dem ersten OPEN/CLOSE (laden der Bankdaten) manchmal nur noch Null enthält. Und das eben auch nicht immer!! Das weis ich daher, da ich mir ja deswegen extra diese IF Abfrage mit eingebaut habe.
Sage ich z=Rnd(50) läuft die Routine endlos durch.

Ich verstehe meinen Fehler irgendwie nicht. Warum werden die Variablen immer wieder auf NULL gesetzt?

Ach ja, wenn es läuft lädt Bascom->AVR-DOS->ATMEGA644(20MHZ) die daten ich unter 100ms. Garnicht so schlecht.


Gruß,

Stephan

linux_80
17.10.2008, 00:26
Hi,

Wenn sich Variablenwerte unkontrolliert verändern liegt es oft auch an zu klein geplantem Stack, dH. der Stack braucht mehr Platz und überschreibt die Variablen die darunter liegen.

Siehe Wiki :
https://www.roboternetz.de/wissen/index.php/Bascom_Inside

stekohl
17.10.2008, 16:12
Hi,

Wenn sich Variablenwerte unkontrolliert verändern liegt es oft auch an zu klein geplantem Stack, dH. der Stack braucht mehr Platz und überschreibt die Variablen die darunter liegen.

Siehe Wiki :
https://www.roboternetz.de/wissen/index.php/Bascom_Inside

Tja, das kann natürlich sein. Jetzt bin ich allerdings alles nur kein Bascom oder Atmega Papst.
Ich denke schon, dass mein Projekt durch AVR-DOS und einen paar eigene Variable ganz schön Platz im SRAM verbraucht. Wie bekomm ich jetzt nur raus wie die Einstellungen für HWSTACK und SWSTACK sind.

Reiz ich die Einstellungen bis zum Compilerfehler (SRAM voll) aus, so habe ich immer noch den gleichen Fehler.
Da die Variablen um die es mir hier geht vom Type LONG sind, würde ich ja verstehen, wenn die Einstellung des Stack einen Einfluß auf einen Teil der 4 Byte Variablen hat. Also wenn alle vier, oder 3,2 oder 1 Byte nicht stimmen würden. Der Witz ist, mach ich aus den Long Variablen Byte Variable bleibt der Fehler.
Wenn ich per RND(50) die Werte ermittle, wird die Variable Z nie 0. Ermittle ich per RND(200) so wird in unregelmäßigen Abständen die Variable Z NULL. Was eigentlich unmöglich, da hinter Z=RND(200) ein INCR Z steht. Um eben die Null zu verhindern.

Wenn es dann doch an der Einstellung für den Stack hängt, bräuchte ich etwas Schützenhilfe!


Gruß,

Stephan