- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 8 von 8

Thema: PIC16F876A und I2C

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    16.04.2007
    Beiträge
    6

    PIC16F876A und I2C

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,

    ich benutze einen PIC16F876A und möchte gerne Daten auf eine EEPROM SmartCard mit Atmel AT24C32SC Chip senden und dort speichern.
    Die SmartCard unterstützt I2C-Bus.
    Ich habe mich ziemlich genau an das I2C Beispiel von Sprut gehalten, doch bisher leider ohne Erfolg.
    Hat jemand Erfahrung, ob man bei einem 16F876A etwas anders machen muss als bei einem 16F876 oder wie man diese Smartcards ansprechen kann?
    Ich würde mich freuen wenn mir jemand von euch ein paar Tipps geben könnte.
    Vielen Dank

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.12.2005
    Ort
    Euskirchen-Großbüllesheim
    Alter
    74
    Beiträge
    2.063
    Hallo,
    der PIC 16F876A ist gleich dem 16F876; einziger Unterschied: das 'Brennen' des A-Typs geht anders und schneller.
    PIC 16F877A, die ich verwende, kann ich mit dem ICD 1 auch nicht brennen. Wegen dem A mußte ich mir extra den ICD 2 kaufen
    In Deinem Brenner-Programm muß der A-Typ anwählbar sein, sonst kannst Du ihn nicht 'brennen'.
    MfG Karl-Heinz
    HobbyElektronik hier klicken ....

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    16.04.2007
    Beiträge
    6
    Das brennen ist kein Problem ich bekomme nur den I2C Bus nicht ans laufen...Vielleicht kann jemand mal ein Assembler-Programm für den 16F876A posten in dem er den I2C Bus verwendet.

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    13.08.2005
    Beiträge
    195
    oder du deinen code, dann können wir schaun, was du falsch gemacht hast.

    SEIDL.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    16.04.2007
    Beiträge
    6
    Ok...bis jetzt soll das Programm folgendes machen: Wenn auf der angeschlossenen Folientastaur der Knopf 1 gedrückt wird, soll auf einer Smartcard über den I2C Bus eine 5 gespeichert werden.
    Die Tastaturabfrage funktioniert wunderbar, die hab ich schon durch LEDs getestet.
    Code:
            list p=16f876a 
    ;********************************************************** 
    ;*      Pinbelegung 
    ;*      ----------------------------------  
    ;*      PORTA:  0   LED 
    ;*              1   LED 
    ;*              2   LED   
    ;*      PORTB:  0  
    ;*              1   Keyboard 1 4 7 * 
    ;*              2   Keyboard 2 5 8 0 
    ;*              3   Keyboard 3 6 9 # 
    ;*              4   ---------I I I I 
    ;*              5   -----------+ I I 
    ;*              6   -------------+ I 
    ;*              7   ---------------+ 
    ;	PORTC:	3   SCL
    ;		4   SDA
    ;*  
    ;********************************************************** 
    ; 
    ;********************************************************** 
    ; Includedatei für den 16F876a einbinden 
            #include <P16f876a.INC> 
    
    ; Configuration festlegen 
    ; bis 4 MHz: Power on Timer, kein Watchdog, XT-Oscillator 
    
            __CONFIG        _PWRTE_ON & _WDT_OFF & _XT_OSC 
    ;************************************************************** 
    
    
    Init    bsf     STATUS, RP0     ; Bank 1 
    	movlw	0x06		; Digitalumschaltung
    	movwf	ADCON1
            movlw   D'11010111'     ; pull-up Widerstände ein ?
            movwf   OPTION_REG 
    	movlw	D'00000000'
    	movwf	INTCON 		;Interupts disable
            movlw	B'00000000'
    	movwf    TRISA          ; RA0 .. RA7 output 
            movlw   B'11110000'     ; RB1 .. RB3 output 
            movwf   TRISB 
    	movlw	B'00011000'	;RC3,4 inputs
    	iorwf	TRISC,f		;
    	movlw	d'2'		; Busgeschwindigkeit
    	movwf	SSPADD
            bcf     STATUS, RP0     ; Bank 0 
    	movlw	B'00001000'	;Mastermode
    	movwf	SSPCON
    	bsf	SSPCON,SSPEN	;I2C enable
            clrf    PORTA           ;  
            clrf    PORTB           ; 
    	clrf	PORTC 
    
    
    
    Main  
            call    Tastatur        ; Tastatur abfragen 
            goto    Main		; 
    
    
    ;**********************************************************  
    ; 
    ;Abfrage der 3x4-Tastatur 
    ; 
    ;********************************************************** 
    ; Festlegung der Spaltennummern 
    
    Row1    equ     1	        ;Keyboard 1 4 7 * 
    Row2    equ     2               ;Keyboard 2 5 8 0 
    Row3    equ     0               ;Keyboard 3 6 9 # 
      
    
    ; ist eine Taste gedrückt? und welche? 
    
    Tastatur                        ; Tastencode nach Taste 
                                    ; wenn keine Taste gedrückt dann Taste=0 
           ; movlw   0               ; W=0 
    
            bsf     PORTB, Row2 
            bsf     PORTB, Row3 
            bcf     PORTB, Row1 
            call    col1            ; 1. Spalte abfragen 
    
            bsf     PORTB, Row1 
            bcf     PORTB, Row2 
            call    col2            ; 2. Spalte 
    
            bsf     PORTB, Row2 
            bcf     PORTB, Row3 
            call    col3            ; 3. Spalte 
            return 
    
    col1 
    
            btfss   PORTB, 7 
            call   	Knopf1
            btfss   PORTB, 6 
            call	Knopf4 
            btfss   PORTB, 5 
            call	Knopf7
            btfss   PORTB, 4 
            call	Knopf11
            return 
    col2 
            btfss   PORTB, 7 
            call	Knopf2
            btfss   PORTB, 6 
            call 	Knopf5
            btfss   PORTB, 5 
            call	Knopf8
            btfss   PORTB, 4 
            call	Knopf0
            return 
    col3 
    
    	btfss   PORTB, 7 
            call	Knopf3
            btfss   PORTB, 6 
            call	Knopf6
            btfss   PORTB, 5 
            call	Knopf9
            btfss   PORTB, 4 
            call	Knopf12
            return 
    
    
    Knopf1
    	movlw	B'00000001'
    	movwf	PORTA
    	call	i2c_on
    	movlw	B'10100000'	;EEPROM Adresse
    	call	i2c_tx
    	movlw	0x00		;high Teil der Speicheradresse
    	call	i2c_tx
    	movlw	0x03		;low Teil der Speicheradresse
    	call	i2c_tx
    	movlw	0x05		;5 soll gespeichert werden
    	call	i2c_tx
    	call	i2c_off		;Bus freigabe
    	return
    
    Knopf2
    
    	return
    
    Knopf3
    
    	return
    
    Knopf4
    
    	return
    
    Knopf5
    
    	return
    
    Knopf6
    
    	return
    	
    
    Knopf7
    	return
    
    Knopf8
    	return
    
    Knopf9
    
    	return
    
    Knopf11
    	return
    
    Knopf0
    	return
    
    Knopf12
    
    	return
    
    
    ;*************I2C Unterprogramme**********************************************
    
    i2c_on
    	bcf	PIR1,SSPIF	;SSPIF Bit löschen
    	bsf	STATUS,RP0
    	bsf	SSPCON2,SEN	;Bus Übernahme
    	bcf	STATUS,RP0
    	goto	i2c_warte
    
    i2c_tx
    	movwf	SSPBUF		;zum I2C-Slave übertragen
    	goto	i2c_warte
    
    i2c_off	
    	bsf	STATUS,RP0
    	bsf	SSPCON,PEN	;Bus-Freigabe
    	bcf	STATUS,RP0
    	goto	i2c_warte
    
    
    i2c_rx
    	bsf	STATUS,RP0
    	bsf	SSPCON2,RCEN	;Receive enable
    	bcf	STATUS,RP0
    	goto	i2c_warte
    
    i2c_warte
    	btfss	PIR1,SSPIF
    	goto	i2c_warte
    	bcf	PIR1,SSPIF
    
    zurücksetzen
    	return
    
            end

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    13.08.2005
    Beiträge
    195
    *datenblatt anschau*

    fehler:
    movlw d'2' ; Busgeschwindigkeit
    movwf SSPADD

    das ist nicht die busgeschwindigkeit, sondern das I2C adressenregister. das register für die geschwindigkeit ist SPBRG

    desweiteren steht im datenblatt:
    (angaben in klammern von mir)

    Steps to follow when setting up a Synchronous Master
    Transmission:
    1. Initialize the SPBRG register for the appropriate
    baud rate (Section10.1 “USART Baud Rate
    Generator (BRG)”).
    2. Enable the synchronous master serial port by
    setting bits SYNC, SPEN and CSRC. [alle regiter TXSTA, bis auf SSPEN -> SSPCON]
    3. If interrupts are desired, set enable bit TXIE. [Register PIE1]
    4. If 9-bit transmission is desired, set bit TX9. [Register TXSTA]
    5. Enable the transmission by setting bit TXEN. [Register TXSTA]
    6. If 9-bit transmission is selected, the ninth bit
    should be loaded in bit TX9D. [Register TXSTA]
    7. Start transmission by loading data to the TXREG
    register.
    8. If using interrupts, ensure that GIE and PEIE
    (bits 7 and 6) of the INTCON register are set.


    damit sollte es jetzt klappen, oder? den code beim senden habe ich mir noch nicht angeschaut,..

    SEIDL. jetzt mathe lernen,.. juhuuu! :-/

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    16.04.2007
    Beiträge
    6
    Was du beschrieben hast ist zum Herstellen einer USART Verbindung mit der eine RS232 Schnittstelle gealiesiert werden kann.
    Für den I2C Bus im Mastermode ist das SSPADD das Register um den Faktor für die Taktteilung anzugeben wenn ich das richtig verstanden habe...

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    16.04.2007
    Beiträge
    6
    Ich hab den Fehler gefunden. Bei der Sprungmarke ic2_off wird das Bit PEN gesetzt. Ich hatte es im Register SSPCON gesetzt, es befindet sich aber in SSPCON2. Jetzt funktioniert alles. Trotzdem vielen Dank für die Hilfe.

Berechtigungen

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

Solar Speicher und Akkus Tests