-
Reset Vector
Hallo zusammen.
Wollte gerne mal wissen wieso folgender code ohne "goto main" nicht funktioniert. Oder mit goto main und ab org 0x030 funktioniert. Warum bringt mir MPLAB diese Fehlermeldung:
MPLINK 4.11, Linker
Copyright (c) 2007 Microchip Technology Inc.
Error - section '.org_0' can not fit the absolute section. Section '.org_0' start=0x00000000, length=0x0000004e
Errors : 1
Übrigens ich benutze einen PIC18f8520 und ein fertiges board dazu. Das Lauflicht funktioniert jedenfalls. Aber wie gesagt mit den oben beschriebenen Bedingungen. Im Datenblatt und Google läßt sich nichts sinnvolles finden.
Code:
list p=18f8520 ;der Prozessortyp wird festgelegt
include "p18f8520.inc" ;die include-Datei mit vielen Festlegungen wird geladen
;z.B. sind hier Standardnamen für wichtige
;Register und Bits festgelegt
;Configuration bits
CONFIG OSC = HS ; HS 20 MHz
CONFIG PWRT = ON ; power up timer on
CONFIG BOR = OFF ; brown out detect off
CONFIG WDT = Off ; watchdog off
CONFIG LVP = OFF ; lvp off
;Variable definitions
CBLOCK 0x0
loops
loops2
ENDC
;******************************************************************************
;Reset vector
; hier beginnt der Prozessor beim Reset
org 0x0000
clrf TRISB ; alle Ports outputs
clrf PORTB ; alle LEDs ausschalten
; 1. LED einschalten
bsf PORTB,0 ; LED an RB0 einschalten
; Lauflicht
Loop
call Wait ; Wartezeit
rlncf PORTB,1
BTFSS PORTB,7 ; laufen zur nächsten LED
goto Loop
Loop2
call Wait
rrncf PORTB,f
BTFSS PORTB,0
goto Loop2
goto Loop
;******************************************************************************
; Warteschleife 250 ms
; 20 MHZ
; 20 Zyklen pro loop
; 249 loops
Wait
movlw D'1000' ; 250 ms Pause
movwf loops
Wai
movlw .249 ; Zeitkonstante für 1ms
movwf loops2
Wai2 nop
nop
nop
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 of program
END
Jetzt schon vielen Dank für Eure hilfe.
Gruß frank
-
Hallo,
Adresse 0x0000 ist der Reset Vector
Adresse 0x0004 ist der Interrupt Vector (beim PIC16F877)
Bei Deinem PIC18F8520 ist dort bestimmt noch mehr vergeben.
Diese Adressen sind eigentlich für Sprungebefehle reserviert:
goto ProgStart ; oder Main :-)
goto IntRout ; oder ISR
.....
Deshalb kannst Du diesen Bereich nicht einfach für irgendwelchen Programmcode 'mißbrauchen'.
Was passiert bei einem Interrupt, der einen Sprung zur Adresse 0x0004 auslöst ? Was steht dann dort ? Da sollte ein Sprung-Befehl zu Deiner InterruptServiceRoutine stehen !
-
Hallo.
Danke für die Antwort. Aber es heißt doch, wenn der PIC resetet wird, dann springt er zum Resetvector und beginnt von neu. Ja aber dann muss doch auch direkt das Programm dort stehen. Und wieso geht es mit der Adresse org 0x00, wenn ich goto weg lasse? Das ist alles nicht so plausibel für mich.
-
Ich hatte Dir zu erklären versucht, daß bei einem Interrupt das laufende Programm unterbrochen wird und ein Sprung zur Adresse 0x0004 erfolgt. Was steht bei Dir an Adresse 0x0004 ? Garantiert nichts, womit eine Interrupt-Service-Routine was anfangen könnte.
Du solltest diesbezüglich das Datenblatt etwas genauer durchlesen.
Es heißt Reset Vector und Interrupt Vector. Ein Vector ist nicht für 'normalen' Programmcode gedacht.
Edit:
Bei Reset, der auch durch andere Ereignisse ausgelöst werden kann, erfolgt ein Sprung zur Adresse 0x0000, zum Reset Vector !
-
Hallo.
Danke nochmal. Ich habe es jetzt kapiert. Ich habe nämlich den RAM mit dem Flash verwechselt. Habe irgenwie gedacht das das Programm in den RAM an der stelle 0x00 geschrieben wird. Das kann ja nicht gehen.
Habe da noch eine Frage.
Ist der PIC multitasking fähig?
Ich meine damit, ob der PIC z.B. 2 Programmabschnitte gleichzeitig verarbeiten kann. Ich wollte nämlich ein kleines Programm schreiben, welches zwei Lauflichter gegeneinander oder miteinander laufen lässt (halt 2 PORTs). Wenn er es nicht kann, dann können die LEDs ja nicht synchron aufläuchten, oder? Dann hätten die LEDs ja einen zeitlichen Versatz wenn der PIC die Befehle linear abarbeitet, richtig??
Gruß frank
-
Bei 20 MHz dauert ein Befehl 0,2 mikrosekunden. Wenn du die Portpins nacheinander aktivierst wird kein Mensch den Versatz bemerken, so schnell ist kein Auge. Ach so, der PIC ist nicht multitasking fähig.
MFG
Ralf
-
Sehr schön. Danke für die schnelle Antwort :-)
-
Hallo frank85!
Der PIC ist nicht multitasking fähig. Wenn er aber mit hoher Frequenz (z.B. 40 MHz was einer 0,1 µs pro Befehl entspricht) arbeitet und zwei Unterprogramme in endloser Schleife ausgeführt werden, ist der zeitlicher Versatz unbemerkbar.
MfG