- SF800 Solar Speicher Tutorial         
Seite 9 von 14 ErsteErste ... 7891011 ... LetzteLetzte
Ergebnis 81 bis 90 von 136

Thema: Anfänger mit STK500 und Assembler

  1. #81
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    02.11.2005
    Ort
    Bayern
    Alter
    55
    Beiträge
    310
    Anzeige

    E-Bike
    Hallo mare_crisium,
    habe mir gestern abend noch die 1.Version geladen. Bin aber nicht mehr dazu gekommen alles zu testen.
    Werde mir gleich einmal die neue Version laden und sie mir zu Gemuete fuehren. Vorab erst einmal wieder ein grosses Daaaankeschoen.
    ### Silvio ###

  2. #82
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    02.11.2005
    Ort
    Bayern
    Alter
    55
    Beiträge
    310
    Hallo mare_crisium,
    habe mir nun mal alles im Simulator angeschaut.
    Und bin gleich beim Start auf Probleme gestossen.
    Code:
    .device  ATmega8515
    .include "m8def.inc"
    Was bewirkt ".device ATmega8515".
    Durch die inc vom mega8 wurde sofort beim Sprung in eine Sub ein Fehlermeldung ausgegeben. ->nicht initialisierter Stack.
    Mein Simulator simuliert den Mega8515 der hat nur halb so viel Speicher, wie der Mega8.
    Habe deswegen die inc auf Mega8515 umgestellt.
    Dann lief es auch normal durch.

    melde mich erst wieder nach den Osterfeiertage - bin wieder mal auf Reisen

    wuensche ein Frohes Osterfest
    ### Silvio ###

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

    die beiden Anweisungen sind natürlich Kokolores. Wahrscheinlich sind die mir da 'reingerutscht, weil ich mit dem Projektmanager beim Anlegen der neuen Version nicht aufgepasst hab . Einfach beide Zeilen löschen und durch
    Code:
    .include "m8515def.inc"
    ersetzen. Dann klappt's wirklich... .

    Geniess Ostern!

    mare_crisium

  4. #84
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    02.11.2005
    Ort
    Bayern
    Alter
    55
    Beiträge
    310
    mare_crisium,
    will mich heute endlich mal wieder melden.
    Habe nun Deinen Code schon mehrmals durch den Simulator getickert.
    Leider ist bei mir der Groschen noch immer nicht am Boden angekommen.
    Aber ich arbeite dran... ;.-)
    Kann aber auch noch nicht 100%ig sagen woran das genau liegt.
    Eventuell seh ich auch nur den Wald vor lauter Baeumen nicht.
    Bin gerade dabei den Ablauf aus dem Code mit meinen Worten heraus zu schreiben, um Ihn letzlich komplett zu verinnerlichen.

    Versuche bis heute Abend damit fertig zu sein.
    ### Silvio ###

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

    nur nicht hetzen ! Ich habe ja auch ziemlich viel daran herumgetüftelt.

    Angefangen hatte ich mit dem naheliegenden Ansatz: Einem Algorithmus, der brav die verschiedenen Stadien des Einschaltens der Menusteuerung und später das Verhalten im eingeschalteten Zustand durchbuchstabiert.

    Diese Lösung gefiel mir aber nicht, weil sie in einen Wust von Fallunterscheidungen ausuferte. Besonders verwirrend fand ich, dass während des Einschaltvorgangs einmal die Tastenflanke das auslösende Ereignis ist, und dann wieder das Ablaufen eines Warteintervalls. Auch die Zeitintervalle, die überwacht werden müssen, unterscheiden sich, abhängig vom Zustand der Menusteuerung: Beim Einschalten sind es T0, T1 und T2. Nachdem die Steuerung eingeschaltet ist, braucht man nur noch die Totmannzeit T2 überwachen.

    Wie sich nach einigem Herumprobieren herausstellte, wird das Ganze übersichtlicher, wenn man die Zeitmessung (T0 -> T1 ->T2) immer gleich ablaufen lässt; sie also davon unabhängig macht, ob die Menusteuerung eingeschaltet ist oder nicht. Ganz entscheidend ist es, die Zeitmessung bei jeder Tastenflanke neu zu starten: Eine neue Tasteflanke wird dann durch das Zurückspringen des Zeitzählers auf Null angezeigt, bzw. dadurch, dass T0 (oder T1) abläuft. Dadurch braucht man nur noch die Zeitmessung zu überwachen, nicht die Tastenflanken.

    Das ist die wesentliche Vereinfachung .

    Um festzustellen, was der Bediener mit seiner Eingabe bezweckte, braucht man nur noch bei T0 bzw. T1 den statischen (nicht den dynamischen) Zustand der Tasten abfragen: Die Tatsache, dass T0 bzw. T1 erreicht werden, zeigt ja schon an, dass mindestens eine der Tasten neu betätigt wurde. Bei Erreichen von T2 geht's immer auf direktem Weg zurück nach "Los" (Schrittnummer 0x00).

    Viel Spass beim Nachtüfteln .

    Ciao,

    mare_crisium

  6. #86
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    02.11.2005
    Ort
    Bayern
    Alter
    55
    Beiträge
    310
    Hallo mare_crisium,

    je intensiver ich mich damit beschaeftige, um so mehr bewegt sich der Groschen dem Boden.
    ... aber der Kopf qualmt schon ein wenig... - macht aber nichts -
    Meine Frau liest einen Krimi und finde es eben spannend mich durch den Code zu arbeiten.
    Trotzdem bitte ich Dich mal das Untere zu lesen und ggf. zu korrigieren.
    - bin aber noch nicht ganz fertig, mit dem Durcharbeiten und Verstehen -
    Den kompletten "MNU8CTL_HANDLER" habe ich noch nicht durch...

    Frage zum Ablauf:
    In der Doku auf Seite 1 "Jedes Menu hat 8 Menupunkte, die durch Betätigen eines einzelnen Tasters
    (Taste0 bis Taste7) ausgewählt werden."
    -->> die Idee war ein Menue, in dem 8 Menuepunkte erkannt werden koennen. Meintest Du es so? oder meinst Du 8 Menues mit 8 Menuepunkten?


    Doku mare_crisium(wie ich es verstanden habe - bitte verbessere mich, wenn es anders gemeint war):
    A.0 Abfrage auf Ta0 oder Ta7 log 1
    Rueckgabe 0 -> A.0
    Rueckgabe 1 -> A.1

    A.1 1.Abfrage auf Ta0 oder Ta7 log 1
    Rueckgabe 0 -> A.0
    Rueckgabe 1 -> 2. Abfrage
    2.Abfrage auf Ta0 oder Ta7 log 1 nach Ablauf von T1
    Rueckgabe 0 -> A.0
    Rueckgabe 1 -> A.2

    A.2 Abfrage aller Tasten(0-7)
    Rueckgabe := Tasten-ID
    Rueckgabe mehrere Tasten IDs = Fehlerfall ->Signalisierung + Start von A.2
    T2 abgelaufen -> A.0

    ICALL hatte ich bis jetzt noch nie verwendet - nun weiss ich, was es damit auf sich hat.




    ############# meine Gedankenstuetze
    Ablauf der Menuesteuerung nach mare_crisium
    Bsp.:
    Code:
    Datenspeicher(Datensegement) 
    MNU8CTL = RAM_Anfang = 0x60
    MNU8CTL_LNG = 12 = 0x0C (Byte im Datenspeicher reserviert)
    MNU8CTL_TBL_LNG = 16 = 0x10 (Laenge der Zustandstabelle)
    
     aktuelle Zustandsnummer der Menusteuerung
    MNU8CTL_FLAGS	    =  0 (Flags)
    MNU8CTL_AKTZUST	    =  1 (aktueller Zustand)	
    MNU8CTL_TASTZUST	=  2 (Tastenzustand)
    MNU8CTL_ZYTZHLRL	=  3 (Zaehler-Adresse-Low)
    MNU8CTL_ZYTZHLRH	=  4 (Zaehleradresse -High)
    MNU8CTL_TBLADRL	    =  5 (Adresse Zustandstabelle -Low)
    MNU8CTL_TBLADRH	    =  6 (Adresse Zustandstabelle -High)
    MNU8CTL_MAXNR		=  7 (maximale Anzahl Datensaetz in Zustandstabelle)
    
    -----------------------------------------------------------------------------------------------------------------------------------
                              0x60     0x61     0x62     0x63     0x64     0x65     0x66     0x67     0x68     0x69     0x6A     0x6B
    -----------------------------------------------------------------------------------------------------------------------------------
    y = MNU8CTL                X
    -----------------------------------------------------------------------------------------------------------------------------------
    y+MNU8CTL_LNG                                                                                                                 X
    -----------------------------------------------------------------------------------------------------------------------------------
    y+MNU8CTL_FLAGS            X
    -----------------------------------------------------------------------------------------------------------------------------------
    y+MNU8CTL_AKTZUST                   X
    -----------------------------------------------------------------------------------------------------------------------------------
    y+MNU8CTL_TASTZUST                           X
    -----------------------------------------------------------------------------------------------------------------------------------
    y+MNU8CTL_ZYTZHLRL                                    X
    -----------------------------------------------------------------------------------------------------------------------------------
    y+MNU8CTL_ZYTZHLRH                                             X
    -----------------------------------------------------------------------------------------------------------------------------------
    y+MNU8CTL_TBLADRL                                                      X
    -----------------------------------------------------------------------------------------------------------------------------------
    y+MNU8CTL_TBLADRH                                                               X
    -----------------------------------------------------------------------------------------------------------------------------------
    y+MNU8CTL_MAXNR                                                                          X
    -----------------------------------------------------------------------------------------------------------------------------------
    reserve                                                                                            X        X        X       X
    -----------------------------------------------------------------------------------------------------------------------------------
    MNU8CTL_CREATE:
    im Datenspeicher ab 0x60 mit einer Laenge von MNU8CTL_LNG :=16 Byte reservieren und mit 0 fuellen
    in Speichertstelle y+MNU8CTL_MAXNR(0x67) die Anzahl der max. Zustaende speichern
    in Speicherstellen y+MNU8CTL_TBLADRL und y+MNU8CTL_TBLADRH den Zeiger auf die Zustandstabelle speichern(0x65 und 0x66)

    MNU8CTL_ZYTRESET:
    im Datenspeicher an y+MNU8CTL_ZYTZHLRL(0x63) und y+MNU8CTL_ZYTZHLRH(0x64) den Wert von T0 speichern

    MNU8CTL_SETTASTEN:
    im Datenspeicher an y+MNU8CTL_TASTZUST(0x62) die statischen( simulieret Tasten) Zustaende der Tasten speichern

    MNU8CTL_ZYTCOUNT:
    aus Datenspeicher an y+MNU8CTL_ZYTZHLRL(0x63) und y+MNU8CTL_ZYTZHLRH(0x64) den Wert von T0 lesen
    MU8CT_ZTCT04:
    im Datenspeicher an y+MNU8CTL_ZYTZHLRL(0x63) und y+MNU8CTL_ZYTZHLRH(0x64) den decr. Wert von T0 speichern

    MNU8CTL_HANDLER:
    1.Byte low =(0x1 und 2.Byte high =(0x01) aus Zustandstabelle lesen - Zeiger auf die auszuefuehrende Prozedur (icall)???? - zusammen das DoppelByte 0x0118
    3.Byte low =(0x00) und 4.Byte high =(0x00) aus Zustandstabelle lesen - Folgezustand
    icall ruft Prozedur welche an FlashAdresse (0x011 vom Z-Zeiger auf

    bis zum naechsten MAIN-Aufruf
    ##################
    ### Silvio ###

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

    na, ich schliesse aus Deinen Fragen, dass der Groschen nicht mehr weit hat !

    Ja, bei der Beschreibung des Übergangskriteriums von A.0 nach A.1 habe ich in der pdf-Datei einen Fehler gemacht und eine Erklärung unterschlagen. Beides habe ich in der Version _V09 ausgebessert.

    Zuerst ist das Kriterium für A.0->A.1 die Tatsache, dass von Ta0 oder Ta7 mindestens eine Tastenflanke ansteht (nicht, wie in Version _V08 geschrieben "keine der beiden"). Nachdem mir aber die Idee gekommen war, die Zeitmessung bei jeder Tastenflanke neu zu starten, habe ich das Übergangskriterium modifiziert, ohne das in der doku deutlich zu machen (ist jetzt in _V09 ergänzt). Und zwar genügt es ja, wenn die Zeitmessung neu begonnen und T0 erreicht hat, zu überprüfen, ob zu diesem Zeitpunkt Ta0 und Ta7 betätigt sind. Wenn das nämlich so ist, dann wurde eine von beiden zur Zeit t=-T0 neu betätigt. Fehlt zu diesem Zeitpunkt eine von beiden, oder sind ausser den beiden noch andere Tasten betätigt, geht's zurück nach A.0.

    Deine Aufstellung muss also so aussehen:
    A.0 Abfrage auf Ta0 und Ta7 nach Ablauf von T0 log. 1
    Resultat "Nein" -> A.0
    Resultat "Ja" -> A.1

    A.1 Abfrage auf Ta0 und Ta7 nach Ablauf von T1 log. 1
    Resultat "Nein" -> A.0
    Resultat "Ja" -> A.2

    Die Abfrage in A.2 hast Du so richtig dargestellt. Auch die Kurzbeschreibungen der Prozeduren ist so richtig. Nur bei MNU8CTL_ZYTCOUNT wird nicht nur der Wert von T0 heruntergezählt sondern auch der von (T1-T0) und der von (T2-T1). Bei MNU8CTL_HANDLER wird der Zeiger auf die auszuführende Prozedur aus den ersten beiden Bytes nach zh:zl geladen und dann mit der "icall"-Anweisung angesprungen, genau so, wie Du's beschreibst. Die Prozedur entscheidet mit dem Wert, den sie im T-Flag zurückgibt, welcher Folgezustand eingestellt werden soll. Das hast Du auch richtig.

    Ciao,

    mare_crisium

  8. #88
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    02.11.2005
    Ort
    Bayern
    Alter
    55
    Beiträge
    310
    mare_crisium,
    es geht immer noch langsam, aber weiter...
    schau mal, das kann doch nicht stimmen?
    [Code]
    MU8CTL_ZTCT02:
    ; ZYTZUST > 1
    cpi r18,0x02 ;ist ZYTZUST = 2?
    brne MU8CTL_ZTCT03
    [Code/]
    muss es nicht so heissen?
    [Code]
    MU8CTL_ZTCT02:
    ; ZYTZUST > 1
    cpi r16,0x02 ;ist ZYTZUST = 2?
    brne MU8CTL_ZTCT03
    [Code/]
    habe mal den kompletten Ablauf ohne Eingriff bzw. Bit-Manipulation aufgeschrieben(in Main "ser r16":
    ######
    keine Taste gedrueckt:
    | A.0
    V
    Zaehler an Adressey+MNU8CTL_ZYTZHLRL) wird von 0x03 auf 0x00 herab gezaehlt
    -> aktueller Zustand an Adressey+MNU8CTL_AKTZUST) von 0x00(Zyt 0) auf 0x01(Zyt 1) gesetzt und Zaehler an Adressey+MNU8CTL_ZYTZHLRL) auf T1-T0 = 5-3 = 0x02 gesetzt
    | A.1
    V
    Zaehler an Adressey+MNU8CTL_ZYTZHLRL) wird von 0x02 auf 0x00 herab gezaehlt
    -> aktueller Zustand an Adresse (y+MNU8CTL_AKTZUST) von 0x01(Zyt 1) auf 0x02(Zyt 2) gesetzt und Zaehler an Adressey+MNU8CTL_ZYTZHLRL) auf T2-T1 = 8-5 = 0x03 gesetzt
    | A.2
    V
    Zaehler an Adressey+MNU8CTL_ZYTZHLRL) wird von 0x03 auf 0x00 herab gezaehlt
    -> aktueller Zustand an Adresse (y+MNU8CTL_AKTZUST) von 0x03(Zyt 3) wird erneut mit 0x03 geladen
    |
    V
    Totmannzeit erreicht - Zustaende bleiben nun fix
    ######
    // bin ich noch auf den richtigen Weg?

    als Naechstes moechte ich in der Main r16 mit "0x01", "0x02", "0x80", "0x81", "0x82" laden...
    ### Silvio ###

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

    ja, die Anweisung muss "cpi r16,0x02" heissen, nicht "cpi r18,0x02". Hab' die korrigierte Datei neu hochgeladen.

    Den Ablauf, den Du in Deinem Posting darstellst, bekomme ich im Simulator auch. Er belässt den Zustand der Menusteuerung bei "0x00", weil ausser Ta0 und Ta7 noch mehr Tasten betätigt sind (simuliert). Am Ende landet der Ablauf im Zustand 0x03, d.h. Totmannzeit abgelaufen. Von hier aus geht's nur weiter, wenn eine neue Tastenflanke ansteht.

    Ja, bist noch auf der richtigen Fährte !

    Ciao,

    mare_crisium

  10. #90
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    02.11.2005
    Ort
    Bayern
    Alter
    55
    Beiträge
    310
    mare_crisium,
    die Menu8Stg habe ich so weit verstanden.
    Aber warum laesst Du den Code immer bis zur Totmannzeit laufen?
    Wenn keine Taste gedrueckt ist, kann der Code doch schon vorher abgefangen werden.

    Was spricht gegen diesen Ablauf:
    ############
    keine Tastenflanke erkannt (T-Flag nicht gesetzt) / A.0
    ! ->
    keine Erkennung von Tasten 0 und 7 / kein A.1


    Tastenflanke erkannt (T-Flag gesetzt)
    ! ->
    Erkennung ob Taste 0 und 7 (0x81) anstehen / A.1
    in der Zeitnachfuehrung immer wieder auf (0x81)ueberpruefen
    -> wenn (0x81) vor Ablauf der Zeitnachfuehrung nicht mehr ansteht -> dann wieder zuzrueck zu A.0
    -> wenn (0x81) am Ende der Zeitnachfuehrung noch antsteht -> dann in Tastenauswertung fuer Menuepunkt A.2
    ! ->
    Tasten fuer Menuepunkte erkennen / A.2
    in der Zeitnachfuehrung auf Tasten testen
    -> wenn vor Ablauf der Totmannzeit keine einzelne Taste erkannt wurde fuer Menuepunkt erkannt wurde -> dann wieder zurueck zu A.0
    -> Tasten erkannt -> "Menuepunkt gestetzt" -> dann zureuck zu A.0
    ############

    Aber wahrscheinlich hast Du hier in Deinen Gedanken schon viel weiter gedacht als ich es ueberschaue...
    Du hast sicher nicht ohne Grund Platz fuer Erweiterungen gealssen ... ODER?

    Aber wieder viel dazu gelernt und das ist wichtig,. ......wenn es auch etwas laenger gedauert hat.
    Das Arbeiten mit Zeigern und das Verwenden des SRAM und Flash ist mir nun, Dank Deiner Hilfe, nicht mehr so fremd.
    ### Silvio ###

Seite 9 von 14 ErsteErste ... 7891011 ... LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test