- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: mehrere "Dateien" auf atmega speichern

  1. #1
    RN-Premium User Fleißiges Mitglied
    Registriert seit
    13.01.2008
    Ort
    Nordrhein-Westfalen
    Alter
    32
    Beiträge
    125

    mehrere "Dateien" auf atmega speichern

    Anzeige

    Praxistest und DIY Projekte
    OK gegebenes Setup ist folgendes:
    -Atmega32
    -16Mhz Quarz

    Und zwar ist es so, dass ich ein Main-Programm habe welches ein paar Schemata abrattert. Er geht also nach Tabellen und kann so verschiede Schemata abarbeiten. Nun habe ich dass Problem, dass ich bisher immer nur ein Schema implementieren konnte. Dies habe ich gemacht indem ich eine txt datei in Bascom included habe welche über Data eine Tabelle der Main zu verfügung stellt. Nun würde ich aber gerne verschiedene Tabellen einbringen, die im Betrieb umgeschaltet werden. Wie mache ich das? Include ich einfach noch mehr Textfiles und Schalte die Tabellen über Variablen durch oder können sie anders gespeichert werden? Nun möchte ich wie gesagt im Betrieb Modis umschalten können, nun ist aber mein Problem, dass bedingt durch die Tatsache meine Main-Loop hauptsächlich zugange ist meine Taster "debounce" funktion blockiert wird und nur jeder 3-4 Tastendruck erkannt wird. Wie kann man dies am besten ändern?

    Also im letztlich 2 Fragen:
    1. Wie kann ich verschiedene Tabellen und somit auch Schemata auf den mega32 laden ?
    2. Wie kann ich sowohl Tabellen als auch komplette Modis damit meine ich einen wechsel der Mainloop z.b. von Funkgesteuert auf autonom mit Hilfe eines Tasters umschalten ohne dass meine Main mich blockt?

    Wäre über Tipps äußerst dankbar.
    Gruß,
    Snaper

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113

    Re: mehrere "Dateien" auf atmega speichern

    Zitat Zitat von Snaper
    1. Wie kann ich verschiedene Tabellen und somit auch Schemata auf den mega32 laden ?
    Die Werte der Data Befehle liegen nachher im Flash. Du kannst also soviele Werte abspeichern, wie du noch Flash frei hast.
    Unterteilne kannst du dies durch verschiedene Label, bei denen du die zusammengehörigen Daten findest. Also so:
    Tabelle_1:
    Data ...
    Data ...
    Tabelle_2:
    Data ...
    Data ...

    Im Programm kannst du dir auch die Startadressen der Tabellen merken und diese als Offset in eine große Tabelle verwenden.
    Tabelle:
    Data ... '1. Tabelle 10 Werte
    Data ... '1. Tabelle 10 Werte
    Data ... '2. Tabelle 10 Werte

    Offset(1)=0
    Offset(2)=20

    Zitat Zitat von Snaper
    2. Wie kann ich sowohl Tabellen als auch komplette Modis damit meine ich einen wechsel der Mainloop z.b. von Funkgesteuert auf autonom mit Hilfe eines Tasters umschalten ohne dass meine Main mich blockt?
    Debounce hat die unangenehme Eigenschaft, die Ausführung zu blockieren, wenn die Bedingung der Taste erfüllt ist. Und zwar solange, wie mit Config Debounce festgelegt ist.
    Wenn du dies umgehen willst, kannst du einen Timer laufen lassen und die zu überwachenden Pins dort abfragen. Haben die dann mehrfach ihren Zustand gehalten, hat der Taster die Prellphase beendet. Die Unterbrechung durch den Interrupt sollte immer noch kürzer sein als mit Debounce.

  3. #3
    RN-Premium User Fleißiges Mitglied
    Registriert seit
    13.01.2008
    Ort
    Nordrhein-Westfalen
    Alter
    32
    Beiträge
    125

    Re: mehrere "Dateien" auf atmega speichern

    Okay, das mit den Tabellen klingt schonmal gut. Einziges Problem wird sein, dass ich während des kompilierens die Anzahl und Namen der Tabellen bekannt sein müssen und von Hand includiert werden müssen, oder sehe ich das falsch?

    Zitat Zitat von for_ro
    Debounce hat die unangenehme Eigenschaft, die Ausführung zu blockieren, wenn die Bedingung der Taste erfüllt ist. Und zwar solange, wie mit Config Debounce festgelegt ist.
    Wenn du dies umgehen willst, kannst du einen Timer laufen lassen und die zu überwachenden Pins dort abfragen. Haben die dann mehrfach ihren Zustand gehalten, hat der Taster die Prellphase beendet. Die Unterbrechung durch den Interrupt sollte immer noch kürzer sein als mit Debounce.
    Okay also wenn ich das jetzt richtig verstanden habe, dann setze ich einen Timer in dem ich den Status des Pins abfrage, richtig? Habe ich dann nicht das Problem, dass sofern ich eine Variable erhöhe eine 2-x malige erhöhung durch längeren drückens des Schalters möglich ist? Denn genau dies würde ich gerne vermeiden. Oder habe ich etwas falsch verstanden? Tut mir leid dass ich so doofe Fragen stelle aber in Basic bin ich relativ ahnungslos.

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113

    Re: mehrere "Dateien" auf atmega speichern

    Zitat Zitat von Snaper
    Einziges Problem wird sein, dass ich während des kompilierens die Anzahl und Namen der Tabellen bekannt sein müssen und von Hand includiert werden müssen, oder sehe ich das falsch?
    Klar, aber ist das ein Problem? Was meinst du mit "... von Hand includiert werden ..."?

    Zitat Zitat von Snaper
    Habe ich dann nicht das Problem, dass sofern ich eine Variable erhöhe eine 2-x malige erhöhung durch längeren drückens des Schalters möglich ist?
    Das kannst du verhindern, indem du feststellst, ob der Taster nach Erkennung des einen Zustands auch einmal den anderen für einen längeren Zeitraum angenommen hat.
    Z.B. so:
    • Du setzt den aktuellen Wert z.B. eine 1 in eine Variable in Bit 0 rein. (Variable.0 = Pinx.y)
      Dann überprüfst du, ob du 8 mal den gleichen Wert bekommen hast, also alle Bits 1 sind (Variable = 255, oder 0, falls gerade dauernd 0 kommen). [list:9db8242986]Wenn der Taster prellt, wirst du evtl. auch mal eine 0 mit drin haben.
    Dann schiebst du den Wert der Variable um eine Stelle nach links. (Shift Variable, Left)[/list:u:9db8242986]
    Wenn dein Taster z.B. 20ms prellt und du jede ms den Timer aufrufst, hast du spätestens nach 28ms einen konstanten Wert. Hast du mehrere Taster, dauert es aber nicht länger, wie dies bei Debounce der Fall wäre.
    Für diese Überprüfung benötigst du eine Variable zum Speichern der 8 Werte des Tasters und eine weitere, um den letzten erkannten Zustand zu speichern. Dadurch kannst du erkennen, ob sich der Taster geändert hat und vermeidest mehrfach Auslösen der Aktion.

  5. #5
    RN-Premium User Fleißiges Mitglied
    Registriert seit
    13.01.2008
    Ort
    Nordrhein-Westfalen
    Alter
    32
    Beiträge
    125
    Und wie bewältige ich am besten das Problem, dass Lookup keine Variable akzeptiert sondern eine Tabelle haben möchte? Denn sonst müsste ich ja alle Lookups mehrfach einbauen und die entsprechenden Tabellennamen einbauen.

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Ich habe noch nicht so genau verstanden, wie dein Programm aussehen soll.
    Aber oben habe ich dir beschrieben, wie du es mit einer großen Tabelle anstellen kannst. Dann brauchst du ja keinen variablen Tabellennamen.

  7. #7
    RN-Premium User Fleißiges Mitglied
    Registriert seit
    13.01.2008
    Ort
    Nordrhein-Westfalen
    Alter
    32
    Beiträge
    125
    Problem ist dass ich mehrere Schema auf verschiedene .txt dateien aufgeteilt habe also ein schema pro textdatei. Wäre natürlich auch ne möglichkeit das alles in eine große zu laden und dann über Offsets zu arbeiten. Aber dann wird es denke ich wieder etwas umständlicher nur ein spezielles schema ablaufen zu lassen.

  8. #8
    RN-Premium User Fleißiges Mitglied
    Registriert seit
    13.01.2008
    Ort
    Nordrhein-Westfalen
    Alter
    32
    Beiträge
    125

    Re: mehrere "Dateien" auf atmega speichern

    Zitat Zitat von for_ro
    Zitat Zitat von Snaper
    Einziges Problem wird sein, dass ich während des kompilierens die Anzahl und Namen der Tabellen bekannt sein müssen und von Hand includiert werden müssen, oder sehe ich das falsch?
    Klar, aber ist das ein Problem? Was meinst du mit "... von Hand includiert werden ..."?

    Zitat Zitat von Snaper
    Habe ich dann nicht das Problem, dass sofern ich eine Variable erhöhe eine 2-x malige erhöhung durch längeren drückens des Schalters möglich ist?
    Das kannst du verhindern, indem du feststellst, ob der Taster nach Erkennung des einen Zustands auch einmal den anderen für einen längeren Zeitraum angenommen hat.
    Z.B. so:
    • Du setzt den aktuellen Wert z.B. eine 1 in eine Variable in Bit 0 rein. (Variable.0 = Pinx.y)
      Dann überprüfst du, ob du 8 mal den gleichen Wert bekommen hast, also alle Bits 1 sind (Variable = 255, oder 0, falls gerade dauernd 0 kommen). [list:8a53126868]Wenn der Taster prellt, wirst du evtl. auch mal eine 0 mit drin haben.
    Dann schiebst du den Wert der Variable um eine Stelle nach links. (Shift Variable, Left)[/list:u:8a53126868]
    Wenn dein Taster z.B. 20ms prellt und du jede ms den Timer aufrufst, hast du spätestens nach 28ms einen konstanten Wert. Hast du mehrere Taster, dauert es aber nicht länger, wie dies bei Debounce der Fall wäre.
    Für diese Überprüfung benötigst du eine Variable zum Speichern der 8 Werte des Tasters und eine weitere, um den letzten erkannten Zustand zu speichern. Dadurch kannst du erkennen, ob sich der Taster geändert hat und vermeidest mehrfach Auslösen der Aktion.
    Wäre es möglich da einen kleinen Pseudocode zu bekommen? Denn so 100% habe ich es noch nicht verstanden... Frage mich auch wofür der Links Shift am ende dienen soll

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Dies ist nur ein Vorschlag für ein Entprellen einer Taste. Es gibt sicherlich noch zig andere Wege. Aber diese ist schnell und verursacht keine Wartezeit.

    Du schiebst den aktuellen Wert des Pins in eine Variable und kontrollierst dann, ob z.B. 8 mal der gleiche Wert gekommen ist. Wenn ja machst du eine Aktion.

    Code:
    Port_Status.0 = Pina.0   'dies speichert den aktuellen Zustand in bit 0 ab
    If Port_status = 255 Then   '8 mal eine 1
       If Port_status_alt = 0 Then     'vorher hatte er alles 0
           Port_status_alt = 255         'neuen Status abspeichern
           'irgendeine Aktion für Taster = 1
       Endif
    Elseif Port_status = 0 Then  '8 mal eine 0
       If Port_status_alt = 255 Then  'vorher hatte er alles 1
           Port_status_alt = 0             'neuen Status abspeichern
           'irgendeine Aktion für Taster = 0
       End If
    End If
    Shift Port_status, Left                'schafft Platz für das nächste Abfragen
    Wenn du dies in einer Timer Routine z.B. alle 1ms aus, dann hast du nach der Prellzeit des Tasters + 8ms eine Aktion.

  10. #10
    RN-Premium User Fleißiges Mitglied
    Registriert seit
    13.01.2008
    Ort
    Nordrhein-Westfalen
    Alter
    32
    Beiträge
    125
    ahh okay. Jetzt wo ich es so sehe ist das alles total logisch.
    Vielen dank.

    Hättest du denn auch noch eine Idee für die Sache mit den Tabellen?
    Also ich habe verschiedene Tabellen, gehen wir mal von 4 Stück aus.
    Und es soll möglich sein, dass nur eine Tabelle verwendet wird, dabei kann nur eine Tabelle drüber bzw. drunter gewählt werden oder alle Tabellen hintereinander.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad