mikrocontroller.net

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


Autor: Thomas Borsdorf (dertom83)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rüdiger Knörig (sleipnir)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht 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.h...

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

Autor: Sven Stefan (stepp64) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: stepp64 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven Woehlbier (woehlb)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht 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).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.