PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Reset Vector



frank85
07.07.2007, 00:24
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.


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

kalledom
07.07.2007, 14:46
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 !

frank85
07.07.2007, 19:49
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.

kalledom
08.07.2007, 15:28
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 !

frank85
08.07.2007, 22:31
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

r.moshage
08.07.2007, 22:41
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

frank85
08.07.2007, 22:46
Sehr schön. Danke für die schnelle Antwort :-)

PICture
08.07.2007, 22:47
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