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