int RecvRC5 (void)
/* recepteur RC5 bas niveau qui scrute le port relie au capteur et decode le signal
2 bits de start
1 bit de basculement
5 bits d adressage (type d appareil, TV, VCR etc...)
6 bits de commande (touches)
*/
{
uint32_t t;
uint8_t niv_entree, niv1, niv2; /* booleens - niveaux des deux demi plateaux constituant un bit */
uint8_t n;
uint16_t data;
t=0;
niv1=0;
niv2=0;
data = 0;
niv_entree=1;
/* attente pendant la duree d une trame d un front descendant (le signal issu du capteur est a 1 au repos) */
const unsigned long int tmax = 14*1778; //24892us = duree de 1 trame (environ 25ms donc)
while ( (niv_entree == 1) && (t<= tmax) )
{
if ( (PINC & 0b10000000) > 0) { niv_entree=1; } else { niv_entree=0; }
_delay_us(1);
t++;
}
/* si le signal parvient trop vite (< 2 bits) on en deduit qu on a pris le train en marche et on saute,
puisque lecture impossible de la trame en cours */
if (t < (889 * 2)) return t;
if (t > tmax) return 2; /* temps maxi ecoule, pas de signal reçu */
/* ici on se trouve juste un epsilon apres le basculement a 0 du premier bit de start (milieu de bit) */
_delay_us(444); /* duree de 1/4 bit */
for (n=1; n<=13; n++)
{
_delay_us(889); // duree de 1/2 bit
/* ici on se trouve au milieu du niveau du plateau du demi bit */
if ( (PINC & 0b10000000) == 0) { niv1 = 0; } else { niv1 = 1; }
_delay_us(889); // duree de 1/2 bit
/* ici on se trouve au milieu du second plateau du demi bit */
if ( (PINC & 0b10000000) == 0) { niv2 = 0; } else { niv2 = 1; }
/* ici on connait les valeurs des deux niveaux, on en deduit le sens de la transition (front montant ou descendant)*/
if (niv1 == niv2) { return 3; } // erreur de lecture, bit non valide
if ((niv1 == 1 ) && (niv2 == 0)) { data |= 0b00000001; }
data = data << 1;
}
data = data >> 1; // on rejette le dernier decallage (sans perte de bit puisque largeur data = 16 bits > )
rxCmd_IR = data & 0b0000000000111111;
rxAdr_IR = (data & 0b0000011111000000) >> 6;
bit_bascul_IR = (data & 0b0000100000000000) >> 11;
return 0;
}