Vorab, ich benutze auch keinen C-Compiler, programmiere die PICs seit zig Jahren in Assembler.
Also wenn ich es richtig verstanden habe, dann sendet deine PC-Software eine Serie von X und Y Position an den PIC.
Also eine gerasterte Strecke. Diese wird zunächst im PIC in einer Tabelle gespeichert.
Der PIC soll nun mittels zweier Schrittmotoren die Positionen bzw. die Strecke abfahren und je einen Messwert zu jeder Position zum PC zurücksenden.
Trifft das in etwas dein Vorhaben ?
Da ist deine Idee mit der Aufteilung der Daten in den einzelnen RAM-Banken garnicht schlecht, gefällt mir sogar ganz gut.
So hast Du immer ein gleiches Indexregister FSR0L und die Tabelle wird über FSR0H gewählt.
Ehrlich gesagt, da würd ich auch garnichts dran ändern, das past gut zu deinem Problem.
Ich hatte nur die Idee, da Du im PIC18xx drei solcher Indexregister hast, könnte man die Adressen
separat über jeweils einen Satz der Indexregister ansprechen. Hab das mal eben so aufgeschrieben,
ist aber auch nicht viel effektiver.
Wir benutzen eine FSR-Registersatz für die X Position
den zweiten für die Y Position
und den dritten für die Messwerte
So kannst Du nun alle Adressen deiner 3 Tabellen in die FSR0 bis FSR2 Register laden.
Für den Messwertzähler benutze ich mal das Register TBLPTRL, das ist wahrscheinlich in deiner Software noch unbenutzt.
Wenn Du jetzt deine Daten an den PC senden willst, würde es im Prinzip so aussehen:
Code:
LFSR FSR0,0x100 ; Adresse X-Koordinaten
LFSR FSR1,0x300 ; Adresse Y-Koordinaten
LFSR FSR2,0x500 ; Adresse Messwerte
movl D'255' ; 256 Positionen und Messwerte sollen gesendet werden
movwf TBLPTRL ; ich benutze gerne dieses 8 Bit Register zum zählen
Sende_Schleife:
movf POSTINC0,W ; X Position Low Byte laden, x-index +1
call Sende_W_Register ;
movf POSTINC0,W ; X Position High Byte laden, x-index +1
call Sende_W_Register
movf POSTINC1,W ; Y Position Low Byte laden, Y-index +1
call Sende_W_Register
movf POSTINC1,W ; Y Position High Byte laden, Y-index +1
call Sende_W_Register
movf POSTINC2,W ; Messwert Low Byte laden, Messindex +1
call Sende_W_Register
movf POSTINC2,W ; Messwert High Byte laden, Messindex +1
call Sende_W_Register
decfsz TBLPTRL,F ; Zähler -1, scip if zero (überspringe nächste Zeile wenn 0 rauskommt)
goto Sende_Schleife ; Schleifen bis alle Messwerte gesendet wurden
;;;;;;;;;; mal zu Vergleich mit deiner Idee:
movl D'127' ; 127 Positionen und Messwerte sollen gesendet werden
movwf TBLPTRL ; ich benutze gerne dieses 8 Bit Register zum zählen
movlw 1 ; Ram Bank für Position X Low Byte wählen
movwf FSR0L ;
Sende_Schleife:
movf INDF0,W ; X Position Low Byte laden
call Sende_W_Register ;
incf FSR0H,F ; Ram Bank für Position X High Byte wählen
movf INDF0,W ; X Position High Byte laden
call Sende_W_Register ;
incf FSR0H,F ; Ram Bank für Position Y Low Byte wählen
movf INDF0,W ; Y Position Low Byte laden
call Sende_W_Register ;
incf FSR0H,F ; Ram Bank für Position Y High Byte wählen
movf INDF0,W ; Y Position High Byte laden
call Sende_W_Register ;
incf FSR0H,F ; Ram Bank für Messwert Low Byte wählen
movf INDF0,W ; Messwert Low Byte laden
call Sende_W_Register ;
incf FSR0H,F ; Ram Bank für Messwert High Byte wählen
movf POSINC0,W ; Messwert High Byte laden, !!! und gleich den Zähler eins hoch setzen
call Sende_W_Register ;
decfsz TBLPTRL,F ; Zähler -1, scip if zero (überspringe nächste Zeile wenn 0 rauskommt)
goto Sende_Schleife ; Schleifen bis alle Messwerte gesendet wurden
; FAZIT: eigentlich ist das eine gute Idee, wie Du es gelöst hast.
Ich denke mal die Hauptzeit geht eh in die Datenübertragung und nicht in der Code-Optimierung.
So wünsche ich Dir noch ein schönes Wochenende.
Siro
Lesezeichen