PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Neueinsteiger: Pic16F84a und MPLAB 7.61 (gelöst)



Waldenfeld
05.08.2007, 19:45
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:


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


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.

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:


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

Ich bin mir auch nicht sicher, ob das auch so richtig ist, wie ich es "zusammenkopiert" hab. Folgend die "Kompiliermeldungen":


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

stowoda
05.08.2007, 20:23
Versuch doch mal "ORG 0" unmittelbar vor die Initialisierung zu schreiben.
Nachdem Du die beiden Variablen deklarierst.

theborg
05.08.2007, 20:28
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.



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

Waldenfeld
05.08.2007, 20:41
Versuch doch mal "ORG 0" unmittelbar vor die Initialisierung zu schreiben.
Nachdem Du die beiden Variablen deklarierst.

Das funktioniert leider nicht. Habe schon minimalistische Lösungen versucht wie sie hier im Forum zu finden sind.


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 geht das kompilieren.


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 nicht.


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.


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.

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.

Waldenfeld
05.08.2007, 20:59
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.



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


Dein Beispiel lässt sich ohne Probleme kompilieren.
Leider hab ich es nicht gebacken bekommen, mein "Blinkprogramm" da reinzubekommen.


cblock 0x20 ; Variablen kenzeichnen
;....
endc

Damit kann ich noch nicht um :(

Ich werd mir aber das Programm "Piklab" besorgen, wenn es "Einsteigerfreundlicher" ist. Danke für den Tipp :)

theborg
05.08.2007, 21:09
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

Waldenfeld
05.08.2007, 21:15
Genial, jetzt hab ich das endlich begriffen. Dank nochmals !

Nachtrag:

Das Programm sieht dann nun so aus:


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


Der Kompiler meckert leider wieder über das "ORG" wenn ich es wie angegeben schreibe :(


Error - section '.org_1' .......

"Piklab" lässt sich auch nicht installieren. (Hab die Piglab-Prog-Win32-Version gezogen, benutze WinXP-SP1) Heute ist wohl nicht mein Tag :((((

theborg
05.08.2007, 21:18
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

Waldenfeld
09.08.2007, 00:30
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:




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

..........


Wollte das nur erwähnen, für den Nächsten der sich damit rumärgert :D