LUT ersetzen PIC 18F2550

Gast #3362140
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
#3362146
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.
Gast #3362178
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
Gast #3362179
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.
#3362287
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?
Gast #3362309
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.
#3362322
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)
Gast #3362336
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
Gast #3362367
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?
#3362453
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
#3362503
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).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren