Liste der Anhänge anzeigen (Anzahl: 1)
noch immer Verstaendnisprobleme
Hallo mare_crisium,
leider habe ich noch immer Verstaendnisprobleme.
- Das Lesen der Tabellenwerte mit Zeigern und deren Verarbeitung -
:-k
Ich habe Deinen Code mit einfliessen lassen und habe ihn nun so einge Male durch den Simulator getickert.
Aber es hat leider bei mir noch immer nicht klick gemacht... :-s
Selbst mit den Wein nicht.
Den Code dokumentierten Zeile haenge ich diesmal an.
Dokumentiert sind 3 Durchlaeufe.
Vielleicht kannst Du mir noch ein paar Erlaeuterungen ergaenzen ?
Liste der Anhänge anzeigen (Anzahl: 1)
robo_wolf,
das sieht doch schon gut aus :-) ! Meine Kommentare habe ich in den Quelltext geschrieben. Deine Fragen zum Timer habe ich auch dort beantwortet (siehe Anhang).
Das EEPROM ist ein sehr praktischer Bestandteil der ATmegas. Ich benutze zum Lesen und Schreiben ziemlich genau die Prozeduren die im Datenblatt auf Seite 22 und 23 vorgestellt werden. Die funktionieren sehr zuverlässig.
Ciao,
mare_crisium
Liste der Anhänge anzeigen (Anzahl: 1)
robo_wolf,
na, es doch geht voran ;-). Bevor wir neue "Features" in Angriff nehmen, ist es an der Zeit, sich noch einmal Überblick zu verschaffen, Überflüssiges bzw. Vermeidbares abzuschrauben und fertige Module in eine Bibliothek auszulagern (siehe Kommentare in angehängter pdf-Datei).
Als Quelltext darf ich's nicht einfügen, weil's angeblich mehr als 20000 Zeichen hat :-(. Leider musst Du den Text jetzt aus dem pdf herausfummeln.
Ciao,
mare_crisium
EDIT: Die Fehler verbessert (hoffentlich alle ;-) !), die robo_wolf entdeckt hat.
Liste der Anhänge anzeigen (Anzahl: 2)
das ist er wieder...
Hallo mare_crisium,
lang hats gedauert... (hatte leider nicht so viel Zeit - Sorry)
Aber nun moechte ich mein Werk wieder einmal vorstellen.
Vieles von Deinem Posting habe ich uebernommen, aber auch manches abgeaendert.
Aenderungen:
- Habe nun fuer High und Low-Flanken je ein Register rTAST_High_FLANKEN und rTAST_Low_FLANKEN(wird aber noch nicht ausgewertet)
- das marco _FLANKEN_SICHERN habe ich mit Abfragen auf HIGH und LOW erweitert
!!! wobei mir das noch nicht ganz gefaellt !!!
??? in der ISR wollte ich abfragen, ob eine Flanke anliegt und nur dann diese sichern
Code:
sbrc r16,3 ; Abfrage ob Flanke ansteht
_FLANKEN_SICHERN(LED_TASTE_0) ;
Das funktioniert nur leider nicht, musste ich feststellen.
Ist aber klar, wenn man sich anstelle des Aufrufs die Instruktionen vorstellt.
-> springe ich ja nur eine Instruktion weiter und nicht ueber das komplette macro
??? Kann ich bei rcall-Aufrufen auch ein Parameter mit uebergeben aehnlich wie beim _macro(@0) ???
- Register rLED_Update-Sprr ist ersetzt durch rIO_config
rIO_config soll mehr Infos aufnehmen als nur die Sperrung der Prozedur LED_Update
z.B. angedacht Lesen und Schreiben des EEPROM als Bit 1 und 2 usw...
- GET_HIGH_NIBBLE habe ich auch ein wenig veraendert
anstelle von
andi r16,0x0F ; unteres Nibble freistellen
kam:
andi r16,0x07 ; unteres Nibble freistellen und Flankenbit loeschen
die Zeile "andi r16,0x07" kam in der ISR im naechsten Schritt und wird somit ueberfluessig.
- den Kommentar habe ich auch angepasst und hoffe das es nun lesbarer ist - lese es am Besten in 3 Tagen noch einmal, um zu sehen ob es nun passt ;-)
// im grossen und ganzen muss ich sagen, wurde der Code durch das Auslagern der Unterprogramme wesentlich ueberschaubarer
so nun aber hier der Code:
diesmal angehaengt - wegen der 20.000er
Liste der Anhänge anzeigen (Anzahl: 1)
robo_wolf,
Zitat:
Zitat von robo_wolf
Hallo are_crisium,
Wenn man ein Paramter uebergibt, dann geht es auch mit mehr...?
ja, natürlich. Nur ist die Parameterübergabe immer implizit - damit meine ich: Der Benutzer muss vorher wissen, welcher Parameter in welchem Register steht. Solche praktischen Aufrufe, wie z.B. FLANKEN_SICHERN( LED_TASTE0), gibt's meines Wissens nur in Hochsprachen wie Pascal, aber in keinem Assemblerdialekt. - Deshalb muss man ein Macro gebasteln, um die Pascal-ähnliche Schreibweise zu simulieren.
Wenn man der Prozedur die Parameter in Registern übergeben muss, ist es hilfreich, eine Beschreibung der Prozedur zu haben, die angibt, welche Parameter in welchen Registern stehen müssen. Deshalb hat in meinen Programmen jede Prozedur so einen ausführlichen Vorspann. Andernfalls muss man erst den ganzen Quelltext der Prozedur wieder durchlesen und verstehen (;-)!) , bevor man sie benutzen kann.
Alternativ kann man der Prozedur auch Parameter übergeben, die im RAM stehen: Entweder auf dem Stack (so macht das Pascal) oder in einem Datenblock. Diese letzte Methode verwende ich auch in der angehängten Version Deines Lernprogramms. Da geht es nämlich um das Auslagern von Daten ins RAM :-) .
Dann man viel Spass!
Ciao,
mare_crisium
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo mare_crisium,
nach dem der gestrige Tag im Zeichen des Gartens stand, melde ich mich erst heute... 8-[
Habe nun den Code wieder so angepasst, dass die gewuenschte Funktion "Ein- und Ausschalten" der LED mittels der jeweiligen Taste geschieht.
so 100%ig gefaellt es mir aber noch nicht...
eventuell liegt es an dem was mir so noch im Hinterkopf spukt:
>>>>
... eine Menueabfrage einfuegen.
Diese soll aufgerufen werden, wenn Tasten0 und Taste7 3 sec lang gedrueckt wurde.
--- denkbar ware hier das reservierte DatenByte (bzw. noch ein Zweites) im RAM zu nutzen - Timer ist bei 0,1 sec -> also 300 mal hoch zaehlen... ---
--- oder kann ich das TIMER1 COMPB eventuell dafuer nutzen? ---
--- sind die Werte beider Tasten > 300 dann Einstieg ins Menue ---
Im Menue stehen dann die einzelnen Tasten mit unterschiedlichen Funktionen zur Verfuegung. Signalisierung fuer Menue koennte ein Blinken der LEDs sein...
Nach Erkennen einer Taste wird das Menue verlassen und das Programm arbeitet mit der ausgewaehlten Funktion,
die hinter der Taste steht.
Wurde 5 sec lang, keine Eingabe gemacht, wird das Menue wieder verlassen.
--- denkbar auch hier ein Datenbyte auf 500 zaehlen ---
Als default soll das Programm mit SWITCH_LED nach dem Starten/Einschalten laufen bzw. zu einem spaeteren Zeitpunkt
soll das Programm nach dem Starten/Einschalten mit der zuletzt ausgewaehlten Funktion arbeiten.
<<<<
Das sind erst einmal nur Ueberlegungen... eventuell loese ich die Aufgabe dann doch etwas anders.
Auf Deine Kommentare und event. Vorschlaege bin ich wieder sehr gespannt.
PS. "Computersteuer" - so etwas Aehnliches hat man doch endlich geschafft :-k - in Form der GEZ-Gebuehren
Liste der Anhänge anzeigen (Anzahl: 3)
robo_wolf,
hier ist noch ein Zwischenschritt auf dem Weg zur Menusteuerung. In der .pdf-Datei habe ich versucht zu erklären, warum ich den für nötig halte. So gut ich's konnte, halt :-).
Morgen kommt der nächste Schritt mit einem Testprogramm für die Komponenten der Menusteuerung.
Ciao,
mare_crisium
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo mare_crisium,
vielen Dank fuer die tolle Ausarbeitung.
Die IDEE eines gekapselten "IO-Treibers" kann man nun sehr schoen erkannen.
Habe mal einen sehr einfach gehaltenen Signalfluss aufgezeichnet.
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo mare_crisium,
habe im Simulator 2 Problemchen bemerkt.
Beim Initialisieren der Ports
LED_PORT habe ich noch ser r16 eingefuegt, da sonst r16 noch den Wert von "ldi r16,(1<<OCIE1A) ; Timer1 Overflow aktivieren" hatte.
Beim TASTCTL_PORT habe ich noch "out TASTCTL_PINS, r16" eingefuegt, da die Tasten gegen GND geschaltet werden.(Besonderheit beim STK500).
-- sehr schoene Loesung --
...wenn ich das mal so sagen darf
Auf Deine Menueloesung bin ich schon sehr gespannt.
Liste der Anhänge anzeigen (Anzahl: 1)
Fuer den weiteren Aufbau des Programm und mit Hinsicht auf Kapselung habe ich nun Nachfolgendes:
Modul Menuesteuerung:
Das Menue wird aufgerufen durch das gleichzeitige Druecken der Tasten T0 und T7 fuer 3sec(Menue-Abfrage).
1 - nach dem Aufruf des "Menue-Auswahl" bleibt dies ohne weiteren Eingriff(Tastendruck)
5sec aktiv und beendet sich nach abgelaufender Zeit mit dem Ruecksprung zu MainSchleife.
2 - wird waehrend des Aufrufs von "Menue-Auswahl"ein Taste gedrueckt,
so schreibt der Inhalt von R18 in R15 geschoben
T0 := Bit0.... T7 :=Bit7 von rTastMenue und bendet "Menue-Steuerung" mit dem Ruecksprung zu Main-Schleife.
3 - Register r18 enthaelt die gedrueckten Tasten(High-Flanken)
-> r18 wird fuer die "Menuesteuerung" eingelesen und verarbeitet.
4 - fuer die Ausarbeitung und Erstellung des Testprogramms wird folgendes festgelegt:
Der Zeitgeber wird durch ein RegisterZaehler simuliert.
Code:
.equ MenueInTime = 3
.equ MenueTimeOut = 5
def r15 = rTastMenue ; wird default mit 0x01 geladen
def r20 = rMenueTC ; (MenueTimer-Counter)
F U N K T I O N:
Menue-Abfrage:
r18 wird in einer Schleife mit 0x81 (0b1000 0001) verglichen.
bei Uebereinstimmung incrementiert rMenueTC.
rMenueTC wird mit MenueInTime verglichen.
bei Uebereinstimmung wird das Untermenue "Menue-Auswahl" aufgerufen
und rMenueTC wird mit MenueTimeOut geladen.
Menue-Auswahl:
Menue-Auswahl durchlaeuft eine Schleife, in der rMenueTC decrementiert.
Bei "tst rMenueTC" wird rTastMenue mit 0x01 geldaen und die Funktion mit dem Ruecksprung in Main beendet.
oder die naechste erkannte Taste in R18 wird in R15 verschoben und das Menue-Auswahl damit beendet.
Innerhalb von Menue-Auswahl sollen die LEDs zur Signalisierung blinken.
Dazu wird rTastMenue geloescht := 0x00.
rTastMenue wird mit der naechsten in der Main-Schleife befindlichen Prozedur "SWITCH_OUT_PORT" bislang "SWITCH_LED" verarbeitet.
rTastMenue := 0x00 liefert das Blinken aller LEDs
Liste der Anhänge anzeigen (Anzahl: 3)
robo_wolf,
Du weisst ja, ich bin momentan zeitlich ziemlich eingeschränkt. Deshalb zeigen die Dateien im Anhang noch einen nicht komplett ausgetesten Zwischenstand. - Interessant, wie sich unsere Ansätze unterscheiden :-) . Das Ausknobeln hat richtig Spass gemacht und war eine gute Ablenkung.
Ciao,
mare_crisium
EDIT_1: Verbesserte Versionen der drei Anhänge hochgeladen
EDIT_2: Fehler (siehe Post von robo_wolf 02.04.2010) in _V03 korrigiert. Neue Version "TestPrgrm_04i_V03.asm"
EDIT_3: Neue Version _V09 mit Korrektur/Ergän
zung des Übergangskriteriums von A.0 nach A.1.
EDIT_4: Fehler (siehe Post von robo_wolf 10.04.2010) in "MENU8STRG_V02.asm" korrigiert, korrigierte Version hochgeladen