Forum: Mikrocontroller und Digitale Elektronik PIC16F690 Tabelle erstellen wie beim Intel


von Thomas B. (dertom83)


Lesenswert?

hi, ich habe mal nen Controller von Intel programmiert und da sah der 
qelltext so aus:

Tabelle:   db   1, 2, 3, 5, 7, 11, 13, 17, 19
           db   23, 29, 31, 37, 41, 43, 47, 53
           db   59, 61, 67, 71, 73, 79, 83, 89
           db   97, 101, 103

und dann konnte ich den Inhalt von Tabelle nacheinander auslesehn... der 
Befehl sah in etwas so aus:
...
MOV   A,#0

...
INC   A
MOV   DPTR,#Tabelle
MOVC  A,@A+DPTR
MOV   Temp,A
...

Gibt es so eine funktion auch beim PIC?

von Rüdiger K. (sleipnir)


Lesenswert?

Das nennt sich speicherindirekte Adressierung mit Displacement. Evtl. 
mußt Du die Adressierung auf dem RISC "von Hand" nachbauen:
 Lade Adresse der Tabelle nach Reg1
 Addiere Index zu Reg1
 Lade Reg2 registerindirekt mit Adresse in Reg1
Wie letzteres geht wird Dir sicher das Assembler-Handbuch 
(Adressierungsmodi) sagen.

von Severino R. (severino)


Lesenswert?

Thomas Borsdorf wrote:

> Gibt es so eine funktion auch beim PIC?

Nein. Der PIC kennt nur sehr wenige Befehle.
Ausserdem hat er mit seiner Harvard-Architektur einen getrennten 
Adressraum für Programm (im Flash) und Daten (Register, im SRAM).
Somit kann man nur auf Umwegen im Anwendungsprogramm auf den 
Programmspeicher lesend zugreifen.
PIC18 können das besser als PIC16.

Siehe auch:
http://www.piclist.com/techref/microchip/tables.htm
http://www.sprut.de/electronic/pic/fallen/fallen.html#tabellen

sowie
http://www.google.ch/search?q=pic+table+lookup

von Sven S. (stepp64) Benutzerseite


Lesenswert?

Wenn du Datentabellen im Flashspeicher ablegst, können nur sehr wenige 
PICs diese auch wieder Lesen und selbst das ist recht umständlich. Die 
einfachste Methode ist die mit RETLW. Geht aber nur bis max. 255 Byte. 
Die Bessere Methode geht über die Register EEADRH, EEADR, EEDATA und 
EEDATH. Vorteil der zweiten Methode ist, du kannst den ganzen Flash 
benutzen und erhältst immer 14 Bit-Daten zurück (bei den PIC 16F). Siehe 
auch http://sprut.de/electronic/pic/grund/eeprom.htm#Flesen

Bei den PIC18F gibt es dann die TBLRD-Befehle. Damit kannst du über 
einen 22 Bit breiten Pointer direkt den Flash auslesen. Soger mit 
Autoincrement bzw Autodecrement. Eigentlich eine feine Sache, hab ich 
aber noch nicht ausprobiert.

Gruß
Sven

von Steffen (Gast)


Lesenswert?

Falls es dir noch hilft, die Direktive in Assembler haist DT (Define 
Table). Diese generiert automatisch retlw xx Anweisungen. Um einen Wert 
auszulesen springst du dann per call an die entsprechende 
Speicherstelle.

Such mal in der Codesammlung nach Miniterminal mit Nokia 3310 Display 
und schau dir die Implementation des Zeichensatzes an.

Das mit den 256 Byte ist Quatsch. In dem Beispiel hat die Tabelle im 
Flasch eine Größe von 800 Werten.

Gruß
Steffen

von stepp64 (Gast)


Lesenswert?

Ist nicht Quatsch, es sei denn, du passt das Register PCLATH auf die 
Zieladresse an. Wenn du nur zu PCL addierst, kommst du nicht über 256 
Byte, da PCL nur 8-Bit breit ist. So wie in dem Beispiel geht es 
natürlich. Du kannst auch nicht per Call an die Speicherstelle springen, 
da Call keinen errechneten Wert als Zieladresse zulässt. Vielmehr wird 
bei dieser Methode in einem Unterprogramm der Programmcounter PCL 
manipuliert. Da der aber nur 8-Bit breit ist muss man auch die höheren 
Bits in PCLATH mit manipulieren. Der Sprung an die Zieladresse erfolgt 
dann einfach, indem PCL mit dem errechneten Wert geladen wird NACHDEM 
PCLATH geladen wurde. Das Programm in dem die Adresse errechnet wurde 
muss als Unterprogramm geschrieben sein und mit Call aufgerufen werden.

Sven

von Sven W. (woehlb)


Lesenswert?

Also Ursache der Probleme mit den PIC16 eine Tabelle zu implementieren, 
ist der interne Flash (Programmspeicher) der in Worten a 14Bit 
organisiert ist. Aus diesem Grund kann bei den PIC16 nicht direkt 
byteweise auf den Programmspeicher zugegriffen werden. Das gilt aber 
nicht für den internen EEPROM (nichtflüchtiger interner Datenspeicher), 
dieser ist byteweise organisiert. Für die Zugriffe auf diesen Speicher 
muß aber eine bestimmte Lese- bzw. Schreibsequenz eingehalten werden, 
diese ist in den Datenblättern erklärt.

Für die Verwendung von Tabellen im Programmspeicher sind die PIC18 
besser geeignet, da stimme ich Severino zu. Bei dieser PIC-Familie sind 
alle Speicher byteweise organisiert, und wie Sven Stefan schon 
geschrieben hat gibt es spezielle Befehle(inklusive autoincrement o. 
decrement der Adresse) um auf die Tabellen zuzugreifen, ohne direkt den 
Programmcounter manipulieren zu müssen. Ich habe ein Projekt bearbeitet, 
bei dem ich diese Befehle intensiv genutzt habe. Diese Art der 
Tabellenzugriffe funktioniert sehr gut.

Tschau Sven!

von Severino R. (severino)


Lesenswert?

Der PIC16F690 (und viele andere PIC16 auch) kann über die Register
• EECON1
• EECON2
• EEDAT
• EEDATH
• EEADR
• EEADRH
sowohl auf das interne EEPROM wie auch auf das (Programm-) Flash 
zugreifen.

Wie, steht im Datenblatt. In Kürze:
Bit EEPGD in Register EECON1 legt fest, ob EEPROM oder Flash adressiert 
wird.
EEADRH und EEADR nehmen die Adresse der Speicherstelle auf.
Über das Bit RD in Register EECON1 wird der Lesevorgang gestartet, und 
wenn es wieder 0 ist, stehen Die Daten in EEDATH und EEDAT zur 
Verfügung.

Ein Beispiel ist in Kapitel 10.1.4 des Datenbuchs zu finden (es ist ein 
Detail zu beachten).

Dass das Flash als 14 Bit-Words organisiert ist, ist nicht so tragisch, 
wenn man jeweils nur die unteren 8 Bits verwendet (also nur EEDAT 
ausliest).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.