PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PIC16F876A und I2C



NickiW
16.04.2007, 01:42
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

kalledom
16.04.2007, 02:01
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'.

NickiW
16.04.2007, 09:21
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.

Benedikt.Seidl
16.04.2007, 12:55
oder du deinen code, dann können wir schaun, was du falsch gemacht hast.

SEIDL.

NickiW
16.04.2007, 13:22
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.

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

Benedikt.Seidl
16.04.2007, 13:48
*datenblatt (http://ww1.microchip.com/downloads/en/DeviceDoc/39582b.pdf) 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! :-/

NickiW
16.04.2007, 14:33
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...

NickiW
16.04.2007, 15:09
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.