T.J.
12.04.2007, 21:02
Hallo, ich habe ein mehr oder weniger großes Problem.
Ich bin dabei ein GLCD (mit T6963C) anzusteuern. Dazu verwende ich den oben genannten PIC, da es ein CAN Teilnehmer sein soll. Die Steuerleitungen sind an Port C angeschlossen und die Datenleitungen (D0...D7) sind nun RD0...RD7
um etwas zum display zu senden muss ich vorher den status abfragen. nun schon mein problem. hier mal alle benötigten auszüge aus meinem Quelltext:
LIST P=18F4685 ;directive to define processor
#include <P18F4685.INC> ;processor specific variable definitions
;************************************************* *****************************
;Configuration bits
; Oscillator Selection:
CONFIG OSC=IRCIO7 ;intern
CONFIG WDT=OFF ;no Watchdog
CONFIG CP0=OFF ;code protect off
CONFIG PBADEN=OFF ;Port A as I/O
CONFIG LVP=OFF ;low voltage programming
;************************************************* *****************************
;Variable definitions
CBLOCK 0x080
WREG_TEMP ;variable used for context saving
STATUS_TEMP ;variable used for context saving
BSR_TEMP ;variable used for context saving
ENDC
CBLOCK 0x000
EXAMPLE ;example of a variable in access RAM
ENDC
UDATA_ACS
r24 RES 1 ;8bit zwischenspeicher
r25 RES 1 ;8bit zwischenspeicher
r20 RES 1 ;8bit zwischenspeicher
r21 RES 1 ;8bit zwischenspeicher
r30 RES 1 ;8bit zwischenspeicher
r31 RES 1 ;8bit zwischenspeicher
Frage 1: ist das mit den Variablendeklarationen so richtig? (RES1)
Init:
bsf RCON, IPEN
bsf INTCON, GIEH
bsf INTCON, GIEL
movlw 0x70 ; maximale interne Frequenz 8MHz setzen
movwf OSCCON
clrf WREG ; Akkumulator loeschen
movwf TRISD ; PortD als Ausgang definieren
movwf TRISC ; PortC als Ausgang definieren
movwf TRISB ; PortB als Ausgang definieren
rcall Set_Display
rcall Clear_Text
Main:
; *** main code goes here ***
ORG 0x0100
rcall Init ;Initialisieren
................................
Hier die eigentlich wichtige Funktion, sie wird von Set_Display aufgerufen:
Gstatus_check:
bsf PORTC,4 ; command
movlw 0xFF ; make port an input
movwf TRISD
Gstatus_check1:
bcf PORTC,2 ; RD low
;*#IF _XTAL>12000000
nop
nop
;*#ENDIF
bcf PORTC,3 ; Enable Chip
nop
nop
nop
;*#IF _XTAL>12000000
nop
nop
nop
;*#ENDIF
+++++++++++++++++++++++++++++++++++++
movf PORTD,0 ; get status
movwf PORTB
movwf r25
+++++++++++++++++++++++++++++++++++++
;*#IF _XTAL>12000000
nop
nop
;*#ENDIF
bsf PORTC,2 ; end RD
;*#IF _XTAL>12000000
nop
nop
;*#ENDIF
bsf PORTC,3 ; disable chip
movlw 0x03
andwf r25,1 ; Mask Bits
CPFSEQ r25
;*#IF _SIM=0
bra Gstatus_check1 ; not ready
;*#ENDIF
clrf WREG ; Akkumulator loeschen
clrf TRISD ; make output port
return
in dem Teil zwischen den "+++" geht es um das eigentliche Problem. Ich messe an RD0 und RD1 5V, aber an RB0 liegt keine Spannung an. Demzufolge hat auch "r25" den Inhalt 0x00 und die Statusabfrage läuft immer in Endlosschleife. Obwohl die richtigen Signale anliegen, es muss an der Pinabfrage liegen. Ich bin der Meinung ich habe an alles gedacht (TRISD auf FF, PORTD in WREG). Aber irgendwo muss ja ein fehler sein. Kann mir jemand helfen?
Ich bin dabei ein GLCD (mit T6963C) anzusteuern. Dazu verwende ich den oben genannten PIC, da es ein CAN Teilnehmer sein soll. Die Steuerleitungen sind an Port C angeschlossen und die Datenleitungen (D0...D7) sind nun RD0...RD7
um etwas zum display zu senden muss ich vorher den status abfragen. nun schon mein problem. hier mal alle benötigten auszüge aus meinem Quelltext:
LIST P=18F4685 ;directive to define processor
#include <P18F4685.INC> ;processor specific variable definitions
;************************************************* *****************************
;Configuration bits
; Oscillator Selection:
CONFIG OSC=IRCIO7 ;intern
CONFIG WDT=OFF ;no Watchdog
CONFIG CP0=OFF ;code protect off
CONFIG PBADEN=OFF ;Port A as I/O
CONFIG LVP=OFF ;low voltage programming
;************************************************* *****************************
;Variable definitions
CBLOCK 0x080
WREG_TEMP ;variable used for context saving
STATUS_TEMP ;variable used for context saving
BSR_TEMP ;variable used for context saving
ENDC
CBLOCK 0x000
EXAMPLE ;example of a variable in access RAM
ENDC
UDATA_ACS
r24 RES 1 ;8bit zwischenspeicher
r25 RES 1 ;8bit zwischenspeicher
r20 RES 1 ;8bit zwischenspeicher
r21 RES 1 ;8bit zwischenspeicher
r30 RES 1 ;8bit zwischenspeicher
r31 RES 1 ;8bit zwischenspeicher
Frage 1: ist das mit den Variablendeklarationen so richtig? (RES1)
Init:
bsf RCON, IPEN
bsf INTCON, GIEH
bsf INTCON, GIEL
movlw 0x70 ; maximale interne Frequenz 8MHz setzen
movwf OSCCON
clrf WREG ; Akkumulator loeschen
movwf TRISD ; PortD als Ausgang definieren
movwf TRISC ; PortC als Ausgang definieren
movwf TRISB ; PortB als Ausgang definieren
rcall Set_Display
rcall Clear_Text
Main:
; *** main code goes here ***
ORG 0x0100
rcall Init ;Initialisieren
................................
Hier die eigentlich wichtige Funktion, sie wird von Set_Display aufgerufen:
Gstatus_check:
bsf PORTC,4 ; command
movlw 0xFF ; make port an input
movwf TRISD
Gstatus_check1:
bcf PORTC,2 ; RD low
;*#IF _XTAL>12000000
nop
nop
;*#ENDIF
bcf PORTC,3 ; Enable Chip
nop
nop
nop
;*#IF _XTAL>12000000
nop
nop
nop
;*#ENDIF
+++++++++++++++++++++++++++++++++++++
movf PORTD,0 ; get status
movwf PORTB
movwf r25
+++++++++++++++++++++++++++++++++++++
;*#IF _XTAL>12000000
nop
nop
;*#ENDIF
bsf PORTC,2 ; end RD
;*#IF _XTAL>12000000
nop
nop
;*#ENDIF
bsf PORTC,3 ; disable chip
movlw 0x03
andwf r25,1 ; Mask Bits
CPFSEQ r25
;*#IF _SIM=0
bra Gstatus_check1 ; not ready
;*#ENDIF
clrf WREG ; Akkumulator loeschen
clrf TRISD ; make output port
return
in dem Teil zwischen den "+++" geht es um das eigentliche Problem. Ich messe an RD0 und RD1 5V, aber an RB0 liegt keine Spannung an. Demzufolge hat auch "r25" den Inhalt 0x00 und die Statusabfrage läuft immer in Endlosschleife. Obwohl die richtigen Signale anliegen, es muss an der Pinabfrage liegen. Ich bin der Meinung ich habe an alles gedacht (TRISD auf FF, PORTD in WREG). Aber irgendwo muss ja ein fehler sein. Kann mir jemand helfen?