Forum: Mikrocontroller und Digitale Elektronik PIC16F877A & PCF 8583


von Andre (Gast)


Lesenswert?

hey,

ich habe mal ne frage zum baustein. Ich bin nun schon über eine woche 
dabei den zum laufen zu bringen aber es klappt einfach net.

er bekommt anscheind keine verbindung, zeigt immer nur 255 an.

zur hardware:
pcf8583p
2x Pull 1,8k
22pf kerko ; wollte erstmal nur zum laufen bringen, daher kein 
trimmbaren
32,786khz
adresspin auf gnd


habe mir ne kleine platine gebaut, um somit alle möglichen kontaktfehler 
auszuschließen.

ich habe z.b. keine porbleme damit eine chipkarte zu beschreiben und zu 
lesen. würde mich also sehr über gute vorschläge freuen.

gruß
andré




   list p=16f877A

;*   PORTB:   O
;*      0 - LED
;*      1 -   LED
;*      2 - LED
;*      3 - LED
;*      4 - LED
;*      5 - LED
;*      6 - LED
;*      7 - LED

;*   PORTC:   I/O
;*      0 -
;*      1 -
;*      2 -
;*      3 - SCL
;*      4 - SDL
;*      5 -
;*      6 -
;*      7 -

; Taktquelle: 4 MHz

   #include <P16f877A.INC>

   __CONFIG   _PWRTE_ON & _WDT_OFF & _HS_OSC & _LVP_OFF


RXDATA       equ    0x30
loops      equ      0x35
loops2      equ      0x36
Sekunden   equ      0x37


org 0x00
Init
   bsf      STATUS, RP0
   movlw    B'00000000'      ; I/O
   movwf   TRISB
   bcf      STATUS, RP0
   clrf   PORTB
   clrf   RXDATA

;***************** I²C Einstellungen*******************************
   bsf    STATUS, RP0
   movlw   B'11111111'
    movwf   TRISC
   bcf     STATUS, RP0

   bsf      STATUS, RP0
   movlw   d'9'         ; auf 100 MHz
   movwf   SSPADD         ;
   bcf    STATUS, RP0

   movlw   B'00001000'      ; mastermode
   movwf   SSPCON         ;

   bsf    SSPCON, SSPEN   ; MSSP-Modul enable

;***************** ID auslesen ***********************
   call    i2c_on         ;

   movlw   0xA0         ; Uhr zum Schreiben adressieren
   call   i2c_tx         ;

   movlw   0x02         ; Datenbyte adressieren
   call   i2c_tx         ;

   movlw   d'20'         ; Sekunden schreiben
   call   i2c_tx         ;

   call   i2c_off         ; Bus freigeben

start
   movlw   0xA0         ; Uhr zum Schreiben adressieren
   call   i2c_tx         ;
   movlw   0x02         ; Datenbyte adressieren
   call   i2c_tx         ;
   call   i2c_off         ; Bus freigeben

;*********************** Lesen der Karte *************

    call    i2c_on          ; Bus aktiv
    movlw   0xA1          ; 1010 0001
    call    i2c_tx          ; Uhr zum lesen adressieren
   call    i2c_rx
    movfw   SSPBUF          ; I2C Empfangsregister auslesen
    movwf   RXDATA          ; Byte in Speicherzelle RXDATA retten
    call    i2c_off         ; Bus freigeben

   movfw   RXDATA         ;
   movwf   PORTB


goto start
;***I2C 
UNTERPROGRAMME********************************************************** 
**
;
; I2C-Bus im Master-Mode übernehmen
i2c_on  bcf     PIR1, SSPIF     ; SSPIF Bit löschen
        bsf     STATUS, RP0
        bsf     SSPCON2, SEN    ; Bus Übernahme anweisen
        bcf     STATUS, RP0
        goto    i2c_warte

; ein Byte aus W senden
i2c_tx
        movwf   SSPBUF          ; -> zum I2C-Slave übertragen
        goto    i2c_warte

;ein Byte vom Slave empfangen (nach SSPBUF)
i2c_rx
        bsf     STATUS, RP0
        bsf     SSPCON2, RCEN   ; Daten Empfang einschalten
        bcf     STATUS, RP0
        goto    i2c_warte

; I2C-Bus wieder freigeben
i2c_off
        bsf     STATUS, RP0
        bsf     SSPCON2, PEN    ; Bus Freigabe anweisen
        bcf     STATUS, RP0

i2c_warte
        btfss   PIR1, SSPIF     ; fertig?
        goto    i2c_warte       ; nein, noch nicht
        bcf     PIR1, SSPIF     ; ja, alles fertig, nun noch SSPIF 
zurücksetzen
        return


Wait
        movwf   loops

Wai
        movlw   .110           ; Zeitkonstante für 1ms
        movwf   loops2
Wai2    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

;***ENDE 
UNTERPROGRAMME**********************************************************

end

von labelohase (Gast)


Lesenswert?

Hi
bsf    SSPCON, SSPEN   ; MSSP-Modul enable
damit schaltest du den SPI Modus ein,
sspen nicht setzen
l-hase

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.