Versuch doch mal "ORG 0" unmittelbar vor die Initialisierung zu schreiben.
Nachdem Du die beiden Variablen deklarierst.
Hallo zusammen.
Ich hab vor mich im Bereich „PIC“ einzuarbeiten und auch schon fleißig gelesen. Nachdem ich wegen nem 3.3Volt-COM-Port verzweifelt meinen JDM-Brenner wieder zerlötet habe, hab ich nun den Brenner-3 erfolgreich am laufen. Hatte noch nen 7406 in meiner Bastelkiste gefunden gehabt
Entschieden hab ich mich, um anzufangen, für den „PIC16F84a“. Der ist bei vielen Basteleien weit verbreitet und kann noch nicht so viel, so daß ich hoffe, wenigstens damit klar zu kommen anfangs. Für die Programmiergeschichte hab ich mir das MPLAB-7.61 gezogen und installiert. Auf www.sprut.de sind einige Beispiele mit den ich anfangen wollte. Eine klasse Seite!
Mein erster Versuch war ne LED blinken zu lassen. Hab mir dazu ein kleines Testboard gelötet auf ner Lochraster wie hier im Forum vorgeschlagen. Ein fertiges „HEX“ zum testen gebrannt und mich über das Funktionieren gefreut.
Nun gings weiter mit dem Programm an sich. Ich wollte das mal im MPLAB selbst kompilieren. Und da häng ich nun der Verzweiflung nahe und hoffe hier auf jemanden, der mir das ein wenig genauer erklären könnte.
Ich habe ein Problem mit „ORG 0“ und dem Beispiel aus MPLAB wo das mit „PROG CODE“ und „STARTUP CODE“ in den Dateien „Example & Example2.asm“ drinne steht.
Erfolgreich konnte ich nur kompilieren, wenn ich anstatt „ORG 0“ „PROG CODE“ geschrieben hatte. Alles andere führte zum Fehler:
Hab mich schon in der „16F84a.inc“ und der „16F84a.lnk umgesehen. In letzterer sind „Startup und Prog“ erwähnt. Nur ich blick das nicht, wie das nun zusammenhängt. Das mit dem ORG ist ja noch halbwegs nachvollziehbar.MPLINK 4.12, Linker Copyright (c) 2007 Microchip Technology Inc. Error - section '.org_0' can not fit the absolute section. Section '.org_0' start=0x00000000, length=0x00000034 Errors : 1
Wie benutz ich diese Befehle anstatt dem „ORG“, vor allem wenn ich z.B. ne Taste programmieren möchte die einen Interrupt auslöst?
Hier mein Programm:
Ich bin mir auch nicht sicher, ob das auch so richtig ist, wie ich es "zusammenkopiert" hab. Folgend die "Kompiliermeldungen":Code:list p=16f84a ;der Prozessortyp wird festgelegt include "p16f84a.inc" ;die include-Datei mit vielen Festlegungen wird geladen __config _XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF PROG CODE ; damit gehts ; ORG 0 ; damit nicht ; Variablennamen vergeben loops Equ 0x22 ; Zähler für Warteschleife loops2 Equ 0x23 ; Zähler für Warteschleife ; Initialiesierung bsf STATUS, RP0 ; auf Bank 1 umschalten movlw B'00000000' ; PortB alle output movwf TRISB ; ? bcf STATUS, RP0 ; auf Bank 0 zurückschalten clrf PORTB ; alle LEDs ausschalten ; LED an RB0 einschalten bsf PORTB,0 ; LED an RB0 einschalten ; Blinken Loop call Wait ; Wartezeit bcf PORTB,0 ; LED aus call Wait bsf PORTB,0 ; LED an goto Loop ; Warteschleife 250 ms Wait movlw D'250' ; 250 ms Pause movwf loops Wai movlw .110 ; Zeitkonstante für 1ms movwf loops2 Wai2 nop ; nop nop nop nop nop decfsz loops2, F ; 1 ms vorbei? goto Wai2 ; nein, noch nicht ; decfsz loops, F ; 250 ms vorbei? goto Wai ; nein, noch nicht retlw 0 ; das Warten hat ein Ende end
Executing: "C:\Programme\Microchip\MPASM Suite\MPASMWIN.exe" /q /p16F84A "Uebung.asm" /l"Uebung.lst" /e"Uebung.err" /o"Uebung.o"
Warning[205] C:\MPLAB-PROGRAMME\UEBUNG.ASM 1 : Found directive in column 1. (list)
Warning[205] C:\MPLAB-PROGRAMME\UEBUNG.ASM 2 : Found directive in column 1. (include)
Warning[205] C:\MPLAB-PROGRAMME\UEBUNG.ASM 4 : Found directive in column 1. (__config)
Message[302] C:\MPLAB-PROGRAMME\UEBUNG.ASM 18 : Register in operand not in bank 0. Ensure that bank bits are correct.
Executing: "C:\Programme\Microchip\MPASM Suite\mplink.exe" "C:\Programme\Microchip\MPASM Suite\LKR\16f84a.lkr" "C:\MPLAb-Programme\Uebung.o" /o"Uebung.cof" /M"Uebung.map" /W
MPLINK 4.12, Linker
Copyright (c) 2007 Microchip Technology Inc.
Errors : 0
MP2HEX 4.12, COFF to HEX File Converter
Copyright (c) 2007 Microchip Technology Inc.
Errors : 0
Loaded C:\MPLAb-Programme\Uebung.cof.
BUILD SUCCEEDED: Sun Aug 05 19:39:40 2007
Versuch doch mal "ORG 0" unmittelbar vor die Initialisierung zu schreiben.
Nachdem Du die beiden Variablen deklarierst.
hi die templates sind manchmal nett so ideal von sprut versuch des mal mit folgenden minimal template.
Als tip ich persönlich finde MPLAB etwas verwirrend voraledem an Anfang nicht so zu Empfehlen, versuche mal piklab das gibt es auch für Windows ist recht umfangreich und einfach zu bedienen.
Code:list p=16f84a include "p16f84a.inc" __config _XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF org 0x00 ; Speicher Anfang die ersten 3 befehle goto main ; Erste Routine die aufgerufen wird org 0x04 ; Erste Speicherzelle von Main cblock 0x20 ; Variablen kenzeichnen ;.... endc main ;you code here goto main end
Legastheniker on Bord !
Das funktioniert leider nicht. Habe schon minimalistische Lösungen versucht wie sie hier im Forum zu finden sind.Zitat von stowoda
So geht das kompilieren.Code:list p=16f84a ;der Prozessortyp wird festgelegt include "p16f84a.inc" ;die include-Datei mit vielen Festlegungen wird geladen __config _XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF ORG 0 PROG CODE ; Variablennamen vergeben loops Equ 0x22 ; Zähler für Warteschleife loops2 Equ 0x23 ; Zähler für Warteschleife .....
So nicht.Code:list p=16f84a ;der Prozessortyp wird festgelegt include "p16f84a.inc" ;die include-Datei mit vielen Festlegungen wird geladen __config _XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF ORG 0 ; damit nicht ; PROG CODE ; damit gehts ; Variablennamen vergeben loops Equ 0x22 ; Zähler für Warteschleife loops2 Equ 0x23 ; Zähler für Warteschleife .......
So gibts massig Fehlermeldungen [152] und es kompiliert auch nicht.Code:list p=16f84a ;der Prozessortyp wird festgelegt include "p16f84a.inc" ;die include-Datei mit vielen Festlegungen wird geladen __config _XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF ; ORG 0 ; damit nicht ; PROG CODE ; damit gehts ; Variablennamen vergeben loops Equ 0x22 ; Zähler für Warteschleife loops2 Equ 0x23 ; Zähler für Warteschleife ......
So gehts auch.Code:list p=16f84a ;der Prozessortyp wird festgelegt include "p16f84a.inc" ;die include-Datei mit vielen Festlegungen wird geladen __config _XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF ; ORG 0 ; damit nicht PROG CODE ; damit gehts ; Variablennamen vergeben loops Equ 0x22 ; Zähler für Warteschleife loops2 Equ 0x23 ; Zähler für Warteschleife .........
Das suggeriert mir, daß der Befehl "ORG" durch "PROG CODE, STARTUP CODE" ersetzt wurde ?! (Steht zumindest in der 16F84a.lnk, aus der ich noch nicht schlau werde)
Wie oben geschrieben, würd ich mich freuen, wenn mir jemand das etwas näher bringen könnte. Ich hab bisher nur die MPLAB 7.61 verwendet.
Dein Beispiel lässt sich ohne Probleme kompilieren.Zitat von theborg
Leider hab ich es nicht gebacken bekommen, mein "Blinkprogramm" da reinzubekommen.
Damit kann ich noch nicht umcblock 0x20 ; Variablen kenzeichnen
;....
endc
Ich werd mir aber das Programm "Piklab" besorgen, wenn es "Einsteigerfreundlicher" ist. Danke für den Tipp
hi als beispiel du kanst die variablen zuweisen mit equ oder du machst es mit
cblock 0x20 ; Variablen kenzeichnen
bla
blub
mip
endc
dann hat bla adresse 0x20, blub 0x21 und mip 0x22
Legastheniker on Bord !
Genial, jetzt hab ich das endlich begriffen. Dank nochmals !
Nachtrag:
Das Programm sieht dann nun so aus:
Der Kompiler meckert leider wieder über das "ORG" wenn ich es wie angegeben schreibeCode:list p=16f84a include "p16f84a.inc" __config _XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF org 0x00 ; Speicher Anfang die ersten 3 befehle goto Main ; Erste Routine die aufgerufen wird org 0x04 ; Erste Speicherzelle von Main cblock 0x22 ; Variablen kenzeichnen loops loops2 endc bsf STATUS, RP0 ; auf Bank 1 umschalten movlw B'00000000' ; PortB alle output movwf TRISB ; ? bcf STATUS, RP0 ; auf Bank 0 zurückschalten clrf PORTB ; alle LEDs ausschalten ; LED an RB0 einschalten bsf PORTB,0 ; LED an RB0 einschalten ; Blinken Main call Wait ; Wartezeit bcf PORTB,0 ; LED aus call Wait bsf PORTB,0 ; LED an goto Main ; Warteschleife 250 ms Wait movlw D'250' ; 250 ms Pause movwf loops Wai movlw .110 ; Zeitkonstante für 1ms movwf loops2 Wai2 nop ; nop nop nop nop nop decfsz loops2, F ; 1 ms vorbei? goto Wai2 ; nein, noch nicht ; decfsz loops, F ; 250 ms vorbei? goto Wai ; nein, noch nicht retlw 0 ; das Warten hat ein Ende end ;das Ende des Programms
"Piklab" lässt sich auch nicht installieren. (Hab die Piglab-Prog-Win32-Version gezogen, benutze WinXP-SP1) Heute ist wohl nicht mein Tag (((Error - section '.org_1' .......
Noch nen kleiner Tipp bei piklab auf Register da sieste die ganzen Zuordnungen weis jetzt nicht ob gpsim unter win läuft aber wenn ja kanste beim simulieren die aktuellen werte auslesen
Legastheniker on Bord !
Das Thema hat sich nun erledigt.
Mein Englisch ist nicht gerade vorzeigefähig, jedoch war folgendes recht lehrsam und einleuchtend im Bezug auf PIC-16 und MPLAB 7.61:
PIC16 Application Example - org
This example shows the usage of the org directive. Code generation begins at an address spcified by org address. The origin of a data table also can be specified by this directive. A data table may be placed either in a program memory region or in an EE data memory region, as in case of a PICmicro device with EE data FLASH.
#include p16f877a.inc ;Include standard header file for the selected device.
org 0x0000 ;The following code will be placed in reset address 0.
goto Main ;Jump to an address whose label is 'Main'.
org 0x0004 ;The following code will be placed in interrupt address 4.
goto int_routine ;Jump to an address whose label is 'int_routine'.
org 0x0010 ;The following code section will placed starting from address 10H.
....
Mein Programmkopf sieht nun so aus und funktioniert nun endlich ohne Murren beim Kompilieren:
Wollte das nur erwähnen, für den Nächsten der sich damit rumärgertCode:list p=16f84a include "p16f84a.inc" __config _XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF cblock 0x20 ; Variablen kenzeichnen Test w_temp status_temp endc ORG 0 ; Erste Programmadresse call init ; Port-Initialisierung aufrufen goto main ; Sprung zur Hauptprogrammschleife ORG 4 ; Interruptadresse goto int ; zur Interruptserviceroutine ORG 10 ; Programm wird ab 10h abgelegt im PIC main ..........
Lesezeichen