PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 16F59 Pagefehlermeldung, Programm läuft nicht mehr



andimaniac
24.08.2006, 13:48
Seit ich



nop
goto main
nop
nop


eingefügt habe, habe ich folgende Fehlermeldung



Error - file 'D:\CANON\16f59\main.o', section '.org_0', performs a call to
symbol 'signalrueck' which is not in the lower half of a page.


habe mit pagesel probiert, programm läuft trotzdem nicht, habs wieder wegkommentiert.

Was mach ich falsch?

gruss Andi





list p=16f59
#include <P16f5x.INC>
;----------------------------------------------------------
; Configuration Word
__CONFIG _CP_OFF & _WDT_OFF & _HS_OSC
;----------------------------------------------------------
; Variablen festlegen
cblock 0x10
delay1 ;equ 0x20 ; Wartezeit für WAIT in Millisekunden
delay2 ;equ 0x21 ; interner timer für wait
value ; Delayzeit
times1 ; Anzahl der Wiederholungen bei signalrueck
times2 ; Anzahl der Wiederholungen bei signalrueck
times3 ; Anzahl der Wiederholungen bei signalrueck fuer aus
steps ; Anzahl der Schritte bei Aufwaermen
anzahl ; Anzahl der Aufrufe bei papiereinzug
anzahl2 ; Anzahl der Aufrufe bei papiereinzug 2
endc

;----------------------------------------------------------
; Konstanten festlegen

#define VorschubV PORTA,0 ; Vorschub vor
#define VorschubR PORTA,1 ; Vorschub rueck
#define PapierR PORTA,2 ; Papier runter
#define PapierH PORTA,3 ; Papier hoch

org 0x0000 ; Programmanfang
nop
goto main
nop
nop

;------------------------------------------------
main
call Init
;-------------------- Fehlerfalle
btfsc VorschubV
goto bypass
btfsc VorschubR
goto bypass
btfsc PapierR
goto bypass
btfsc PapierH
goto bypass
;-------------------- Fehlerfalle ende
call printinit
initready
clrf PORTC
nop
bsf PORTC,6
bsf PORTC,7
;------------------------------------------------
; Aufwaermen oder Drucken
test
btfsc VorschubR
goto warmupinit
btfsc PapierH
goto print
goto test
;------------------------------------------------

; delay -------------------
delay
movwf delay2
loop1
movwf delay1
loop2
decfsz delay1,1
goto loop2
decfsz delay2,1
goto loop1
retlw 0
; delay end ---------------

; Aufwaermen
warmupinit
movlw 0x0b
movwf steps
warmup
;step1
movlw 0x0a ; Zeit bis Sensor an
movwf times1
movwf times2
decf steps, 1
step1
btfss VorschubR
goto step1
bsf PORTC,1
movlw 0x0a
movwf value
;pagesel signalrueck
call signalrueck
decfsz times2,1
goto sprung1
movlw 0x0a
movwf times2
decfsz times1,1
goto sprung1
bsf PORTB,0
sprung1
btfsc VorschubR
goto step1
;step1 end
;---------------------------
;step2
movlw 0x0a ; Zeit bis Sensor aus
movwf times1
movwf times2
step2
btfss VorschubR
goto step2
bsf PORTC,2
movlw 0x0a
movwf value
;pagesel signalrueck
call signalrueck
decfsz times2,1
goto sprung2
movlw 0x0a
movwf times2
decfsz times1,1
goto sprung2
bcf PORTB,0
sprung2
btfsc VorschubR
goto step2

decfsz steps,1
goto step3
goto print
;step2 end
;---------------------------
;step3
step3
btfss VorschubR
goto step3
bsf PORTC,3
movlw 0x0a
movwf value
;pagesel signalrueck
call signalrueck
btfsc PORTA,1
goto step3
;step3 end
bcf PORTC,1
nop
bcf PORTC,2
nop
bcf PORTC,3
decf steps,1
goto warmup


;---------------------------------------------------------
;********************* DRUCKEN ***************************
print
;----LEDs----
clrf PORTC
bsf PORTC,0
bsf PORTC,4
bsf PORTC,5
;----Vorschub
printloop
btfss PapierH ; wenn PapierH gesetzt ...
goto printloop ; ... sonst warten
movlw 0x12 ; Dauer der Schleife bis Papier unten geladen ist
movwf anzahl2 ; Dauer der Schleife uebergeben
einzug
decfsz anzahl2 ; Dekrementieren
goto jump ; bei 0 ueberspringen sonst Sprung auf jump
bcf PORTB,2 ; ... PORTB,2 -> Papier geladen
;bcf PORTB,1 ; nur ein test, loeschen ###############
;bsf PORTB,2 ; nur ein test, loeschen ###############
goto bypass ; wenn Papier geladen Sprung auf bypass
jump
movlw 0xff ; Dauer2 der Schleife
movfw anzahl ; Dauer2 der Schleife uebergeben
movlw 0x03 ; Parameteruebergabe ...
movwf value ; ... fuer papiereinzug
call papiereinzug; papiereinzug aufrufen
bcf PORTB,1 ; Papier oben angekommen (PORTB,1)


;-------Bypass
bypass
movlw 0xff
movwf anzahl
movwf PORTC
bypass1
movlw 0xff
movwf anzahl2
bypass2
decfsz anzahl2
goto jump2
decfsz anzahl
goto jump2
;bsf PORTB,2 ; Papier unten durch (PORTB,2) ...
goto laststep ; ... sprung auf den letzten Schritt
jump2
movfw PORTE
movwf PORTD
goto bypass2
laststep ; Letzter Schritt
movfw PORTE
movwf PORTD
btfsc PapierH
goto print
goto laststep

;********************* DRUCKEN ENDE **********************
;------------------------------------------------
papiereinzug
call signalrunter
decfsz anzahl
goto papiereinzug
goto einzug
retlw 0


Init
movlw b'1111'
TRIS PORTA

movlw b'00000000'
TRIS PORTB
clrf PORTB
bsf PORTB,1
bsf PORTB,2

movlw b'00000000'
TRIS PORTC
clrf PORTC

movlw b'00000000'
tris PORTD
clrf PORTD

movlw b'11111111'
TRIS PORTE
retlw 0

printinit
bsf PORTC,7
printinit1
btfss VorschubV
goto printinit1
btfsc PapierH
;pagesel papierraus
goto papierraus
bsf PORTC,0
movlw 0x0a
movwf value
call signalvor
btfsc PORTA,0
goto printinit1
printinit2
btfss PapierR
goto printinit2
bsf PORTC,1
movlw 0x0c
movwf value
call signalhoch
btfsc PapierR
goto printinit2
printinit3
btfss PapierH
goto printinit3
bsf PORTC,2
movlw 0x0c
movwf value
call signalrunter
btfsc PapierH
goto printinit3
printinit4
btfss PapierR
goto printinit4
bsf PORTC,3
movlw 0x05
movwf value
call signalhoch
btfsc PapierR
goto printinit4
printinit5
btfss VorschubV
goto printinit5
bsf PORTC,4
movlw 0x0a
movwf value
call signalvor
btfsc VorschubV
goto printinit5
;----------------------------
cleaning
movlw 0x0a ; Zeit bis Impuls
movwf times1
movwf times2
printinit6
btfss VorschubR
goto printinit6
bsf PORTC,5
movlw 0x0a
movwf value
;pagesel signalrueck
call signalrueck
decfsz times2,1
goto sprung
movlw 0x0a
movwf times2
decfsz times1,1
goto sprung
bsf PORTB,0
movlw 0x7f ; Impulsdauer
movwf times3
sprung
decfsz times3,1
goto sens
bcf PORTB,0
sens
btfsc VorschubR
goto printinit6

;----------------------------
printinit7
btfss VorschubV
goto printinit7
bsf PORTC,6
movlw 0x0a
movwf value
call signalvor
btfsc VorschubV
goto printinit7
; ..



goto initready
; init ende



signalvor
bsf PORTD,7
movfw value
call delay
bsf PORTD,6
movfw value
call delay
bcf PORTD,7
movfw value
call delay
bcf PORTD,6
movfw value
call delay
retlw 0

signalhoch
bsf PORTD,5
movfw value
call delay
bsf PORTD,4
movfw value
call delay
bcf PORTD,5
movfw value
call delay
bcf PORTD,4
movfw value
call delay
retlw 0

signalrunter
bsf PORTD,4
movfw value
call delay
bsf PORTD,5
movfw value
call delay
bcf PORTD,4
movfw value
call delay
bcf PORTD,5
movfw value
call delay
retlw 0

;org 0x200
signalrueck
bsf PORTD,6
movfw value
call delay
bsf PORTD,7
movfw value
call delay
bcf PORTD,6
movfw value
call delay
bcf PORTD,7
movfw value
call delay
retlw 0



;--------Papierauswurf bei Fehler-----------
papierraus
btfss PapierH
;pagesel papierraus1
goto papierraus1

bsf PORTD,4
bsf PORTD,7
movfw value
call delay
bsf PORTD,5
bsf PORTD,6
movfw value
call delay
bcf PORTD,4
bcf PORTD,7
movfw value
call delay
bcf PORTD,5
bcf PORTD,6
movfw value
call delay
bsf PORTB,1
;pagesel papierraus
goto papierraus

;Vorschub Rueck
movlw 0x0a ; Zeit bis Impuls
movwf times1
movwf times2
papierraus1
btfss VorschubR
;pagesel papierraus1
goto papierraus1
bsf PORTC,5
movlw 0x0a
movwf value
;pagesel signalrueck
call signalrueck
decfsz times2,1
;pagesel papierraus11
goto papierraus11
movlw 0x0a
movwf times2
decfsz times1,1
;pagesel papierraus11
goto papierraus11
bsf PORTB,0
movlw 0x7f ; Impulsdauer
movwf times3
papierraus11
decfsz times3,1
;pagesel papierraus12
goto papierraus12
bcf PORTB,0
papierraus12
btfsc VorschubR
;pagesel papierraus1
goto papierraus1

papierraus2
btfss VorschubV
;pagesel papierraus2
goto papierraus2
bsf PORTC,6
movlw 0x0a
movwf value
call signalvor
btfsc VorschubV
;pagesel papierraus2
goto papierraus2
goto print
;--------Papierauswurf bei Fehler end-------

end

kalledom
24.08.2006, 17:30
Hallo,
dann sieh Dir mal folgende Assembler-Beispiele an, insbesondere ab ORG 0000 mit der folgenen Interrupt-Service-Routine, bei der Du einfach nur ein RETI hin machst, wenn kein Int benutzt wird, und dann noch die Initialisierung: http://www.domnick-elektronik.de/picasm.htm#ProgBeg

andimaniac
25.08.2006, 14:16
Ok, ich habs so gelöst

; Makros festlegen
Page0 macro
bcf STATUS,6
bcf STATUS,5
endm

Page1 macro
bcf STATUS,6
bsf STATUS,5
endm
;----------------------------------------------------------

org 0x0000

;programmcode0

org 0x200

;programmcode1



beim Aufrufen mit call oder goto habe ich für progcode0 Page0 und für progcode1 Page1 vorangestellt und schon läufts. ;)

kalledom
25.08.2006, 20:14
M_Page0 macro
bcf PCLATH,3 ; Rom-Page 0
bcf PCLATH,4
endm

M_Page1 macro
bsf PCLATH,3 ; Rom-Page 1
bcf PCLATH,4
endm
Ja klar, beim 16F59 sind zur Page-Umschaltung andere Bits zuständig, der obige Code ist ja auch für den PIC 16F87X.
Hauptsache, es funktioniert jetzt.

PS: Du muß nach CALL in eine andere Page selbst wieder auf die 'Start'-Page zurück-schalten.
Du kannst mehrere CALL's in eine andere Page nacheinander ausführen und brauchst dann erst wieder zurück-schalten.
Du bleibst innerhalb einer 'Ziel'-Page, bis auf die 'Quell'-Page oder eine ander Page umgeschaltet wird.

M_Page1 ; Auf Ziel-Page umschalten
movlw 1
call SubPage1_1
movlw 2
call SubPage1_2
movlw 3
call SubPage1_3
M_Page0 ; Auf Quell-Page zurück-schalten

andimaniac
28.08.2006, 08:31
Alles klar, dank Dir für die Hilfe ;)