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?
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.
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
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
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
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
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.