PCB ARDUINO DUEMILANOVE PLANTE

Bonjour,
Je rencontre un prb avec une carte Arduino qui se bloque et m'oublige à faire un reset de la carte...
depuis un PIC 16f877a maitre, j'envoie des trames I2C à la carte. Dans un but de test, j'utilise des BP sur le maitre et des DEL sur l'arduino esclave.
Lorsque j'envoi la 1ere trame, tout ce passe bien, j'active un Bouton poussoir (BP) et la Del correspondant s'allume, idem pour le 2eme BP mais au 3eme, la carte ne relanche pas le SSPSTAT , R_W pour repasser le bus I2C à 1 et elle se bloque. Je ne comprend pas pourquoi... Pouvez vous m'aider SVP, cela fait des jours que je suis dessus...

Parti asssembleur pour le 16f877a, voila la routine
DEL3_I2C_ON
; DEL ORANGE
DEL3_ON
call I2C_start
movlw ARDUINO1_ADR
call I2C_write
movlw 0x35
call I2C_write
call I2C_stop
return

Pour l'arduino, voila la routine que j'utilise
en fichier joint car je n'arrive pas à la coller
merci de votre aide
cordialement
ARNAUD

I2C_AFA_V2012_1_13.ino (1.86 KB)

Deja je vois quelques soucis dans le code arduino : c'est un peu le foutoir, y'a des commande qui sont dans la loop, dans le onRequest ... Et surtout avec if(1<wire.available()) il va falloir 2 bytes dans le buffer pour déclencher la routine et pas qu'un. Enfin ta routine PIC n'est pas complète

Bonjour et merci pour votre réponse,
pouvez vous m'eclairer un peu, je suis debutant et j'ai encore du mal à programmer correctement.
pour la routine I2C, j'ai été obliger de retirer les
ACK car pas réponse de la carte arduino donc programme tournait en boucle dans le ACK Slave to master. pour la routine arduino, je suis néophyte, donc un peu d'aide serait la bienvenue
merci
ARNAUD F

Ton programme devrait plus ressembler à ça :

#include <Wire.h>

byte buffer;

void setup()
{
Serial.begin(9600);
  Wire.begin(0x52);   
pinMode(13,OUTPUT);
     pinMode(12,OUTPUT);
     pinMode(11,OUTPUT);
 Wire.onReceive(receiveEvent);   
}

void loop(){
}


void receiveEvent(int bytesReceived) {

buffer=Wire.receive();
Serial.print("Donnee recu : ");
  Serial.println(buffer);
switch (buffer) {
  
  case 0x40 :
  digitalWrite(13,HIGH);
  Serial.println("LED 1 ON");
  break;
  
  case 0x20 :
  digitalWrite(12,HIGH);
  Serial.println("LED 2 ON");
  break;
 
  case 0x35 :
  digitalWrite(13,LOW);
  Serial.println("LED 3 OFF");
  digitalWrite(12,LOW);
  Serial.println("LED 2 OFF");
  digitalWrite(11,LOW);
  Serial.println("LED 1 OFF");
  break;
  
}
}

Personnellement, j'éviterais les Serial.print dans les fonctions receiveEvent et requestEvent ou alors je les limiterais à 2 ou 3 caractères.
Lors d'une lecture on prend coup sur coup un event puis un request. Ce serais dommage de rater le request par ce qu'on est en train d'envoyer une chaine sur le port série pour la mise au point.

La je suis parti du principe qu'il n'y avait qu'un byte à recevoir, vu qu'il n'y a que 3 LED à commander ça laisse encore 252 commandes possibles xD

merci pour vos réponses, je test et je reviens vers vous
@+

Après Test, lors de l'envoi d'une 1ere trame I2C, je la voie a l'oscilloscope, mais juste après le Bus I2C reste à 0 et impossible de continuer car la carte se bloque et seul le reset de la carte Arduino permet de relancer les 2 programmes (celui du PIC 16f877A qui lui est bloqué sur bus libre ou non qui tourne en boucle et la carte Arduino est plantée). Le prb, c'est qu'elle ne libère pas le bus I2C en le faisant passer à 1.
Merci de vos retours
cordialement
Arnaud