Archiv verlassen und diese Seite im Standarddesign anzeigen : PIC16F876A und I2C
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'.
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.
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! :-/
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...
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.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.