mehrere "Dateien" auf atmega speichern
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
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.
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.
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.
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