PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Datenbank / Tabelle im Programmspeicher ?



theborg
19.06.2008, 01:36
Hi ich hab nen großes Problem ich muss ne menge daten über SPI versenden und zwar 64 x 8bit diese möchte ich im Programmspeicher ablegen über googel und im RN-Wiki hab ich einiges gefunden allerdings werde ich da nicht draus schlau meine daten sehen momentan wie folgt aus:

0x55,0xa5,0x55,0x56,0xaa,0x55,0x56,0x66
0x55,0x56,0x9a,0x55,0x56,0x56,0x55,0x56
0x56,0x95,0x59,0x55,0xa5,0x59,0x55,0xa5
0x65,0x55,0x69,0x65,0x55,0x69,0xa5,0x55
0x69,0xa5,0x55,0x69,0x59,0x55,0x69,0x6a
0x55,0x99,0x69,0x56,0x56,0x96,0xaa,0x56
0x96,0x56,0x99,0x69,0x55,0xa5,0x55,0x55
0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55

Diese müssen Fein Säuberlich der reihe nach gesendet werden dazu kommen nochmal 64 x 8bit Adressbytes das heißt insgesamt sind des den 1024 Bit die gesendet werden müssen.

Die Adressbits sind aber nicht so das Problem da ich diese in einer schleife fortlaufend nummerieren kann.

Vielleicht hat ja einer einen TIP für mich.

Aso Proggen tuhe ich mit ASM

Enrock
20.06.2008, 07:52
Servus,

also so ganz verstehe ich dein Problem nicht. Wo sollen denn die Daten hin gesendet werden?
Hast du da ein Timing problem oder wo ist dein problem? Oder weiß du nicht, wie du über SPI senden sollst?! Vielleicht stehe ich heute morgen auch noch auf dem Schlauch! ...........SCHLAND!!!!!
Gruß

the_Ghost666
27.06.2008, 22:18
Also, da ist ein Problem, dass alle PICs unter der 18F Version haben. Die haben zwar einen Pointer (IndF), aber es gibt keine Möglichkeit, damit aus dem Flash zu lesen.
In diesem Fall macht man folgendes:
Eine Unterfunktion liefert die Werte nach dem Zustand eines Zählers zurück.

Lookup:
MOVFW Zähler
ADDWF PCL,F

RETLW 0x55
RETLW 0xA5
...

und in Prog:
INC Zähler
CALL Lookup

damit machst du nichts anderes, als per Variable Zähler den Programm-Counter zu manipulieren. Der RETLW Befehl läd dann vor dem Rücksprung ins Hauptprogramm den Wert in das W-Register.

Das ist leider die einzige Möglichkeit. Alternativ könntest du natürlich die Werte als konstanten definieren und Speicherzellen damit laden, die du dann wieder mit dem Pointer ansprechen kannst. Aber damit hast du den gleichen Speicherverbrauch (denn die Konstanten müssen ja wo stehen) + den Speicherverbrauch im RAM.

theborg
28.06.2008, 01:59
ah des hört sich recht gut an werde des mal testen

danke

Benedikt.Seidl
28.06.2008, 10:36
Also, da ist ein Problem, dass alle PICs unter der 18F Version haben. Die haben zwar einen Pointer (IndF), aber es gibt keine Möglichkeit, damit aus dem Flash zu lesen.
sicher? im datenbaltt zum 16f877a steht unter 3.5 "reading flash program memory" schaut zwar nicht ganz so easy aus, ist aber ein code beispiel dabei.

und dann gäbe es ja auch noch ein eeprom, welches man beschreiben könnte (also einfach in asm sagen, dass soll ins eeprom rein) und dann kann man es wieder mit dem pic auslesen.



In diesem Fall macht man folgendes:
Eine Unterfunktion liefert die Werte nach dem Zustand eines Zählers zurück.

Lookup:
MOVFW Zähler
ADDWF PCL,F

RETLW 0x55
RETLW 0xA5

da muss man aber gut aufpassen, da das PCL registier nur 8 bit halten kann, die adresse wo er hinspringt aber 13 bit breit ist. d.h. wenn du die tabelle an einer ungünstigen stelle plazierst, spinnt dein programm:

F0: MOVFW Zähler ; zähler = 20d
F1: ADDWF PCL,F ;pcl = F1h + 20d = 105h -> PCL = 05h -> springt irgendwo hin nach oben

das muss man dann einfach in der .lst datei nachschauen wo die funktion steht, oder mit einem org befehl das so anlegen, dass es passt, oder im datenblatt nachschauen und die etwas kompliziertere funktion nehmen, die auch mit solchen sprüngen klar kommt beispiel 5 scheint das richtige zu sein. (http://ww1.microchip.com/downloads/en/AppNotes/00556e.pdf)

SEIDL.

the_Ghost666
28.06.2008, 11:06
Ja, das stimmt natürlich alles, die Platzierung muss man beachten, natürlich auch, das der Wert in Zähler nicht höher ist, als die Tabelle lang.
Das der PIC doch aus dem Flash-Speicher lesen kann, war mir bisher garnicht so bewusst, hatte vor einiger Zeit die selbe Frage. Der einzige Nachteil ist die lange Bearbeitungsdauer, da die Sequenz einige Takte braucht, aber sonst scheints echt zu klappen. Muss ich mal ausprobieren. Dann könnte man auch wieder die äh .db -Assembleranweisung nehmen, um eine ganze Tabelle mit Kommata einzurichten.