Go Down

Topic: PCB ARDUINO DUEMILANOVE PLANTE (Read 807 times) previous topic - next topic

arnaudf09

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








B@tto

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
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

arnaudf09

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

B@tto

Ton programme devrait plus ressembler à ça :

Code: [Select]
#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;
 
}
}
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

fdufnews

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.

B@tto

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
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

arnaudf09

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

arnaudf09

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

Go Up