1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
| #include "Configuration.h"
#include "TinyWireS.h"
/* ATTiny85 (Clock 20MHz)
+-\/-+
A0 PB5 1| |8 Vcc
A3 PB3 2| |7 PB2 D0 A1
A2 PB4 3| |6 PB1 D1
GND 4| |5 PB0 D2
+----+
*/
#define __AVR_ATtiny85__
// On déclare l'adresse de la LED de debug sur la pin 2
#define LED1_PIN PB3
// Simple compteur de test ...
byte count;
void setup()
{
// On rejoint le bus i2c en tant qu'esclave
TinyWireS.begin(I2C_ADRESS_SLAVE);
// A but de test
pinMode(LED1_PIN, OUTPUT);
count = 0;
}
void loop()
{
// Si on recoit quelque chose sur le bus I2C
if (TinyWireS.available()) {
byte header; // Premier bit : il s'agit du header (composé du nombre de byte à lire (3 bit) + du numero d'ordre (5 bit)
byte order; // Numero d'ordre : il s'agit d'une action que le µC dois faire
byte nbByteToRead;
// On recupere le header
header = TinyWireS.read();
// On recupere l'ordre et le nombre de byte à lire
nbByteToRead = I2C_HEADER_GET_NB_BYTES_TO_READ(header);
order = I2C_HEADER_GET_ORDER(header);
// On execute l'ordre envoyé
switch (order) {
case I2C_ORDER_ASK_NUMBER:
i2cDiscardRead(nbByteToRead, 100); // nbByteToRead devrait être égale à 0
delay(500); // Simulation d'un probleme de transmission : "normalement", le maitre i2c devrait "voir" que je n'ai pas encore fais les TinyWireS.write
TinyWireS.write(I2C_CREATE_HEADER(2, I2C_ORDER_GIVE_NUMBER));
TinyWireS.write(0);
TinyWireS.write(count);
// Limitation de count dans l'intervalle [0:100]
++count;
if (100 < count) {
count = 0;
}
break;
default:
// Ordre non pris en charge : On consumme tout
i2cDiscardRead(nbByteToRead, 100);
break;
}
}
}
#define DELAY_BETWEEN_READ_TENTATIVE 5 /* en milliseconde */
/* +------------------------------------------------------------------------------------+ */
/* | Tente de lire `nbReadToDiscard` byte pendant `timeout` millisecondes | */
/* +------------------------------------------------------------------------------------+ */
/* | [IN] Timeout : nombre de milliseconde avant d'être considéré en timeout | */
/* | [RETURN] true si nbReadToDiscard lu avant timeout, false sinon | */
/* +------------------------------------------------------------------------------------+ */
bool i2cDiscardRead(int nbReadToDiscard, int timeout)
{
for (int i = 0; i < nbReadToDiscard; ++i) {
if (!i2cRead(NULL, timeout)) {
Blink(LED1_PIN, 1000); // DEBUG (en cas d'erreur, led allumé pendant 1s)
return (false);
}
}
Blink(LED1_PIN, 20); // DEBUG
return (true);
}
/* +------------------------------------------------------------------------------------+ */
/* | Tente de lire un byte pendant `timeout` millisecondes | */
/* +------------------------------------------------------------------------------------+ */
/* | [OUT] result : byte lu | */
/* | [IN] Timeout : nombre de milliseconde avant d'être considéré en timeout | */
/* | [RETURN] true si byte lu avant timeout, false sinon | */
/* +------------------------------------------------------------------------------------+ */
bool i2cRead(byte *result, int timeout)
{
/* Attente de timeout milliseconde max */
while (!TinyWireS.available()) {
delay(DELAY_BETWEEN_READ_TENTATIVE);
timeout -= DELAY_BETWEEN_READ_TENTATIVE;
if (timeout <= 0) {
return (false);
}
}
/* Lecture */
if (result) {
result = TinyWireS.read();
} else {
TinyWireS.read();
}
return (true);
}
/* +------------------------------------------------------------------------------------+ */
/* | Blink une led via delay : pour but de test uniquement | */
/* +------------------------------------------------------------------------------------+ */
/* | [IN] led : port de la led | */
/* | [IN] duration : temps d'eclairage en millisecondes | */
/* +------------------------------------------------------------------------------------+ */
void Blink(byte led, int duration)
{
digitalWrite(led, HIGH);
delay(duration);
digitalWrite(led, LOW);
delay(duration);
} |
Partager