- Labornetzteil AliExpress         
Ergebnis 1 bis 3 von 3

Thema: Variable und BASCOM (ATMEGA644) Projekt Midicontroller

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    04.12.2006
    Beiträge
    26

    Variable und BASCOM (ATMEGA644) Projekt Midicontroller

    Anzeige

    Praxistest und DIY Projekte
    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:
    Code:
    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

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    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/in.../Bascom_Inside

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    04.12.2006
    Beiträge
    26
    Zitat Zitat von linux_80
    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/in.../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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test