-
        

Ergebnis 1 bis 6 von 6

Thema: 18f4685 Problem PortD einlesen

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.03.2006
    Ort
    WOB
    Beiträge
    630

    18f4685 Problem PortD einlesen

    Anzeige

    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:

    Code:
    	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)

    Code:
    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:

    Code:
    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?
    Gruß Thomas \/

    Alles über AVR, PIC und CAN
    blog.cc-robotics.de

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.03.2006
    Ort
    WOB
    Beiträge
    630
    hat denn keiner eine Idee???

    ist das Porteinlesen denn korrekt:

    Code:
    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...
    Gruß Thomas \/

    Alles über AVR, PIC und CAN
    blog.cc-robotics.de

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    30.09.2006
    Ort
    Hamburg
    Alter
    35
    Beiträge
    989
    hm beim Portd wie auch beim PortA must du die ports auf digital umschalten
    Legastheniker on Bord !

    http://www.Grautier.com - Projektseite
    http://www.grautier.com/wiki/doku.php?id=bt-index - BT-BUS

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.03.2006
    Ort
    WOB
    Beiträge
    630
    aha, und wie geht das?
    Gruß Thomas \/

    Alles über AVR, PIC und CAN
    blog.cc-robotics.de

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.03.2006
    Ort
    WOB
    Beiträge
    630
    habe das cmcon auf 0x07 gesetzt, aber das ist nicht das Problem.
    Habe nun ein ganz einfaches Programm geschrieben:

    Code:
    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
    Gruß Thomas \/

    Alles über AVR, PIC und CAN
    blog.cc-robotics.de

  6. #6
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    66
    Beiträge
    10.970
    Hallo T.J.!

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

    MfG

Berechtigungen

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