-         

Ergebnis 1 bis 9 von 9

Thema: DT Befehl

  1. #1

    DT Befehl

    Anzeige

    Moin Gemeinde

    Mich fasziniert die Arbeit mit den kleinen schwarzen Käfern ungemein. Daher habe ich mir eine Grundausstattung zugelegt, die
    alles beinhaltet was man zum proggen, simulieren und brennen benötigt. Auch habe ich schon ein paar kleinere Assembler Programme
    geschrieben, die genau nach meinen Vorstellungen funktioniert haben. Dafür musste ich auch zahlreiche Lektüren rund um die
    PIC-Programmierung lesen. Ich bin nicht gerade begriffsstutzig, aber an einem Punkt "streiken" meine Synapsen


    Ich versuche eine LED Uhr zu entwickeln. Dafür Suche ich natürlich nach Dokumentationen die ich codetechnisch analsysiere. Ich schaue wie es die anderen machen. Es geht mir nicht darum fertigen Code irgendwo runterzuladen und in den PIC zu packen. Eher möchte ich dadurch verstehen, was einzelne mir noch unbekannte Befehle bewirken, damit ich meinen eigenen Code entwickeln kann...mein Problem ist aber der Pseudo-Befehl DT. Mit diesem soll es möglich sein, eine Tabelle mit definierten Rücksprungadressen zu definieren (RETLW). Die Dokumentationen für diesen Befehl ist sehr kurz gehalten und kapier es einfach nicht...

    Hier die Erklärung:

    Code:
    DT 	               Ablage von 8-Bit-Bytes im Programmspeicher als RTLW-Befehl
    Syntax: 	       DT <string>
                           DT <zahlenwert>
    Beschreibung:    Der DT-Befehl erzeugt 8-Bit Zahlen, und fügt sie als RTLW-Befehl an der aktuellen Stelle im Programmcode ein. 
    Beispiel: 	       DT   "ab"      ; erzeugter Code: retlw 'a'   retlw  'b' 
                           DT   0x1F     ; erzeugter Code: retlw  0x1F
    und hier mal die Tabelle:

    Code:
    TABSTUNDEN addwf PC,f
    dt .24
    dt .2,.4,.6,.8,.10,.12,.14,.16,.18,.20,.22,.24
    dt .2,.4,.6,.8,.10,.12,.14,.16,.18,.20,.22
    dt .0,.0,.0,.0,.0,.0,.0,.0,.0
    Kann mir vieleicht jemand erklären wie diese Tabelle aufgebaut wird bzw funktioniert?

    Für eure Bemühungen bedanke ich mich im voraus!

  2. #2
    RN-Premium User Roboter-Spezialist Avatar von witkatz
    Registriert seit
    24.05.2006
    Ort
    NRW
    Alter
    47
    Beiträge
    456
    Blog-Einträge
    16
    Auf RN-Wissen findest du eine andere, recht ausführliche und verständliche Erklärung: http://www.rn-wissen.de/index.php/PI...mbler#Tabellen

  3. #3
    vielen Dank für deinen Tip. Diese Anleitung hatte ich schon gelesen....hat nicht viel gebracht.....
    Ich glaube auch das es garnicht so schwer ist..ich habe lediglich eine kleine Blockade...
    Ich brauchs in einfacherer Version....

  4. #4
    RN-Premium User Roboter-Spezialist Avatar von witkatz
    Registriert seit
    24.05.2006
    Ort
    NRW
    Alter
    47
    Beiträge
    456
    Blog-Einträge
    16
    Willkommen im Club der Mikrocontroller-faszinierten.

    Eine Wertetabelle ist ziemlich einfach. Als Beispiel: du willst den dritten Wert aus der Tabelle holen:
    - schreibst 3 in w
    - ruftst das Unterprogramm auf: call TASTBUNDEN
    - in dem Unterprogramm wird der PC, der Program Counter um den Inhalt von w (hier 3) erhöht, also das Programm springt um 3 Programmadressen weiter
    - drei Adressen weiter steht der RETLW, der Rücksprung-Befehl mit einer Konstanten in w, hier mit dem dritten Tabellen-wert
    - der Prozessor spring also zurück zur Adresse hinter call TASTBUNDEN und in w ist der dritte Tabellenwert

    Einfacher kann ich es nicht erklären. Vielleicht kannst du dir das aufmalen oder in Simulation beobachten, was mit den Werten in w und PC beim Aufruf der Wertetabelle passiert. Wenn man es sich bildlich vorstellen kann, hilft das meistens zu verstehen.

    Gruß
    witkatz


    Ergänzung

    Sorry, ich meinte natürlich den dritten Wert in der zweiten Zeile.
    addwf PC,f addiert einen offset in den Program Counter, für den ersten Tabellenwert also ersten Wert in deiner ersten Zeile muss 0 in w stehen. Oder?
    Microchip nennt das Verfahren Computed GOTO. Vielleicht hilft eine Microchip Doku, alle Klarheiten zu beseitigen: http://ww1.microchip.com/downloads/e...tes/00556e.pdf
    Geändert von witkatz (06.12.2013 um 12:49 Uhr)

  5. #5
    Ich habe zwischenzeitlich noch ein bisschen gegoogelt. Mit deiner Erklärung komme ich zu meiner derzeitigen Erkenntnis:

    Ein Beispiel:

    Code:
    movlw d'5'   ; Wert wird aus irgendeiner Routine ins Arbeitsregister geladen
    
    ...
    
    TABSTUNDEN addwf PC, f  ; Wert aus dem Arbeitsverzeichnis wird mit dem inhalt aus dem Register PC addiert und ins Register PC geschrieben
    dt .24
    dt .2,.4,.6,.8,.10,.12,.14,.16,.18,.20,.22,.24
    Die Tabelle könnte, soweit richtig verstanden, auch so geschrieben werden:

    Code:
    TABSTUNDEN addwf PC, f
    retlw .24
    retlw .2
    retlw .4
    retlw .6
    retlw .8
    retlw .10
    retlw .12
    retlw .14
    retlw .16
    retlw .18
    retlw .20
    retlw .22
    retlw .24
    Dann wäre der Rückgabewert aus der Tabelle die 10...

    Soweit richtig verstanden??

  6. #6
    RN-Premium User Roboter-Spezialist Avatar von witkatz
    Registriert seit
    24.05.2006
    Ort
    NRW
    Alter
    47
    Beiträge
    456
    Blog-Einträge
    16
    Richtig. Natürlich muss die Tabellen-Routine noch mit call aufgerufen werden. Hier ein sinnfreies Beispiel zum beobachten im MPLAB Simulator. In der ersten Zeile kannst du ein Breakpoint setzen, mit F7 durchtakten und dabei die Statusanzeigen beobachten
    Code:
    main
        movlw d'5'
        ; in w steht jetzt 5
        call TABSTUNDEN
        ; in w steht jetzt 10
        goto    main
    
    TABSTUNDEN addwf PCL,f    
        retlw .24 
        retlw .2 
        retlw .4 
        retlw .6 
        retlw .8 
        retlw .10 
        retlw .12 
        retlw .14 
        retlw .16 
        retlw .18 
        retlw .20 
        retlw .22 
        retlw .24
    
        END

    Ergänzung 8.12.13, 14:52, nach Experten-Warnungen von RoboHolIC und PICture:
    Dieses Beispiel ist kein Implementierungsvorschlag. Das ist NUR ein aufs Wesentliche reduzierter didaktischer Dreizeiler, der dem TE die grundsätzliche Funktion der Wertetabelle veranschaulichen soll. Für eine robuste Implementierung in einer Anwendung sollte man zwingend die Hinweise zum möglichen Adressüberlauf beachten, dazu am besten die App Note AN556 und die Beispiele in RN-Wissen studieren.
    Geändert von witkatz (08.12.2013 um 14:52 Uhr) Grund: Ergänzung

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    03.09.2009
    Ort
    Berlin (Mariendorf)
    Beiträge
    938
    Hallo masterPIC.

    Das war auch mein erster Gedanke: Hol dir am Besten von der Microchip-Website die Application Note AN556. Anhand derer habe ich das "Computed Goto" recht gut verstanden. Vor allem wird dort ein allgemeingültiger Code vorgestellt, der auch den Übertrag im Adresszähler berücksichtigt. Eine solche Tabelle kann quasi an beliebiger Stelle im Programm(speicher) stehen.
    Anders das bisher hier vorgeschlagene: PCL ja 8 Bit breit, adressiert folglich nur Abschnitte von je 256 Programmadressen. Wenn die Tabelle z.B. im Befehlswort 253 einer Code Page beginnt, gehen alle Zugriffe ab dem Index 4 "in die Hose", wenn der ggf. anfallende Übertrag auf PCLATH unterbleibt. Man muss dann nicht nur die maximale Tabellenlänge sondern auch noch das Alignment genau beachten, damit kein Adressübertrag vorkommt.

    Ich steh auch nicht auf Copy 'n Paste, aber die Sache mit den Tabellen hab ich bei Microchip abgeschrieben, weil das so elementar ist und dort astrein implementiert wurde.

  8. #8
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    66
    Beiträge
    10.969
    Hallo!

    Nur als Bestätigung: http://www.roboternetz.de/community/...eme-mit-PCLATH .

    Ich möchte mich sehr beim RoboHolIC bedanken und den Link: http://ww1.microchip.com/downloads/e...tes/00556e.pdf habe ich bereits in Wiki-Artikel eingefügt.
    Geändert von PICture (07.12.2013 um 11:27 Uhr)
    MfG (Mit feinem Grübeln) Wir unterstützen dich bei deinen Projekten, aber wir entwickeln sie nicht für dich. (radbruch) "Irgendwas" geht "irgendwie" immer...(Rabenauge) Machs - und berichte.(oberallgeier) Man weißt wie, aber nie warum. Gut zu wissen, was man nicht weiß. Zuerst messen, danach fragen. Was heute geht, wurde gestern gebastelt. http://www.youtube.com/watch?v=qOAnVO3y2u8 Danke!

  9. #9
    Vielen Dank für die Infos. Habe soweit dann auch erstmal das grobe kapiert. Ich werde heute abend dann mal die AN556 studieren... und wehe ich verstehe das nicht....

Ähnliche Themen

  1. if befehl verwenden!
    Von DanyD im Forum C - Programmierung (GCC u.a.)
    Antworten: 5
    Letzter Beitrag: 28.02.2010, 20:16
  2. Suche Befehl!!
    Von Killer im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 03.04.2008, 08:05
  3. At Befehl
    Von Guidobald im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 03.08.2007, 17:12
  4. Overlay Befehl
    Von Zeroeightfifteen im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 31.03.2006, 19:45
  5. Befehl Clockdivision
    Von Rage_Empire im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 17.08.2005, 08:33

Berechtigungen

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