bobboteck
2007-07-19 18:34:37 UTC
Hi guys,
sto perdendo un po di tempo dietro l'I2C, come al solito la mia
configurazione è una RB2.1 con 18F4620 che funziona da Master, provato
con una 24LC16 e le routine di scrittura e lettura funzionano.
Poi ho una RB2.0 con 18F4431, le due schede hanno in comune
l'alimentazione e i collegamenti tra RC4 e RC5 per l'I2C.
Quello che volevo fare per verificare se funzionava era scrivere dal
master un byte (0b00000001 o 0b00000010 o 0b00000100) che poi andavo a
scrivere sulla PORTE per far accendere un singolo LED, ma altre prove
che ho fatto sembra che non entri nel controllo "if(SSPSTATbits.BF==1)"
come se non ricevesse niente.
Di seguito riporto il codice usato, magari c'è qualcuno che avuto
esperienze in merito e sa darmi qualche consiglio!
Bobbo
#include <p18f4431.h>
#include <delays.h>
#include <i2c.h>
#pragma config OSC=HSPLL // Oscillatore PLL 4x attivo
#pragma config WDTEN=OFF // Whatch dog disattivato
#pragma config PWRTEN=ON // Power UP timer abilitato
#pragma config LVP=OFF // Programmazione LVP disabilitata
#pragma config BOREN=OFF // Brown out Reset disabilitato
#pragma config BORV=42 // Tensione per Brown out Reset 4.2 Volt
#pragma config PWM4MX=RB5 // RB5 = PWM4
#pragma config SSPMX=RC7 // SOLO PER 40pin, imposta RC4 e RC5 per l'I2C
perchè sono multiplexati
#define LedRosso PORTEbits.RE2 // Led Rosso
#define LedGiallo PORTEbits.RE1 // Led Giallo
#define LedVerde PORTEbits.RE0 // Led Verde
void initRB(void);
void lampeggio(void);
void main(void)
{
unsigned char dato;
// PINs Initial State
PORTA=0x00;
PORTB=0x00;
PORTC=0x00;
PORTD=0x00;
PORTE=0x00;
// PINs Direction
TRISA=0b00000000; // NOT USED NOW
TRISB=0b00000000; // RB0,RB1,RB2,RB3 (OUT)
TRISC=0b00111000; // RC4,RC5 (IN), RC3 è configurato come (IN)
solo per sfruttare il connettore I2C della scheda,
// inquanto la piedinatura del 4431 non corrisponde con quella su
cui è basata la RB2.0. Per il
// funzionamento corretto creo un ponticello tra RC3 e RC5 per
questo è meglio che RC3 sia un (IN)
TRISD=0x00; // NOT USED NOW
TRISE=0xF0; // LED
INTCON=0; // Clear Interrupt
ANSEL0=0x00; // PORTA e PORTE settate come ingressi digitali.
ANSEL1=0x00;
SSPADD=0x80; // Indirizzo della periferica
SSPCON=0b00110110; // Abilita I2C, generazione del clock, in
modalità 7 bit SLAVE
lampeggio();
while(1)
{
if(SSPSTATbits.BF==1)
{
SSPCONbits.SSPOV=0;
//PORTE=0x00;
dato=SSPBUF;
if(SSPSTATbits.D_A==1)
{
PORTE=dato;
}
}
}
}
sto perdendo un po di tempo dietro l'I2C, come al solito la mia
configurazione è una RB2.1 con 18F4620 che funziona da Master, provato
con una 24LC16 e le routine di scrittura e lettura funzionano.
Poi ho una RB2.0 con 18F4431, le due schede hanno in comune
l'alimentazione e i collegamenti tra RC4 e RC5 per l'I2C.
Quello che volevo fare per verificare se funzionava era scrivere dal
master un byte (0b00000001 o 0b00000010 o 0b00000100) che poi andavo a
scrivere sulla PORTE per far accendere un singolo LED, ma altre prove
che ho fatto sembra che non entri nel controllo "if(SSPSTATbits.BF==1)"
come se non ricevesse niente.
Di seguito riporto il codice usato, magari c'è qualcuno che avuto
esperienze in merito e sa darmi qualche consiglio!
Bobbo
#include <p18f4431.h>
#include <delays.h>
#include <i2c.h>
#pragma config OSC=HSPLL // Oscillatore PLL 4x attivo
#pragma config WDTEN=OFF // Whatch dog disattivato
#pragma config PWRTEN=ON // Power UP timer abilitato
#pragma config LVP=OFF // Programmazione LVP disabilitata
#pragma config BOREN=OFF // Brown out Reset disabilitato
#pragma config BORV=42 // Tensione per Brown out Reset 4.2 Volt
#pragma config PWM4MX=RB5 // RB5 = PWM4
#pragma config SSPMX=RC7 // SOLO PER 40pin, imposta RC4 e RC5 per l'I2C
perchè sono multiplexati
#define LedRosso PORTEbits.RE2 // Led Rosso
#define LedGiallo PORTEbits.RE1 // Led Giallo
#define LedVerde PORTEbits.RE0 // Led Verde
void initRB(void);
void lampeggio(void);
void main(void)
{
unsigned char dato;
// PINs Initial State
PORTA=0x00;
PORTB=0x00;
PORTC=0x00;
PORTD=0x00;
PORTE=0x00;
// PINs Direction
TRISA=0b00000000; // NOT USED NOW
TRISB=0b00000000; // RB0,RB1,RB2,RB3 (OUT)
TRISC=0b00111000; // RC4,RC5 (IN), RC3 è configurato come (IN)
solo per sfruttare il connettore I2C della scheda,
// inquanto la piedinatura del 4431 non corrisponde con quella su
cui è basata la RB2.0. Per il
// funzionamento corretto creo un ponticello tra RC3 e RC5 per
questo è meglio che RC3 sia un (IN)
TRISD=0x00; // NOT USED NOW
TRISE=0xF0; // LED
INTCON=0; // Clear Interrupt
ANSEL0=0x00; // PORTA e PORTE settate come ingressi digitali.
ANSEL1=0x00;
SSPADD=0x80; // Indirizzo della periferica
SSPCON=0b00110110; // Abilita I2C, generazione del clock, in
modalità 7 bit SLAVE
lampeggio();
while(1)
{
if(SSPSTATbits.BF==1)
{
SSPCONbits.SSPOV=0;
//PORTE=0x00;
dato=SSPBUF;
if(SSPSTATbits.D_A==1)
{
PORTE=dato;
}
}
}
}