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.
hmmm wird es vll nicht einfacher,wenn ich meine LUT statt in EEPROM,dann halt in den Hardware Stack speichere ?
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.
Ä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)
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).
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.