Pic 16F877A nicht komplett beschreibbar?!

Begonnen von ^Cobra, 03.02.2024, 13:06:02 CET

Vorheriges Thema - Nächstes Thema

^Cobra

Och man ey... da wollte ich schnell mal an der Hardware testen, mein Programmer (PicKit3) rausgekramt und fix alles
passend gelegt und dann:
Der 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...
Als ob beim Übertragen die Hälfte vergessen wird. Es erscheint aber kein Fehler oder sowas. Ich habe noch 2 andere Controller dieser Sorte hier. Beide werden aber nicht erkannt. Durchaus Möglich das ich die damals gegrillt habe... Naja werde mal schauen wie es nun weiter geht...

Peter

Hört sich an als ob nicht beide Stromversorgungspins angeschlossen wären.
Es gibt Controller die haben 2 Stromversorgungspins und wenn nur einer angeschlossen
wird, dann ist der Controller nur zur Hälfte zu gebrauchen.
Weis nicht ob das bei diesem Controller auch so ist. Musst du mal ausprobieren.

^Cobra

Der hat in der Tat 2 Anschlüsse. 
Wenn ich wieder dran kann werde ich das prüfen. Danke für den Tipp 

^Cobra

Also hier mal der neue Stand:
Ich habe nach gemessen es liegen 4087V von dem PicKit3 an. Beim Versuch auf 5,25V stelle geht der PicKit 3 in Störung.
Habe ein Pic 18F44K20 gefunden der Pingleich ist. Leider ist das Programm nicht 1 zu 1 übernehm bar.
Habe also einfacheine LED an Portb schalten wollen als Test. Der Pic Schaltet die LED aber erst wenn ich im Debugg Mode bin. War doch früher so das sobald der Pickit 3 die Versorung einschaltet arbeitete die Schaltung... Alles sehr seltsam. Werde später mal externe Versorgung anschließen und weiter probieren.

^Cobra

und weiter gehts:
Ich habe nun den Pic18F44K20 und mein Projekt daran angepasst.
Natürlich läuft es nicht wie es sollte...
1. Ist es normal das man nicht mehr sehen kann was grade in W ist und was die Status Flags so anzeigen? Beim debuggen des "echten" Pics zeigt mir da alles immer 0 an...
2. Wie woanders mal erwähnt habe ich ein Sprungverteiler mit ADDWF PCL,f erzeigt. Jetzt musste ich aber feststellen das bei dem 17F es nu so aussieht:
  MOVF	SelectServo,w
  ADDWF PCL,f                   Adrs: 32
  Incf SelectServo,f            Adrs: 34 
  goto TargetPosServo1Select    Adrs: 36
  NOP                           Adrs: 38
  goto TargetPosServo2Select    Adrs: 3A
  NOP                           Adrs: 3C
  goto TargetPosServo3Select    Adrs: 3E
  NOP
  goto TargetPosServo4Select
  NOP
  goto TargetPosServo5Select
  NOP
  goto TargetPosServo6Select
  NOP
  goto TargetPosServo7Select
  NOP
  goto TargetPosServo8Select
  NOP
  goto TargetPosServo9Select
  NOP
  goto TargetPosServo10Select
  NOP

anstatt:
  MOVF	SelectServo,w
  ADDWF PCL,f
  Incf SelectServo,f 
  goto TargetPosServo1Select
  goto TargetPosServo2Select
  goto TargetPosServo3Select
  goto TargetPosServo4Select
  goto TargetPosServo5Select
  goto TargetPosServo6Select
  goto TargetPosServo7Select
  goto TargetPosServo8Select
  goto TargetPosServo9Select
  goto TargetPosServo10Select

Ich gehe davon aus das es normal ist aber macht es nicht einfacher wenn man nicht damit rechnet. Ich werde mir da nun was überlegen. Aber damit wird es heute denke nichts mehr... Kinder wollen auch bespasst werden :P
Schönen Sonntag euch

picass

#5
Zitat von: Peter in 03.02.2024, 14:47:54 CETEs gibt Controller die haben 2 Stromversorgungspins und wenn nur einer angeschlossen
wird, dann ist der Controller nur zur Hälfte zu gebrauchen.
Wem dem so wäre, dann ist das für mich neu. In dem einen und einzigen Fall eines solchen Controllers mit je 2 Plus- und 2 Gnd-Anschlüssen bei mir traf das aber nicht zu oder nur zum Teil. Die beiden GND-Anschlüsse waren intern durch verbunden. Ob das bei den beiden Plus-Anschlüssen auch so war, erinnere ich mich im Moment nicht.
wäre so'n Controller tatsächlich zweimal an Plus zu bespaßen und würde im anderen Fall meinetwegen die Hälfte des Rams weg schalten, dann würde ich das für eine saudämliche Funktion ansehen, und dafür genau so wenig Verständnis aufbringen, wie einen fetten Sechszylinder zu verbauen und dann aber bei geringen Leistungsanforderungen dauernd 3 Zyl weg zu schalten.
Die Existenz eines solch doppelten Versorgungs-Paares hatte ich aus gänzlich anderen Gründen für passen gefunden: Die sitzen auf gegenüberliegenden Längsseiten der Gehäuse und ermöglichen somit erhebliche Vereinfachungen bei der Verlegung der Leiterbahnen, zumal ja - wie gesagt - mindestens eines der Paar intern verbunden war.

Da kommt mir eher der Gedanke, dass ein PICkit3Programmer in seichten Fälle die Stromversorgung über sein USB-Kabel auch für den Programmieradapter zur Verfügung stellt. Es steht aber fett im Handbuch, dass dies die große Ausnahme sein sollte und eigentlich immer eine externe Stromzuführung (eSZ) - sprich: 5 Volt - beim Programmieren angeschlossen sein sollte. Ich hab' noch nie so'n PK-Programmer ohne zusätzliche eSZ in Betrieb genommen: zack...., einen dreibeinigen Festspannungsregler mit zwei 10nF-Entkopplungskondensatoren und fettich is der Lack - also fast, ein 47 µF Tantal auf der "PIC-Seite" wäre empfehlenswert. Ach ja, die Elektronen kommen dann aus einer fast beliebigen Quelle.
Deine Sprunganweisungen (SA) - Cobra - sehen für mich beide komisch aus, aber im Moment bin ich bei SAs nicht so im Stoff.
Dass du den Inhalt des WREG-Register beim Debuggen nicht sehen kannst, kann ich auch nicht nach vollziehen. Da denke ich an meine zahllosen Übungen mit dem Soft-Simulator. Der stellt den Inhalt aller Register problemlos zur Schau. Ist bei MPLAB X v5.2 jedenfalls so.
Grüße, picass


^Cobra

Nun habe ich es im Simulator mir nochmal angeschaut.
Auch da sieht man die Nop und das jede neue Zeile um 2 die Adresse erhöht.
Nun also gedacht oka, dann mal nach Links rotieren und schon haben wir faktor * 2
sieht erstmaljetzt wieder gut aus. Aber das nächste Problem bahnd sich schon an. Kann nicht auf 0 Vergleichen da der Timer0 schneller zählt als ursprünglich angedacht.
Es geht also weiter.

pic18

ich meine GOTO ist nicht die richtige Wahl, da der Befehl 4 Byte groß ist, besser wäre BRA. Außerdem mußt Du darauf achten, dass beim addieren der Adresse kein Überlauf entsteht, sonst springt der Programmcounter zurück statt vor.

^Cobra

Ja... musste auch grade feststellen das Goto da nicht geht mit nop allerdings schon -.- son mist. Dann muss ich umplanen. - schade.

pic18

Goto hat zwei Programm-Code da die Adresse noch untergebracht wird. Nehme einfach BRA. Alternativ kannst Du auch das W-Register mit 2 multiplizieren. Mußt aber aufpassen, dass kein Überlauf entsteht.

^Cobra

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 :-\

picass

  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
 




pic18

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]


pic18

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?

pic18

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

picass

#15
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


vloki

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.
MPLABX  XC8  KiCAD

vloki

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;-)
MPLABX  XC8  KiCAD

pic18

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. 

^Cobra

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 

Schnellantwort

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.

Name:
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

Similar topics (5)