- Labornetzteil AliExpress         
Seite 10 von 14 ErsteErste ... 89101112 ... LetzteLetzte
Ergebnis 91 bis 100 von 136

Thema: Anfänger mit STK500 und Assembler

  1. #91
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.12.2005
    Beiträge
    535
    Anzeige

    Praxistest und DIY Projekte
    Guten Morgen, robo_wolf,

    ja, es hat mich beim Schreiben des Programms auch öfter in den Fingern gejuckt, den Zeitzähler früher wieder zurückzusetzen. - Aber: Wenn keine oder nur ungültige Tasten betätigt werden, dann ist es nur logisch, den Automaten bis zum Zustand "Totmannzeit erreicht" laufen zu lassen. Denn genau das ist es ja, was passiert ist: Es gab keine rechtzeitige gültige Eingabe. - Ausserdem ist es einfacher, wenn es nur ein Ereignis gibt, das den Zeitzähler zurücksetzt.

    Aber mein Programmentwurf ist nicht er einzig mögliche und sicher auch nicht der Beste ! Deshalb: Lass' mal die Finger wirbeln und versuch's mal so zu machen, wie Dir's vorschwebt! Der Vergleich konkurrierender Programmentwürfe ist eine sehr wichtige Quelle für Programmiererfahrung - besonders, wenn man die Entwürfe selbst geschrieben hat . Also, keine Hemmungen, meiner Mithilfe kannst Du gewiss sein.

    Zitat Zitat von robo_wolf
    Das Arbeiten mit Zeigern und das Verwenden des SRAM und Flash ist mir nun, Dank Deiner Hilfe, nicht mehr so fremd.
    Darauf kam's mir an! Freut mich .

    Ciao,

    mare_crisium

  2. #92
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    02.11.2005
    Ort
    Bayern
    Alter
    55
    Beiträge
    310
    Guten Abend mare_crisium,
    probiere schon in so mancher freien Minute, den Code so umzuschreiben, dass es meinen Vorstellungen entspricht. ... dauert noch
    Dabei ist eine Frage aufgetaucht:
    Das Simulieren der Tastenflanke geschieht mittels T-Flag.
    Damit wird ein Zeit-Reset gemacht oder man kommt damit wieder aus der Totzeit raus.
    Aber...
    eine Tastenflanke ensteht auch beim Druecken der Tastenkombi"0_7" ..
    --- Im momentanen ProgrammCode wuerde immer ein Reset stattfinden.
    Oder simulierst Du die Zustaende anders? Auch komme ich nicht in MNU8CTL_CHKTASTEN beim simulieren.

    Kannst Du mir noch einen Tipp geben?
    ### Silvio ###

  3. #93
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.12.2005
    Beiträge
    535
    Guten Morgen, robo_wolf,

    ja, die Tastenflanke setzt immer nur den Zeitzähler zurück. -

    Aber gehen wir doch mal den Fall „Ta0 und Ta7 betätigt“ durch. Dabei mache ich's wie Du und verwende für die Zustände der Menusteuerung (Bits2 und 3 des Zustandsbytes) statt der 0b00 den Buchstaben A, statt 0b01 das B usw. - Also, los geht's:

    Angenommen, Ta0 wird zuerst betätigt. Die Tastenflanke (T=1) setzt den Zeitzähler zurück, der neue Zustand ist A.0.

    Der Zeitzähler erreicht T0, bevor Ta7 betätigt wird: Die Prüfung des statischen Tastenzustands (CHKT07) liefert ein "Nein" (T=0). Der neue Zustand der Menusteuerung bleibt A. Der Zeitzähler läuft weiter, die Zustände laufen über A.1 bis A.3. Im Zustand A.3 bleibt bis eine neue Tastenflanke kommt.

    Jetzt wird Ta7 betätigt. Die Menusteuerung ist noch in Zustand A.X. Der Zeitzähler springt auf 0 zurück und fängt an, T0 abzuzählen; der neue Zustand ist A.0.

    Wenn er jetzt T0 erreicht, liefert die Prüfung des Tastenzustandes mit CHKT07 ein „Ja“ (T=1) und - voila - die Menusteuerung springt in den Zustand B.1. Der Zähler wird mit der Differenz (T1-T0) geladen und fängt an abzuzählen.

    Wird jetzt noch eine Taste betätigt. Der Zeitzähler wird zurückgesetzt, der neue Zustand ist B.0. Erreicht der Zeitzähler T0, dann liefert die Tastenprüfung ein „Nein“, weil mehr als Ta0 und Ta7 betätigt sind, der neue Zustand ist A.1 und die Steuerung läuft weiter bis A.3.

    Wird keine weitere Taste betätigt, dafür aber Ta0 oder Ta7 losgelassen, dann liefert die Prüfung nach Ablauf von T1 (Zustand B.1) ein „Nein“ und wir landen in Zustand A.2 und die Reise geht weiter bis A.3.

    Wenn aber beim Erreichen von T1 sowohl Ta0 als auch Ta7 weiterhin betätigt sind, dann liefert CHKT07 ein „Ja“ und die Steuerung geht in den Zustand C.2 über. Ab jetzt wartet sie auf Eingaben, die den gewünschten Menupunkt auswählen.

    Angenommen, Ta2 wird vor Erreichen der Totmannzeit betätigt. Das löst eine Tastenflanke aus, die den Zeitzähler wieder zurückgesetzt (das hast Du, glaub' ich, in Deiner Simulation vergessen ). Der neue Zustand ist C.0. Nach Ablauf von T0 wird der statische Tastenzustand geprüft (CHK_TASTEN). Je nachdem was dabei herauskommt muss jetzt die gewünschte Aktivität angestossen werden. Der Zeitzähler läuft derweil weiter. Wenn er die Totmannzeit erreicht, geht die Steuerung in den Zustand A.3 über und wartet auf die nächste Tastenflanke.

    Alles klar?

    mare_crisium

  4. #94
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    02.11.2005
    Ort
    Bayern
    Alter
    55
    Beiträge
    310
    mare_crisium,

    wie Du editiert die Bits 2 und 3 des Zustandbyte bei der Simulation?
    Sollten die Zustaende nicht selbst errechnet bzw. vom PC zugewiesen werden?

    Die Simulation fuer die Ta0 und T7 Erkennung hatte ich bisher so gestartet:
    Beim Initialisieren alle Prozeduren einmal komplett durch
    Der RAM schaut dann so aus:
    00 00 FF 02 00 9C 00 10
    Dann setzen ich fuer Ta0 und Ta7 in der MAIN r16 auf 0x81 setze das T-Flag und los.
    00 00 81 03 00 9C 00 10
    Erwarten wuerde ich dann vom Programm das es bis zu CHK_Tasten kommt...

    ... ich bin auf dem Holzweg ODER???


    hier noch einmal in einer anderen Darstellung den gewuenschten Programmablauf:
    Code:
    >>> Zeitstrang >>>
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    >>> Tastenflanke >>>
    <<< nicht erkannt
    >>>>>>>>> erkannt >>>>>>>>>>>>>>>>>>>>>>>>                
    -------------->>> Abfrage auf Ta0 und Ta7  
    <<<<<<<<<<<<<<<<< nicht erkannt
    -------------->>> erkannt>>>>>>>>>>>>>>>>>>  
    <<<<<<<<<<<<<<<<< kuerzer 3 Zeiteinheiten              
    -------------->>> erkannt 3 Zeiteinheiten  >>>>>>>>>>>>>>>>>>>>>> Menue erreicht
    ------------------------------------------------------------------>>> Totzeit 5 Zeiteinheiten gestartet >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Ta0 und Ta7 nicht losgelassen <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Totmannzeit abgelaufen <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    ------------------------------------------------------------------>>> Einzeltaste erkannt >>>>
    ------------------------------------------------------------------------------------------>>>> Menuepunkt gewaehlt
    <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    ### Silvio ###

  5. #95
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.12.2005
    Beiträge
    535
    robo_wolf,

    nee, nee Du bist schon richtig ! Gehen wir anhand des RAM vor:
    Wie Du schreibst, steht im RAM nach der Tatenflanke und wenn Ta0 und Ta7 betätigt sind
    00 00 81 03 00 9C
    So, jetzt musst Du das Programm einfach durchlaufen lassen. Es geht dann von selbst in den Zustand B.1 über. Im RAM steht dann
    00 05 81 02 00 9C
    05 ist das Zustandsbyte = 0b0101. Das bedeutet: Zeitzähler hat bis T0 gezählt. Deshalb steht in Bits1 und 0 die 0b01. Die Menusteuerung (Bits3 und 2) ist im Zustand 01. In Deiner Nomenklatur ist das Zustand B.1. Das Tastenbyte 0x81 bedeutet, dass weiterhin Ta0 und Ta7 betätigt sind.
    Lass' das Programm einfach weiterlaufen. Der Zeitzähler zählt die Differenz T1-T0 ab. Wenn er die Null erreicht, wird er mit 0x03 nachgeladen. Bevor die Anweisung "rcall MNU8CTL_HANDLER" ausgeführt wird, steht nun im RAM
    00 06 81 03 00 9C
    Das Zustandsbyte ist jetzt 0x06, das entspricht B.2. 0x81 bedeutet, dass Ta0 und Ta7 immer noch betätigt sind. Jetzt wird die Anweisung
    "rcall MNU8CTL_HANDLER" ausgeführt. Dabei wird "MNU8CTL_CHKT07" aufgerufen. Weil Ta0 und Ta7 noch immer betätigt sind, geht die Menusteuerung in den Zustand 2, also C über. Der RAM-Inhalt ist deshalb
    00 0A 81 03 00 9C
    Das Zustandsbyte ist 0x0A. Bits3 und 2 enthalten 0b10, also ist die Menusteuerung im Zustand 2 = C. Der Zeitzähler ist gerade mit derm Abzählen von T1 fertiggeworden, also steht in Bits1 und 0 die 0b10. Er fängt jetzt an, die Differenz T2-T1 abzuzählen.
    Das ist genau der Zustand, in dem die Ta0 und Ta7 wieder losgelassen werden dürfen und Menu-Auswahl-Taste betätigt werden muss. Sagen wir mal, Ta2 wird betätigt. Also in der Simulation das T-Flag setzen (es wurde ja eine neue Taste betätigt, das Flankenbit steht also an) und in r16 musst Du 0x02 schreiben.
    Wg. der Tastenflanke führt das Programm die Anweisung "rcall MNU8CTL_ZYTRESET" aus. Nachdem auch "rcall MNU8CTL_HANDLER" ausgeführt ist, steht im RAM
    00 08 02 03 00 9C
    Das Zustandsbyte ist 0x08, was dem Zustand C.0 entspricht. Das Programm läuft weiter bis T0 abgezählt ist, Im RAM steht jetzt
    00 09 02 00 00 9C
    Anschliessend wird vom "MNU8CTL_HANDLER" die Prozedur "MNU8CTL_CHKTASTEN" aufgerufen und die gewünschte Aktion angestossen. Im RAM steht danach
    00 09 02 02 00 9C

    So weit einverstanden ?

    mare_crisium

  6. #96
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    02.11.2005
    Ort
    Bayern
    Alter
    55
    Beiträge
    310
    Guten Morgen mare_crisium,
    jetzt ist alles klar.
    Wir sind teilweise unterschiedlicher Meinungen bezueglich der Tastenflanke gewesen. Ausserdem habe ich den nachfolgenden Zustand von 0x0A nicht bedacht. Ta0 und Ta7 3 sec erkannt - aber weiter gedrueckt gehalten. Habe hier auch das Posting vorher erweitert.
    ### Silvio ###

  7. #97
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    02.11.2005
    Ort
    Bayern
    Alter
    55
    Beiträge
    310
    Guten Morgen mare_crisium,
    habe nun endlich den Code so weit, dass ich ihn posten kann.
    Aenderungen:
    Ohne Tastenflanke - kein kompletter Durchlauf bis zur Totmannzeit
    Einzeltastenabfrage zur Erkennung, ob nur eine Taste zur Auswahl ansteht.
    Nach Tastenerkennung in CHKTASTEN ist jetzt eine Programmunterbrechnung eingebaut, die auf Anfangsbedingungen setzt.
    Ergebnisaufnahme in Datensegment zur weiteren Verarbeitung abgelegt.
    Menuesignalisierung eingepflegt-tut aber noch nichts.

    Wenn ich mir das Programm so anschaue, bin ich nicht 100ig zufrieden damit.
    Es gibt noch viel Optimierungspotential...
    Angehängte Dateien Angehängte Dateien
    ### Silvio ###

  8. #98
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    02.11.2005
    Ort
    Bayern
    Alter
    55
    Beiträge
    310
    mare_crisium,
    wie ich schon geschrieben habe, mache ich mir noch weitere Gedanken zur Verbesserung.
    Was haelst du davon, bespielsweise die Einzeltastenabfrage und /oder die Abbruchfunktion mit in die Tabelle einzubauen?
    Kann man die Spalteneintraege in 3 oder gar mehr erweitern.. die natuerlich dann in dem Handler mit ansprechen?
    z.B.:
    .dw .dw MNU8CTL_NOP, 0x0000 ; MNU8CTL_TU_WAS; 0 ->
    Hatte mir auch in die Richtung Gedanken gemacht:
    Ein Umstricken der Tabelle und den zeitlichen Verlauf mit einbauen(bissel sehr gewagt - ich weiss)
    Code:
    .dw MNU8CTL_NOP, 	0x0000		;  0 -> Tastenflanke erkannt
    ; Menusteuerung im Zustand 1 -> 3Zeiteinheiten
    .dw MNU8CTL_CHKT07, 0x0001		;  1 -> 
    .dw MNU8CTL_CHKT07, 0x0001		;  2 -> 
    .dw MNU8CTL_CHKT07, 0x0011		;  3 -> MenueEinstieg erreicht
    
    ; Menusteuerung im Zustand 2 -> 5Zeiteinheiten
    .dw MNU8CTL_CHKTASTEN, 0x0002	;  4 -> 
    .dw MNU8CTL_CHKTASTEN, 0x0002	;  5 -> 
    .dw MNU8CTL_CHKTASTEN, 0x0002	;  6 -> 
    .dw MNU8CTL_CHKTASTEN, 0x0002	;  7 -> 
    .dw MNU8CTL_CHKTASTEN, 0x0022	;  8 -> Totmannzeit erreicht
    
    ; Menusteuerung im Zustand x (vorerst unbenutzt)
    .dw MNU8CTL_NOP, 	0x0000		; 9 -> 
    .dw MNU8CTL_NOP, 	0x0000		; 10 -> 
    .dw MNU8CTL_NOP, 	0x0000		; 11 -> 
    .dw MNU8CTL_NOP, 	0x0000		; 12 -> 
    .dw MNU8CTL_NOP, 	0x0000		; 13 -> 
    .dw MNU8CTL_NOP, 	0x0000		; 14 -> 
    .dw MNU8CTL_NOP, 	0x0000		; 15 -> 
    
    .equ MNU8CTL_TBL_LNG	= 16 ;
    ### Silvio ###

  9. #99
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.12.2005
    Beiträge
    535
    robo_wolf,

    hab's mir gerade runtergeladen, melde mich demnächst.

    Ciao,

    mare_crisium

  10. #100
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.12.2005
    Beiträge
    535
    robo_wolf,

    so, hier sind meine Kommentare zu Deinem Programm. Mein Eindruck ist, dass Du ruhig die Zustandstabelle ändern solltest . Ich hab' Dir ein paar Vorschläge dazu in den Quelltext geschrieben.

    Ciao,

    mare_crisium
    Angehängte Dateien Angehängte Dateien

Seite 10 von 14 ErsteErste ... 89101112 ... LetzteLetzte

Berechtigungen

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

12V Akku bauen