PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DT Befehl



masterPic
06.12.2013, 09:03
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 :confused:


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:



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:



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!

witkatz
06.12.2013, 11:48
Auf RN-Wissen findest du eine andere, recht ausführliche und verständliche Erklärung: http://www.rn-wissen.de/index.php/PIC_Assembler#Tabellen

masterPic
06.12.2013, 11:53
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....

witkatz
06.12.2013, 12:27
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/en/AppNotes/00556e.pdf

masterPic
06.12.2013, 13:37
Ich habe zwischenzeitlich noch ein bisschen gegoogelt. Mit deiner Erklärung komme ich zu meiner derzeitigen Erkenntnis:

Ein Beispiel:




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:




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??

witkatz
06.12.2013, 14:09
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
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.

RoboHolIC
06.12.2013, 22:54
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.

PICture
07.12.2013, 10:45
Hallo!

Nur als Bestätigung: https://www.roboternetz.de/community/threads/47250-Werte-Tabelle-mit-ASM-Probleme-mit-PCLATH .

Ich möchte mich sehr beim RoboHolIC bedanken und den Link: http://ww1.microchip.com/downloads/en/AppNotes/00556e.pdf habe ich bereits in Wiki-Artikel eingefügt. ;)

masterPic
09.12.2013, 13:22
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.... :cool: