Planete Sciences

forums de Planete Sciences
It is currently Wed 23 Apr 2014, 21:32

All times are UTC + 1 hour [ DST ]




Post new topic Reply to topic  [ 4 posts ] 
Author Message
 Post subject: I2C Slave PIC18
PostPosted: Thu 05 Apr 2012, 15:26 
Offline

Joined: Mon 26 Mar 2012, 10:26
Posts: 2
Bonjour,
Je dois effectuer une communication I2C entre un afficheur LCD (piloté par un µproc ATMEGA) et un PIC 18F2550.
Le PIC 18F est configuré en esclave.
J'utilise le compilateur C18 avec MPLAB X et le programmeur Pickit 3.

Voici mon code

Quote:
//******** C18 *********************
#include <p18f2550.h>
#include <stdlib.h>
#include <stdio.h>

#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config MCLRE = OFF
#pragma config DEBUG = OFF
#pragma config FOSC = HS //Oscillateur externe
int i=0;
unsigned int value = 0;
unsigned int i2c_flag = 0 ;
int buffer = 0;
int addr ;
int select;
//Interuptions haut niveau => Pour I2C
void Interrupt_High(void);
#pragma code highVector=0x08 // on déclare que lors d'une interruption
void atInterrupthigh(void)
{
_asm GOTO Interrupt_High _endasm // on doit éxecuter le code de la fonction MyHighInterrupt
}
#pragma code // retour à la zone de code


#pragma interrupt Interrupt_High
void Interrupt_High(void)
{ // Check si on est entrée dans l'interrupt

LATCbits.LATC0 = 1 ;
if(PIR1bits.SSPIF == 1 && SSPSTATbits.BF == 1)
{
LATCbits.LATC1=1;
value = 300 ;

if(SSPCON1bits.SSPOV == 1)
{
SSPCON1bits.SSPOV = 0; //Clear overflow
}
addr = SSPBUF; // On vide le buffer

PIR1bits.SSPIF ==0;
SSPBUF = 153 ; // Envoie du premier octet
LATCbits.LATC1 = 0 ;
}
SSPCON1bits.CKP=1;
LATCbits.LATC0 = 0 ;
PIR1bits.SSPIF ==0;

}


void main(void){
INTCON=0b00000000; // INTERDIRE les interruption
TRISCbits.TRISC2 = 0; // Configurer les 3 LEDs en Sortie
TRISCbits.TRISC1 = 0;
TRISCbits.TRISC0 = 0;

TRISBbits.TRISB0 = 1; // Configurer broches I2C en entrées
TRISBbits.TRISB1 = 1;
ADCON1 = 0x0F; // Toutes les entrées sont digitales

// Initialisation
PORTC=0 ;
PIE1bits.SSPIE=1 ; // Autoriser interruption MSSP
IPR1bits.SSPIP=1; // Haute priorité
IPR2bits.BCLIP=0; // BUS collision basse priorité
PIE2 = 0; //desactivation des interruption bus collision
SSPADD=0x9A; // Adresse de l'esclave
SSPCON1=0b00110110;
SSPCON2=0b10000000;
SSPSTATbits.SMP=0; // High-speed mode
SSPSTATbits.CKE=0; // Mode I2C
INTCON=0b11000000; // autoriser les interruption (générales) et périphériques

while(1)
{
}
}


en réalité, la communication I2C fonctionne, cépendant j'essaye de configurer la trame pour qu'il y ait une interruption à chaque fois que le LCD fait une requète.
La première interruption marche trés bien, le probleme est que aprés il n'arrete pas d'entrer en interruption, même si le LCD ne comminuque plus. Du coup le principe d'interruption deviens inutile.

Sa fait plusieurs jours que je cherche une solution, sans resultats. La j'avoue que je n'arrive plus à comprendre, si quelqu'un à une solution à proposer ce serait génial.

Merci d'avance.


Top
 Profile  
 
 Post subject: Re: I2C Slave PIC18
PostPosted: Thu 05 Apr 2012, 15:30 
Offline

Joined: Mon 26 Mar 2012, 10:26
Posts: 2
Voici une image de la trame
(Jaune = SDA, Bleu = SCL, violet RC0, vert RC1)

Image


Top
 Profile  
 
 Post subject: Re: I2C Slave PIC18
PostPosted: Thu 05 Apr 2012, 16:37 
Offline

Joined: Mon 25 Jan 2010, 22:48
Posts: 387
Je vois une première erreur vraiment bête, tu va te taper toi-même !

à la dernière ligne de ta fonction Interrupt_High(void), tu as mis :
Mauvais code wrote:
PIR1bits.SSPIF ==0;


Enlève 1 "=" et ça ira mieux

bon code wrote:
PIR1bits.SSPIF = 0;


La prochaine fois, indente ton code sur le forum, ça facilitera la lecture de ceux qui veulent t'aider.

_________________
Équipe Poivron
Coupe 2012 : Équipe Poivron (73e)
Coupe 2011 : Équipe Poivron (122e) - Prix des équipes !
Coupe 2010 : Équipe Poivron (78e)

Passez voir le Portail des équipes


Top
 Profile  
 
 Post subject: Re: I2C Slave PIC18
PostPosted: Tue 17 Apr 2012, 00:03 
Offline
PMI
User avatar

Joined: Tue 20 Dec 2005, 16:00
Posts: 522
Location: Paris
Quote:
La prochaine fois, indente ton code sur le forum, ça facilitera la lecture de ceux qui veulent t'aider.

Tellement d'accord que j'ai même pas lu...

Je me pose juste la question en apparté, de la raison d'être d'un afficheur LCD qui soit i2c, master??

++

_________________
SwapadeG - Depuis 2006
2006 Golf:
2007 Robot Tri Party: Non homologué
2008 Mission to Mars:
2009 Temple of Atlantis:
2010 Feed The World:
2011 Chess'Up: 21ème
2012 Treasur Island: 55ème
2013 Happy birthday: 90ème


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 4 posts ] 

All times are UTC + 1 hour [ DST ]


Who is online

Users browsing this forum: Bing [Bot], Gérard68 and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You can post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group