Pages: [1]   Go Down
Author Topic: PCB ARDUINO DUEMILANOVE I2C AVEC PIC 16F877  (Read 1202 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,
Après des jours d'acharnement, je ne parviens pas a faire communiquer un pic 16f877 avec la carte Arduino 2009 en I2C. le PIC 16F877 est programmé en assembleur via MPLAB, j'arrive a envoyer des trames I2C etc depuis le pic 16F877... mais la carte Arduino ne réponds jamais, ni aux ACK,ni a aucune instructions que j'envoie. Je voudrais les faire communiquer ensemble. Je n'arrive meme pas a faire allumer une DEL sur la Carte Arduino...
LePIC 16F877 est en I2C Maitre et l'Arduino en Esclave... Pouvez vous me donner un petit coup de main SVP. Merci
Logged

Biganos
Offline Offline
Sr. Member
****
Karma: 0
Posts: 356
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut
Tiens je viens de trouver ça : http://sushi-number1.blogspot.fr/2011/12/i2c-et-arduino.html

A+
chabot380
Logged

ORDINAUSORE 2Ghz AMD64 QUI S'ALLUME EN 48 SECONDES AVEC UBUNTU 12.04
ARDUINO UNO / Shield Ethernet / RTC DS1307
Programmation Python et j'apprends le C
Technicien Télé Vidéo à la retraite.

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci mais c'est pour 2 arduino. j'ai besoin d'un escalve arduino programmé en C et un maitre programmé en assembleur.
@+
Logged

France
Offline Offline
Faraday Member
**
Karma: 52
Posts: 5341
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Merci mais c'est pour 2 arduino. j'ai besoin d'un escalve arduino programmé en C et un maitre programmé en assembleur.
Déjà vérifie que ton code "maitre" fonctionne avec un module I2C bien connu, exemple DS1307 ou autre.

Pour la partie esclave voila un guide pas à pas pour faire un esclave I2C en arduino :
http://www.dsscircuits.com/articles/arduino-i2c-slave-guide.html
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

merci de votre réponse, mon code I2C sur le PIC fonctionne bien, il communique avec un DS1307 (horloge), le seul prb est que l'Arduino ne répond pas, je regarde au lien reçu et je vous tiens au courant.
MERCIIIIIIII
@+
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

suite...
L'anglais et moi, c'est pas trop top...
Par contre, j'ai bien mon oscilloscope de connecté sur le bus en SDA et SCL, j’envoie un I2C_Start depuis mon programme en assembleur, je voit bien la trame qui correspond au 0x29 sur le bus SDA. Je fais un read juste après et je ne reçoit que des un sur les 8 bits.
De plus, l'Arduino esclave ne répond pas à mes ack_slave_to_master de ma librairie I2C... et fait tourner en rond mon programme. Du coup, j'ai viré le ACK mais toujours les même prb...
Merci de votre retour
@+
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

bon, mes fonctions I2C Fonctionnent bien sur le PIC16f877 car j'arrive à configurer, à lire un PCF8574 et un pcf9551 (gestion de DEL et de BP en I2C) et tout marche... je ne comprend pas pourquoi la PCB Arduino 2009 ne repond pas...
SVP Aidez moi
MERCIIIIIIIIIIIIIIIII
Logged

Bretagne
Offline Offline
Full Member
***
Karma: 1
Posts: 191
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

.....j'ai besoin d'un escalve arduino programmé en C .....


voilà un Arduino esclave pour l'I2C programmé en C.
http://arduino.cc/en/Tutorial/MasterWriter
Logged

...ils embarquèrent la logique, coupèrent les cordons, alors, libérés de leurs chaînes, une immensité s'ouvrait devant eux...

Biganos
Offline Offline
Sr. Member
****
Karma: 0
Posts: 356
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Peux-tu nous faire voir le sketch de ton arduino ?

Merci
A+
Logged

ORDINAUSORE 2Ghz AMD64 QUI S'ALLUME EN 48 SECONDES AVEC UBUNTU 12.04
ARDUINO UNO / Shield Ethernet / RTC DS1307
Programmation Python et j'apprends le C
Technicien Télé Vidéo à la retraite.

Ales
Offline Offline
Faraday Member
**
Karma: 29
Posts: 3186
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

J'avais eu le soucis pour communiquer avec des picaxes (ce sont des pics de base aussi donc peut-être que le bug est le même) : je ne me souviens plus exactement du bug mais de mémoire le picaxe utilise une adresse avec un bit en moins, donc dans mon cas le picaxe était esclave et il fallait que je divise par 2 l'adresse côté picaxe (1 bit en moins quoi).

EDIT : j'ai retrouvé le post qui avait résolu mon problème http://letsmakerobots.com/node/20787 donc côté arduino, l'adresse du picaxe était 80 tandis que sur l'arduino (maitre) c'était 160. Je suppose que ça doit être la même chose si on inverse les rôles.
« Last Edit: December 23, 2012, 01:22:04 pm by B@tto » Logged


Bretagne
Offline Offline
Full Member
***
Karma: 1
Posts: 191
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonsoir,


Oui B@tto , bonne piste, mais plutôt l'inverse. La librairie Wire nécessite l'adresse sur les 7 bits de poids fort, et Picaxe comme Cubloc et d'autres,  sur une adresse de 8 bits .

A tester:  côté Arduino    l'esclave impose l'adresse, par exemple     Wire.begin(32);
              côté  Chip   maître, l'adresse sera  64  en Dec  ( si le programme du Pic est prévu sur une adresse de 8bits !!)
concrètement, sur le bus circule l'adresse 64 (ou 65).

La tambouille interne de la librairie Wire va convertir en 8 bits avec un bit de poids faible à 1 pour un Read ou à zéro pour un write

"There are both 7- and 8-bit versions of I2C addresses. 7 bits identify the device, and the eighth bit determines if it's being written to or read from. The Wire library uses 7 bit addresses throughout. If you have a datasheet or sample code that uses 8 bit address, you'll want to drop the low bit (i.e. shift the value one bit to the right), yielding an address between 0 and 127. "

Edit:
Ce n'est pas le statut esclave ou maître, qui impose cette différence, mais la conception de la librairie Wire.
« Last Edit: December 23, 2012, 03:43:39 pm by papybricol » Logged

...ils embarquèrent la logique, coupèrent les cordons, alors, libérés de leurs chaînes, une immensité s'ouvrait devant eux...

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset



bonjour à tous, merci pour vos réponses
Je voudrais juste allumer un DEL sur la réception d'une commande, apres je pense y arriver...

Voila le code Arduino

// SLAVE RECEIVER
#include <Wire.h>

void setup()
{
  Wire.begin(4);                // join i2c bus with address #4
  Wire.onReceive(receiveEvent); // register event
  Serial.begin(9600);           // start serial for output
}

void loop()
{
  delay(100);
}

// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany)
{
  while(1 < Wire.available()) // loop through all but the last
  {
    char c = Wire.read(); // receive byte as a character
    Serial.print(c);         // print the character
  }
  int x = Wire.read();    // receive byte as an integer
  Serial.println(x);         // print the integer

  pinMode(13,OUTPUT);
  digitalWrite(13,HIGH);

}
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Encore un petit coup de main ...
comment choisir qu'elles DEL allumer suivant l'adresse envoyée par le maitre ???
Merci d'avance
Logged

Pages: [1]   Go Up
Jump to: