Hallo Thomas,
willkommen im RN und danke für die interessante Frage
Du hast das Listing der funktionierenden Version geposted. Wenn du dir die Adressen anschaust, müsste eigentlich klar sein was passiert. Die Sprungtabellen enden gerade zufällig auf Adresse 0x0FF. Das ganze Programm inklusive der Sprungtabellen passt zufällig gerade eben in einen 256 Byte Block.
Sobald du Code hinzufügst, z.B. den PWM Teil, verschiebt sich die Tabelle im Programmspeicher und liegt teilweise in den nächsten 256 Byte Block. Mit dem 8-Bit Befehl addwf PCL, f landest du ab einem bestimmten Wert nicht mehr in der Tabelle, sondern irgendwo im Programm ab Adresse 0. Der PCL läuft einfach über und der PCLATH ist immer noch 0.
Lese dir vielleicht zum besseren Verständnis das Kapitel Tabellen im RN-Wissen Artikel PIC Assembler.
Auch bei Sprut gibt es eine sehr gute Erklärung zu Sprungberechnung mit PCL.
Als Abhilfe könntest du die Tabellen auf eine höhere Adresse legen, so dass sie komplett in einem eigenen 256 Byte Block liegen. Das PCLATH muss vor dem Aufruf der Tabellen-Routinen mit dem höherwertigen Teil der Adresse vorbelegt werden, damit bei der PCL-Berechnung das PCH mit dem richtigen höherwertigen Teil der Adresse geladen wird.
Vielleicht in etwa so:
GrußCode:movlw HIGH Ziffer movwf PCLATH movfw Zehner ; Wert für Zehner call Ziffer ; 7-Segmentwert ... ORG 0x0200 ; 7-Segment-Tabelle Ziffer addwf PCL, f retlw B'01111110' ; Ziffer 0 ...
witkatz
Lesezeichen