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
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.
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
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.
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?
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.
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)
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
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?
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
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).