Antworten

Der Beitrag verursachte die folgenden Fehler, die behoben werden müssen:
Achtung: In diesem Thema wurde seit 120 Tagen nichts mehr geschrieben.
Wenn Sie nicht absolut sicher sind, dass Sie hier antworten möchten, starten Sie ein neues Thema.
Einschränkungen: 8 pro Beitrag (8 verbleibend), maximale Gesamtgröße 8,79 MB, maximale Individualgröße 1 MB
Entfernen Sie den Haken der Dateianhänge, die gelöscht werden sollen
Klicken Sie hier oder ziehen Sie Dateien hierher, um sie anzuhängen.
Anhänge und andere Optionen
Verifizierung:
Bitte lassen Sie dieses Feld leer:
Geben Sie die Buchstaben aus dem Bild ein
Buchstaben anhören / Neues Bild laden

Geben Sie die Buchstaben aus dem Bild ein:

Tastenkürzel: Alt+S Beitrag schreiben oder Alt+P für Vorschau

Zusammenfassung

Autor ^Cobra
 - 05.02.2024, 16:48:47 CET
Moin Männer, 
Ihr seid ja spitze. Vielen Dank für die Infos.
Wie bereits beschrieben bin ich derzeit ein anderen Weg gegangen, werde aber das mit bra noch ausprobieren und es dann auch so lassen wollen da es weniger Speicher verbraucht. 
Wir woanders schon angedeutet ist mein nächstes Problem entweder der interne takt geber, der timer0 oder der Programmierer... 
Muss da noch bisschen Forschung betreiben und werde gegebenfalls ein neuen thread auf machen. 
Gruß 
Cobraschock 
Autor pic18
 - 05.02.2024, 10:21:46 CET
Zitat von: vloki in 05.02.2024, 09:55:27 CETrlncf   COMMAND, W 
ich war mir hier nicht sicher, ob man das W-Register mal zwei nehmen muss, das ist hiermit beantwortet. 
Autor vloki
 - 05.02.2024, 10:08:20 CET
Zitat von: ^Cobra in 03.02.2024, 13:06:02 CETDer Controller 16f877A wird scheinbar nicht kommplett beschrieben?! o.O Im Programmspeicher geht es bis Ende der Interrupt Routine ab dann steht nur noch ADDLW 0xFF. und nicht nur das: In der Codezeile 1 steht goto 0xXX (Adresse grade nicht zur Hand) und dieser Sprung führt genau zu so ein nix...

Wäre nicht unbedingt seltsam, wenn da nach den Vektoren erst mal nichts kommt.
(ADDLW 0xFF ist der Wert bei unbeschriebenen Speicher)
Der Programmspeicher wird evtl von hinter her gefüllt,
wenn man "relocatable" programmiert und das dem Linker überlässt.

Merkwürdig ist, dass der Reset-Vektor angeblich ins Nirvana zeigt.
Der Linker kann das normalerweise schon seit Ende des letzten Jahrtausends;-)
Autor vloki
 - 05.02.2024, 09:55:27 CET
Falls das mit der Jumptable noch immer Probleme bereitet,
hier mal ein Beispiel aus dem MCHP PIC18 Bootloader:

    ; This jump table must exist entirely within one 256 byte block of program memory.
#if ($ & 0xFF) > (0xFF - .24)
    ; Too close to the end of a 256 byte boundary, push address forward to get code
    ; into the next 256 byte block.
    messg   "Wasting some code space to ensure jump table is aligned."
    ORG     $+(0x100 - ($ & 0xFF))
#endif
JUMPTABLE_BEGIN:
    movf    PCL, w              ; 0 do a read of PCL to set PCLATU:PCLATH to current program counter.
    rlncf   COMMAND, W          ; 2 multiply COMMAND by 2 (each BRA instruction takes 2 bytes on PIC18)
    addwf   PCL, F              ; 4 Jump in command jump table based on COMMAND from host
    bra     BootloaderInfo      ; 6 00h
    bra     ReadFlash           ; 8 01h
    bra     VerifyFlash         ; 10 02h
    bra     EraseFlash          ; 12 03h
    bra     WriteFlash          ; 14 04h
    bra     ReadEeprom          ; 16 05h
    bra     WriteEeprom         ; 18 06h
    bra     WriteConfig         ; 20 07h
    bra     GotoAppVector       ; 22 08h
    reset                       ; 24 09h

#if (JUMPTABLE_BEGIN & 0xFF) > ($ & 0xFF)
    error "Jump table is not aligned to fit within a single 256 byte address range."
#endif

Mit GOTO müsste man bei einem PIC18 dann sogar zweimal shiften!

PS: das NOP wird nur in der Anzeige des Programmspeichers eingefügt,
um zu verdeutlichen, dass GOTO ein 2-Wort Befehl ist.
Autor picass
 - 05.02.2024, 09:37:09 CET
Räusper...., jetzt muss ich doch mal nachfragen, in welcher Sprache, rsp. welchem Regional-Speech (MPLAB-Version) die fraglichen Programm-Schnipsel angefertigt sind. Denn in Assembler und der MPLAB X v5.20 gilt das von mir angesprochene Beispiel.


Zitat von: pic18 in 04.02.2024, 19:28:24 CET.....wird denn wenn INCF PLATH aufsgeführt wird noch CALL Table2 ausgeführt?
Ja! Bei diesen Bit-Test-Sprung-Bedingungen wird nur im Falle des Zutreffens der Bedingung einmal die nächsten Anweisung übersprungen. Im Falle des Nicht-Zutreffens läuft das Prog wie üblich Zeile nach Zeile weiter.
Grüße, lippe1audi

Autor pic18
 - 04.02.2024, 19:50:11 CET
Ich habe im Datenblatt vom 18F4685 die Antwort gefunden. Ist schon so lange her das ich in Assembler programmiert habe.
ZitatThe Program Counter (PC) specifies the address of the
instruction to fetch for execution. The PC is 21 bits wide
and is contained in three separate 8-bit registers. The
low byte, known as the PCL register, is both readable
and writable. The high byte, or PCH register, contains
the PC<15:8> bits; it is not directly readable or writable.
Updates to the PCH register are performed through the
PCLATH register. The upper byte is called PCU. This
register contains the PC<20:16> bits; it is also not
directly readable or writable. Updates to the PCU
register are performed through the PCLATU register.
The contents of PCLATH and PCLATU are transferred
to the program counter by any operation that writes to
the PCL. Similarly, the upper two bytes of the program
counter are transferred to PCLATH and PCLATU by an
operation that reads PCL. This is useful for computed
offsets to the PC (see Section 5.1.4.1 "Computed
GOTO").
Autor pic18
 - 04.02.2024, 19:28:24 CET
wir kommen vom eigentlichen Thema ab. Ich habe hier einen Link gefunden:
http://siriusmicro.com/projects/i1table.html

was ich jetzt nicht ganz verstehe:
Zitat
                BTFSC   STATUS,C        ;see if it overflows
                INCF    PCLATH          ;If so, increment PCLATH and           
               CALL    Table2          ;Jump to the data table
wird denn wenn INCF PLATH aufsgeführt wird noch CALL Table2 ausgeführt?
Autor pic18
 - 04.02.2024, 18:16:49 CET
ZitatEs sollte also anstelle von "f" halt 'ne Null oder Eins stehen, je nach Ziel.
f entspricht 1
w entspricht 0

es ist dadurch übersichtlicher,
so wie bei der zweiten Ziffer
ACCESS entspricht 0
Banked entspricht 1

Zitat von: ^Cobra in 04.02.2024, 16:16:15 CETIch dachte immer das bra im Grunde das gleiche wie GOTO ist nur halt über ein Macro anders geschrieben

GOTO ist absoluter Sprung
BRA ist relativer Sprung also +/- 127

Zitat von: picass in 04.02.2024, 17:30:10 CETzum einen hat der Programm-Counter zwei Bytes, ein "lowes" und ein "highes
beim 18er sogar 3 Bytes, deswegen aufpassen, das kein Überlauf entsteht

Beispielcode:
[pre];*** define amount of table items for startup message ***
    #define    tab_items d'39'
    movlw    tab_items    ; store amount of table items in counter
    movwf    TEMP6
    ;*** transmit startup message ***
_ILOOP    movlw    HIGH WelcomeTable ; get correct page for PCLATH
    movwf    PCLATH        ; prepare right page bits for table read
    movfw    TEMP6        ; get actual count-down value
    sublw    tab_items    ; table offset: w = tab_items - TEMP3
    call    WelcomeTable    ; call lookup table
    movwf    TEMP7        ; create backup of fetched item
    SENDw            ; RS232 output
    movfw    TEMP7
    LCDw            ; LCD output
    decfsz    TEMP6,F        ; decrement counter
    goto    _ILOOP

    

[pre]WelcomeTable
    addwf    PCL,F        ; add offset to table base pointer
    DT    "PIC 16F77 AT Keyboard Decoder connecte" ; create table
WTableEND DT "d"
    IF (high (WelcomeTable) != high (WTableEND))
        ERROR "WelcomeTable hits page boundary!"
    ENDIF
    END[/pre]



[/pre]

Autor picass
 - 04.02.2024, 17:30:10 CET
  MOVF   SelectServo,w
  ADDWF PCL,f

Weiß nicht, ob ich jetzt auf dem Schlauch stehe, aber mit schon den ersten beiden Zeilen aus obigem Beispiel kann ich nix anfangen.
- zum einen hat der Programm-Counter zwei Bytes, ein "lowes" und ein "highes" und man muss schon angeben, welches man meint.
- der Addierbefehl hat eine für mich seltsame Schreibweise. Im Instructions Blatt für "meine" PIC18F14K22 und den MPLAB X v5.2 wäre die Schreibweise ADDWF Test,0,0

Die erste Null bedeutet, dass das Ergebnis der Addition ins WREG geschrieben wird, bei einer "1" entsprechend in das Register "Test". Die zweite Null - die ich immer weglasse - wäre die Access-Bank als Auswahl für den Befehlt gegeben.
Es sollte also anstelle von "f" halt 'ne Null oder Eins stehen, je nach Ziel.
Grüße, picass
Grüße
 



Autor ^Cobra
 - 04.02.2024, 16:16:15 CET
Ich dachte immer das bra im grunde das geliche wie GOTO ist nur halt über ein macro anders geschrieben. Wusste garnicht das es sich da anders verhält.

Nein auch mit *2 ging es nicht. a würden danntrotzdem manche doppelt manche garnicht genommen. Habe es derzeit klassisch mit BTFSC gemacht.
Immer -1 wenn null dann weißich wohin. Mit Bra werde ich bei gelegenheit aber auch außprobieren. Spart paar zeilen Code. Der 18F hat jetzt schon mehr speicher belegt wie der 16F :-\

Similar topics (5)