- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 8 von 8

Thema: Reset Vector

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    07.07.2007
    Beiträge
    48

    Reset Vector

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.12.2005
    Ort
    Euskirchen-Großbüllesheim
    Alter
    74
    Beiträge
    2.063
    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 !
    MfG Karl-Heinz
    HobbyElektronik hier klicken ....

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    07.07.2007
    Beiträge
    48
    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.

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.12.2005
    Ort
    Euskirchen-Großbüllesheim
    Alter
    74
    Beiträge
    2.063
    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 !
    MfG Karl-Heinz
    HobbyElektronik hier klicken ....

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    07.07.2007
    Beiträge
    48
    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

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    17.09.2006
    Ort
    Essen
    Alter
    63
    Beiträge
    83
    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

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    07.07.2007
    Beiträge
    48
    Sehr schön. Danke für die schnelle Antwort

  8. #8
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    73
    Beiträge
    11.077
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test