PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 18f4685 Problem PortD einlesen



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?

T.J.
14.04.2007, 19:13
hat denn keiner eine Idee???

ist das Porteinlesen denn korrekt:


movf PORTD,0 ; get status
movwf PORTB
movwf r25
???

Muss ich bei der config was besonderes beachten, wenn ich PortD auslesen will?

Ich komm nur wegen den 3 Zeilen nicht weiter... #-o

theborg
14.04.2007, 20:14
hm beim Portd wie auch beim PortA must du die ports auf digital umschalten

T.J.
14.04.2007, 22:25
aha, und wie geht das?

T.J.
16.04.2007, 20:00
habe das cmcon auf 0x07 gesetzt, aber das ist nicht das Problem.
Habe nun ein ganz einfaches Programm geschrieben:



Init:
movlw 0x70 ; maximale interne Frequenz 8MHz setzen
movwf OSCCON
movlw 0x07
movwf CMCON
movlw 0x0F
movwf ADCON1

movlw 0xFF
movwf TRISC ; PortC als Eingang definieren
clrf TRISD ; PortD als Ausgang definieren
clrf TRISE
clrf LATC
return

Main:
; *** main code goes here ***
ORG 0x0100

rcall Init ;Initialisieren

Main_:

movf PORTD,0 ; get status
clrf LATD
BTFSS LATC,0
setf LATD

goto Main_

return


theoretisch überspringt er das setf LATD, wenn an RC0 5V anliegen. Aber es überspringt den Befehl nie. Irgendwie erkennt der PIC nicht, was an den Eingängen anliegt. HILFEEEEE 8-[

PICture
04.05.2007, 19:12
Hallo T.J.!

Ist es ja laut Deinem Code richtig. Um ein Zustand der Portpins einzulesen, musst Du PORTC und nicht LATC benutzen.

MfG