Hallo!
Die "ORG" Direktive definiert wo im Programmspeicher der ganze nachfolgende Assemblercode bis nächste Direktive "ORG" bzw. "END" per verwendeten Compilerprogramm beim "flaschen" abgelegt werden soll. Die Adressen wählt man beliebig selber.
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:
Ich kann mir nicht erklären, welchen Zweck dasCode: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 enderfüllen sollte.org 5
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.no source code lines were found at current pc 0x0
Wenn ich den Code aufändere, funktioniert das debuggen problemlos.org 0
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
Geändert von Matze235 (11.01.2017 um 18:32 Uhr) Grund: Detaillierte Informationen
Hallo!
Die "ORG" Direktive definiert wo im Programmspeicher der ganze nachfolgende Assemblercode bis nächste Direktive "ORG" bzw. "END" per verwendeten Compilerprogramm beim "flaschen" abgelegt werden soll. Die Adressen wählt man beliebig selber.
MfG (Mit feinem Grübeln) Wir unterstützen dich bei deinen Projekten, aber wir entwickeln sie nicht für dich. (radbruch) "Irgendwas" geht "irgendwie" immer...(Rabenauge) Machs - und berichte.(oberallgeier) Man weißt wie, aber nie warum. Gut zu wissen, was man nicht weiß. Zuerst messen, danach fragen. Was heute geht, wurde gestern gebastelt. http://www.youtube.com/watch?v=qOAnVO3y2u8 Danke!
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....
Auszug aus dem Datenblatt: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
Siro
Geändert von Siro (11.01.2017 um 21:21 Uhr)
Ich verwende allerdings keine Interrupt-Funktionen.
Muss die Adresse 0x04 dann trotzdem frei bleiben?
Ich habe den Code nach deinen Vorgaben mal ein wenig angepasst:
Folgende Fehlermeldung erscheint, wenn ich " org 05h " verwende:Code:list p=12C672 #include <p12c672.inc> __CONFIG _CP_ALL & _PWRTE_ON & _WDT_OFF & _WDTE_OFF & _HS_OSC ... EQU ... ;... etliche EQU Registeradressen-Benennungen #define .. ;... einige #define - Anweisungen org 0 ; # geänderter Code, Simulation möglich goto start ; ------------------------------------- ; Ganz viele Funktionen/Unterprogramme ; ------------------------------------- start ;org 05h ; # Speicherstelle 05h führt zu Fehlermeldungen org 36h ; # erste Speicherstelle, an der der BUILD ohne Fehler abgeschlossen werden konnte ; ------------------------------------- ; Initialisierungen ; ------------------------------------- main call heat_function call wait_function call meas_function goto main
Erst bei " org 36h " taucht dieser Fehler nicht mehr auf.CLEAN SUCCESSFUL (total time: 102ms)
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory 'C:/Users/AS/MPLABXProjects/CO_Sensor_V01_1.X'
make -f nbproject/Makefile-default.mk dist/default/production/CO_Sensor_V01_1.X.production.hex
make[2]: Entering directory 'C:/Users/AS/MPLABXProjects/CO_Sensor_V01_1.X'
"C:\Program Files (x86)\Microchip\MPLABX\v3.50\mpasmx\mpasmx.exe" -q -p12c672 -l"build/default/production/cose_v01_1.lst" -e"build/default/production/cose_v01_1.err" -o"build/default/production/cose_v01_1.o" "cose_v01_1.asm"
Message[302] C:\USERS\AS\MPLABXPROJECTS\CO_SENSOR_V01_1.X\COSE_ V01_1.ASM 271 : Register in operand not in bank 0. Ensure that bank bits are correct.
make[2]: *** [dist/default/production/CO_Sensor_V01_1.X.production.hex] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
"C:\Program Files (x86)\Microchip\MPLABX\v3.50\mpasmx\mplink.exe" -p12c672 -w -m"dist/default/production/CO_Sensor_V01_1.X.production.map" -z__MPLAB_BUILD=1 -odist/default/production/CO_Sensor_V01_1.X.production.cof build/default/production/cose_v01_1.o
MPLINK 5.08, LINKER
Device Database Version 1.34
Copyright (c) 1998-2011 Microchip Technology Inc.
Error - section '.org_1' can not fit the absolute section. Section '.org_1' start=0x00000005, length=0x00000022
Errors : 1
nbproject/Makefile-default.mk:118: recipe for target 'dist/default/production/CO_Sensor_V01_1.X.production.hex' failed
make[2]: Leaving directory 'C:/Users/AS/MPLABXProjects/CO_Sensor_V01_1.X'
nbproject/Makefile-default.mk:84: recipe for target '.build-conf' failed
make[1]: Leaving directory 'C:/Users/AS/MPLABXProjects/CO_Sensor_V01_1.X'
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed
BUILD FAILED (exit value 2, total time: 1s)
Gibt es eine Möglichkeit, ohne lästige Probiererei herauszufinden, wo meine Start-Funktion beginnen darf?
Ja, durch Schreiben ASM Quellcoden entsprechend geprüften Ablaufdiagrammen.
MfG (Mit feinem Grübeln) Wir unterstützen dich bei deinen Projekten, aber wir entwickeln sie nicht für dich. (radbruch) "Irgendwas" geht "irgendwie" immer...(Rabenauge) Machs - und berichte.(oberallgeier) Man weißt wie, aber nie warum. Gut zu wissen, was man nicht weiß. Zuerst messen, danach fragen. Was heute geht, wurde gestern gebastelt. http://www.youtube.com/watch?v=qOAnVO3y2u8 Danke!
Tut mir leid, ich verstehe nicht, was du mir sagen willst.
Kommentiere das ORG aus, übersetze das Projekt für Debugmodus und schau im Listing (Window->Debugging->Output->Disassemby Listing File) nach, auf welche Adresse der Linker deine main bzw. die erste Anweisung nach start allokiert hat (erste Spalte im Listing). Das müsste dann die nächste freie Adresse sein, die der Linker gefunden hat.
Warum musst du die start-Marke überhaupt selber allokieren? Vielleicht brauchst du das ORG an der Stelle überhaupt nicht?
Geändert von witkatz (12.01.2017 um 12:51 Uhr)
Super! Besten Dank!
Das ist genau das, was ich gesucht habe!
Vielen Dank! Das Disassemby Listing File hat mir sehr weitergeholfen!
Das "ORG 0x00" kann ich mir anscheinend sparen, wie es scheint. Richtig?
Ich verwende -wie gesagt- keine Interrupt-Funktionen.
Muss die Adresse 0x04 dann trotzdem frei bleiben?
Wenn ich "ORG 0x00" und "ORG 0x05" beide weglasse, bekomme ich zumindest etliche Fehlermeldungen.
Eines von beiden muss ich anscheinend mindestens vorgeben.
Nix zu danken. Ich freue mich immer sehr, wenn ich noch helfen konnte.
Keine Ahnung (kurz: k.A.).
k.A. Vorsichsweise habe ich sie immer übersprungen.
k.A. Ich verwende anderes ASS Programm, wo man mehrere Fehlermeldungen ruhig ignorieren kann.
Sorry, aber ich kann nur Fragen über mir schon bekannte Probleme beantworten.
MfG (Mit feinem Grübeln) Wir unterstützen dich bei deinen Projekten, aber wir entwickeln sie nicht für dich. (radbruch) "Irgendwas" geht "irgendwie" immer...(Rabenauge) Machs - und berichte.(oberallgeier) Man weißt wie, aber nie warum. Gut zu wissen, was man nicht weiß. Zuerst messen, danach fragen. Was heute geht, wurde gestern gebastelt. http://www.youtube.com/watch?v=qOAnVO3y2u8 Danke!
den Reset Vektor würde ich schon drin lassen
Wenn du die Gründe nicht kennst, warum der Interruptvektor frei gelassen wurde, lass ihn frei, wenn es nicht weh tut.
Damit müsste es getan sein. Für die Marke start brauchst du mE wahrscheinlich keine absolute Adresse. Weitere org brauchst du im Quellcode dann, wenn "computed goto", sprich Tabellen verwendet werden. Das ist in PICtures Artikel http://rn-wissen.de/wiki/index.php?t...mbler#Tabellen recht gut erklärt.Code:org 0 ; # geänderter Code, Simulation möglich goto start org 5
Nachtrag
Ich werd das Gefühl nicht los, dass das erste von dir gepostete Quellcode nur ein Teil des Softwareprojektes ist. Es wundert mich, dass der Bereich ab Resetvektor leer war. Kann es sein, dass irgendein #include bereits gelöscht wurde, oder zu dem Softwareprojekt noch weitere Dateien dazu gehört haben, die der MPLINK ursprünglich zusammengelinkt hat? Liegt dir das komplette Softwareprojekt mit allen Dateien und Linkerskript vor?
Geändert von witkatz (12.01.2017 um 22:52 Uhr)
Lesezeichen