ORG Anweisung - RN-Wissen-Artikel
Guten Tag zusammen,
ich versuche gerade, den Assembler-Code eines nicht mehr verfügbaren Kollegen zu verstehen.
Dieser ist geschrieben für einen PIC 12C672.
Eine der letzten Unklarheiten stellt die Verwendung der ORG-Anweisung dar.
So sieht der Code grob aus:
Code:
list p=12C672 ; Prozessortyp
; list directive to define processor
#include <p12c672.inc> ; processor specific variable definitions
__CONFIG _CP_ALL & _PWRTE_ON & _WDT_OFF & _WDTE_OFF & _HS_OSC
... EQU ...
... etliche EQU Registeradressen-Benennungen
#define ..
... einige #define - Anweisungen
org 5
goto start
; Initialisierung
; Main - Dauerschleife
org 03ffh
return
end
Ich kann mir nicht erklären, welchen Zweck das erfüllen sollte.
Edit: Dass es den Platz im Speicher angibt, ab wo der folgende Code im PIC abgelegt werden soll, habe ich mittlerweile verstanden.
Warum nimmt man dann aber die Adresse 0x05 und nicht einfach die 0x00?
Hat da jemand eine Idee?
Wenn ich den Code mit MPLAB X IDE v3.50 im Simulator versuche zu debuggen, kommt bei mir die Fehlermeldung
Zitat:
no source code lines were found at current pc 0x0
.
Wenn ich den Code auf ändere, funktioniert das debuggen problemlos.
Ich verstehe nur leider weder die Fehlermeldung noch den Grund, warum die Fehlermeldung nach dieser Änderung nicht mehr auftaucht.
Desweiteren verstehe ich die Verwendung der ORG-Anweisung auf in folgendem Artikel an mehreren Stellen nicht:
http://rn-wissen.de/wiki/index.php?title=PIC_Assembler
Code:
org 0x03B8 ; diese Adresse kann gleich max.Adresse - 47h sein
org 0x0023 ; hier fängt das "Erstes" an
ORG 0x0358 ; diese Adresse kann gleich max.Adresse - A7h sein
org 0x3EF ; diese Adresse kann gleich max.Adresse - 10h sein
org 0x001E ; ab da kann eigener Code anfangen
org 0x3DF ; diese Adresse kann gleich max.Adresse - 20h sein
Wie kommt man auf genau diese spezifischen Speicherstellen?
Besten Dank im Voraus!
Wenn ihr weitere Informationen von mir braucht, bekommt Ihr die natürlich gerne!
Beste Grüße
Matze
Liste der Anhänge anzeigen (Anzahl: 1)
Der Prozessor fängt beim Einschalten oder Reset immer an der Speicherstelle 0 an
Dort steht dann meist ein Goto Start
Dieser Start ist dann das Hauptprogramm, was sich etwas weiter hinten im Code befindet.
Der Grund dafür ist: An Speicherstelle 4 befindet sich der Interrupt-Vector
und da soll natürlich drüber weg gesprungen werden.
Code:
MAIN_CODE CODE
ORG 0 ; Reset Vector, hier gehts immer los nach dem Einschalten
goto Main ; hier steht normalereise ein Goto Hauptprogramm
ORG 4 ; addresse des Interrupt vectors ist fest und immer an Adresse 4 bei diesem Chip
goto InterruptCode
; hier ist nun die Speicherstelle 5
Main:
....
....
goto Main ; Hauptschleife
InterruptCode:
Hier ist noch ein Beispiel:
Der obere Speicher 0..3 wird hier direkt mit Code gefüllt. Ab Speicherstelle 4 beginnt die Interrupt Funktion
Das Hauptprogramm liegt dann irgendwo weiter hinten....
Code:
ResetVector CODE H'0000' ; always fixed to address 0x0000
NOP
NOP
clrf STATUS
goto main
;--------------------------------------------------------------------
; I N T E R R U P T - V E C T O R
;
InterruptVector CODE H'0004' ; always fixed to address 0x0004
Interrupt:
movwf Save_Wreg
swapf STATUS,W
movwf Save_Status
btfsc INTCON,TMR0IF ; Timer 0 ; 1 ms Interrupt
goto TIMER0_Interrupt
InterruptEnd:
swapf Save_Status,W
movwf STATUS
swapf Save_Wreg,F
swapf Save_Wreg,W
retfie
;--------------------------------------------------------------------
TIMER0_Interrupt:
bcf INTCON,TMR0IF
goto InterruptEnd
;--------------------------------------------------------------------
main:
;
goto main
Auszug aus dem Datenblatt:
Anhang 32340
Siro
Liste der Anhänge anzeigen (Anzahl: 1)
Ich nehme an, du meinst folgenden Beginn des Codes in dieser Art?
(Ich habe die Start- und die Main-Funktion jetzt direkt nach die CONFIGs, EQUs und #designs in meinen Quellcode platziert)
Code:
org 00h
goto start
;*************************************************************************
; # START - PIN Configuration, TIMER Confuguration, OSZILLATOR Calibration, AD-CONVERTER definieren
;
start org 05h
Das, womit ich arbeite, ist nur eine einzelne ASM-Datei mit noch 6 weiteren Dateien. Ich habe mal einen Screenshot angehängt.
Anhang 32343
Und in der Simulation läuft's ja jetzt auch einwandfrei.. keine Ahnung, was da fehlen könnte..