Forum: Mikrocontroller und Digitale Elektronik LUT ersetzen PIC 18F2550


von Anfänger (Gast)


Lesenswert?

Hallo,

ich suche einen denkstoß für meine kleine Problematik(es könnte auch 
sein,dass es auch nicht geht, bin kein Profi in der Thematik)

Ich benutze einen selbstgeschriebenen Program auf einen Pic 18F2550 der 
2 LUT tabelen in EEPROM besitz. soweit so gut

Jetzt möchte ich mein Programm verbessern und dank RS232 neue werte 
(halt neue LUT) in mein PIC reinladen. Wie könnte ich mittels interuppt 
die 2 LUT tabelen ersetzen ?
Geht das überhaupt ?

Für jede Antwort danke ich voraus

von Karl H. (kbuchegg)


Lesenswert?

Anfänger schrieb:

> (halt neue LUT) in mein PIC reinladen. Wie könnte ich mittels interuppt
> die 2 LUT tabelen ersetzen ?

Was hat das eine mit dem anderen zu tun?

Die Problemkreise, die du bewältigen musst sind doch
* Datenübertragung per RS232
* Schreiben ins EEPROM

Das bei RS232 ein Interrupt im Spiel sein könnte, ist schon ok. Aber 
deswegen, kann man ja wohl schlecht sagen, du ersetzt 'Werte im EEPROM' 
mittels Interrupt.

von Anfänger (Gast)


Lesenswert?

Das ging ja schnell :)

Ich möchte einfach eine RS232 empfang warte schleife benutzen und dann 
die empfangene Daten in den EEPROM kopieren.So dass es am ende ungefähr

org  h'300'
  addwf  PCL,f
.
.
.
.
RETLW 0x4b
RETLW 0x4c
RETLW 0x4d

RETLW 0x4e
RETLW 0x4e
RETLW 0x50
RETLW 0x50
.
.
.
usw.. so aussieht

Ich werde dann aber 4 LUT tabellen haben,soll ich dann halt die 2 alte 
LUT löschen und gut isses oder wie geht sowas ? Ich bin irgendwie 
verwirrt

von Chris (Gast)


Lesenswert?

du schaltest die Interrupts ab, ersetzt die lut, und dann schaltest du
die Interrupts wieder ein, sofern dies im laufenden Betrieb machbar ist.
Ansonsten muss der Betrieb halt eingestellt werden und dann wieder
gestartet werden.

von Anfänger (Gast)


Lesenswert?

hmmm wird es vll nicht einfacher,wenn ich meine LUT statt in EEPROM,dann 
halt in den Hardware Stack speichere ?

von Karl H. (kbuchegg)


Lesenswert?

Jetzt bin ich verwirrt.

Kannst du ins EEPROM schreiben oder kannst du es nicht?
Kannst du Daten per RS232 übertragen oder kannst du es nicht?

Wenn die Antwort auf beide Fragen nein lautet, dann: warum lernst du das 
dann nicht einfach, anstatt solange rumzudoktern, bis du eine 
vermeintlich 'billige' Lösung gefunden hast?

von Peter (Gast)


Lesenswert?

1. Power ON
2. EEPROM auslesen (lookup holen und in Variable im RAM nehmen)
3. Interrupts freigeben
4. Loop normaler Betrieb
5. UART Interrupt detektiert
6. Interrupts sperren (Lookup-Betrieb)
7. Daten (ein Zeichen) über UART Empangen
8. Daten validieren
9. Daten ins EEPROM schreiben
10. Nächstes Zeichen siehe 7. bis alle Zeichen da
11. weiter bei 2.

von Karl H. (kbuchegg)


Lesenswert?

Äh Moment
1
Ich möchte einfach eine RS232 empfang warte schleife benutzen und dann die empfangene Daten in den EEPROM kopieren.So dass es am ende ungefähr
2
org h'300' addwf PCL,f
3
.
4
.
5
.
6
.
7
RETLW 0x4b
8
RETLW 0x4c
9
RETLW 0x4d
10
RETLW 0x4e
11
RETLW 0x4e
12
RETLW 0x50
13
RETLW 0x50
14
.
15
.
kann der PIC überhaupt Code aus dem EEPROM ausführen?

Ich fürchte so wird das nichts. Das was du unter LUT verstehst, ist so 
gar nicht machbar. Wenn du die LUT änderbar haben willst, dann MUSST du 
entweder das Programm zur Laufzeit sich selbst modifizieren können, oder 
du musst dein LUT anders aufziehen. Deine LUT ist dann ein Bytefeld und 
der Zugriffscode muss errechnen, welches Byte aus diesem Feld in ein 
Register zu laden ist.
Die Technik, dass die LUT durch Returns realisiert wird, wobei man dann 
mit einem Offset den richtigen Return anspringt, das wird es so nicht 
spielen (wenn du kein selbstmodifizierendes Programm haben willst)

von pöserpursche (Gast)


Lesenswert?

Wenn ich das so Lese:

>Jetzt möchte ich mein Programm verbessern und dank RS232 neue werte
>(halt neue LUT) in mein PIC reinladen. Wie könnte ich mittels interuppt
>die 2 LUT tabelen ersetzen ?
>Geht das überhaupt ?


Denke er will es nur Einmalig machen.

Warum änderst du nicht den Quellcode und Flashest neu?
Bzw. warum benutzt du nicht einen Bootloader?

PP

von Anfänger (Gast)


Lesenswert?

pöserpursche schrieb:
> Wenn ich das so Lese:
>
>>Jetzt möchte ich mein Programm verbessern und dank RS232 neue werte
>>(halt neue LUT) in mein PIC reinladen. Wie könnte ich mittels interuppt
>>die 2 LUT tabelen ersetzen ?
>>Geht das überhaupt ?
>
> Denke er will es nur Einmalig machen.
>
> Warum änderst du nicht den Quellcode und Flashest neu?
> Bzw. warum benutzt du nicht einen Bootloader?
>
> PP

Bootloader geschichte hätte ich mir auch schon überlegt,das wäre dann 
aber zu einfach. Letzendlich, ich betrachte die sache eher als übung 
nicht als ein Projekt wo man schnel das Problem lösen soll.

Karl Heinz Buchegger schrieb:
>
> Ich fürchte so wird das nichts. Das was du unter LUT verstehst, ist so
> gar nicht machbar. Wenn du die LUT änderbar haben willst, dann MUSST du
> entweder das Programm zur Laufzeit sich selbst modifizieren können, oder
> du musst dein LUT anders aufziehen. Deine LUT ist dann ein Bytefeld und
> der Zugriffscode muss errechnen, welches Byte aus diesem Feld in ein
> Register zu laden ist.
> Die Technik, dass die LUT durch Returns realisiert wird, wobei man dann
> mit einem Offset den richtigen Return anspringt, das wird es so nicht
> spielen (wenn du kein selbstmodifizierendes Programm haben willst)

hmmm deshalb würde ich gerne NUR den Inhalt ändern,so dass die sprunge 
gleich bleiben aber halt mit anderen werte zurück kommen.
Die eigentliche frage ist: wie ich die LUT inhalte aktualisieren könnte?

von Ottmar K. (wil1)


Lesenswert?

Hallo Anfänger,

Wie wäre es, wenn Du die indirekte Adressierung verwendest? Du übergibst 
eine Adresse (12Bit) und dann den Wert. Dann schreibst Du per Sofware 
den Wert an die Adresse im Data-Bereich.
Schau Dir dazu mal das Datenblatt des 18F2550 an:
  Kapitel "5.4 Data Addressing Modes" und folgende,
  speziell "5.4.3 INDIRECT ADDRESSING"
Die Werte aus dem Datenspeicher ruft Du prinzipiell in gleicher Weise 
ab.

mfG Ottmar

von Chris B. (dekatz)


Lesenswert?

Anfänger schrieb:
> Bootloader geschichte hätte ich mir auch schon überlegt,das wäre dann
> aber zu einfach. Letzendlich, ich betrachte die sache eher als übung
> nicht als ein Projekt wo man schnel das Problem lösen soll.
>
> hmmm deshalb würde ich gerne NUR den Inhalt ändern,so dass die sprunge
> gleich bleiben aber halt mit anderen werte zurück kommen.
> Die eigentliche frage ist: wie ich die LUT inhalte aktualisieren könnte?

In's EEPROM schreiben ist sinnlos weil der PIC darin keinen Code 
ausführen kann.
Wenn du schon keinen Bootloader der das komplette Programm inklusive 
neuer LUT  flasht verwenden wills, bleibt nur der "harte" Weg.
Kleines "Terminalprogramm" im PIC und sich dann mit Kapitel 6 (FLASH 
PROGRAM MEMORY) des DB intensiv beschäftigen.
Etwas aufwändig das Ganze: Code der neuen LUT via UART einlesen und in 
RAM speichern.....Flash-Datenblock (mind. 64 Byte) in RAM einlesen und 
darin die Änderungen an der/den entsprechenden Stellen mit den Daten der 
neuen LUT vornehmen....dann Orignial Flashdaten löschen, usw, usw.....
Beispiel finden sich im DB!

Ich würde mir das Byteweise Gefrickel um eine neue LUT in den Flash zu 
Patchen nicht antun  - aber wenn es nur eine Übung sein soll - na 
dann...

(wenn ich so etwa tatsächlich brauche, die UART-Schnittstelle bereits 
verbaut ist, dann nehme ich die bereits vorgeschlagene 
Bootloadervariant).

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.