J'essaye de communiquer un pic18f24k50 avec un arduino 101. J'utilise deux lignes pour établir une communication synchronisée. À chaque changement de bas en haut de la première ligne, j'ai lu la valeur de la deuxième ligne. Je n'ai aucun problème avec le code arduino, mon problème est que dans l'image, le changement d'Interrupt on se déclenche lors du second changement de bas en haut au lieu de se déclencher lors du premier changement. Cela n'arrive que la première fois que j'envoie des données, après cela, cela fonctionne parfaitement (il se déclenche dès le premier changement et je reçois l'octet correctement). Désolé pour mon anglais, je vais essayer de me expliquer mieux avec cette image:pic Interruption sur le changement ne déclenche pas la première fois
canal 1 est le signal d'horloge, channel2 est les données (Im envoie un octet pour le moment, avec des valeurs de bits 10101010). Le canal 4 est une sortie que je change chaque fois que je traite un peu. (comme vous pouvez le voir, il commence à la deuxième hausse du signal d'horloge au lieu du premier). Ceci est capturé sur le premier octet envoyé, les suivants fonctionnent bien.
je poste le code correspondant dans la photo ici:
C'est là que j'initialise choses:
TRISCbits.TRISC6 = 0;
TRISCbits.TRISC1 = 1;
TRISCbits.TRISC2 = 1;
IOCC1 = 1;
ANSELCbits.ANSC2=0;
IOCC2 = 0;
INTCONbits.IOCIE = 1;
INTCONbits.IOCIF = 0;
Et c'est le code d'interruption:
void interrupt SYS_InterruptHigh(void)
{
if (INTCONbits.IOCIE==1 && INTCONbits.IOCIF==1)
{
readByte();
}
}
void readByte(void)
{
while(contaBits<8)
{
INTCONbits.IOCIE = 0;
INTCONbits.IOCIF = 0;
while (PORTCbits.RC1 != HIGH)
{
}
if (PORTCbits.RC1 == HIGH)
{
LATCbits.LATC6 = !LATCbits.LATC6;
//LATCbits.LATC6 = ~LATCbits.LATC6;
switch (contaBits)
{
case 0:
if (PORTCbits.RC2 == HIGH)
varByte.b0 = 1;
else
varByte.b0 = 0;
break;
case 1:
if (PORTCbits.RC2 == HIGH)
varByte.b1 = 1;
else
varByte.b1 = 0;
break;
case 2:
if (PORTCbits.RC2 == HIGH)
varByte.b2 = 1;
else
varByte.b2 = 0;
break;
case 3:
if (PORTCbits.RC2 == HIGH)
varByte.b3 = 1;
else
varByte.b3 = 0;
break;
case 4:
if (PORTCbits.RC2 == HIGH)
varByte.b4 = 1;
else
varByte.b4 = 0;
break;
case 5:
if (PORTCbits.RC2 == HIGH)
varByte.b5 = 1;
else
varByte.b5 = 0;
break;
case 6:
if (PORTCbits.RC2 == HIGH)
varByte.b6 = 1;
else
varByte.b6 = 0;
break;
case 7:
if (PORTCbits.RC2 == HIGH)
varByte.b7 = 1;
else
varByte.b7 = 0;
break;
}
contaBits++;
}
}//while(contaBits<8)
INTCONbits.IOCIE = 1;
contaBits=0;
}
LATCbits.LATC6 =! LATCbits.LATC6; < - c'est la ligne correspondant au canal 4.
RC1 est le canal 1 et RC2 est le canal 2
Ma question est ce que je fais mal, pourquoi le premier envoyé d'octets l'interruption doesn » t déclenche le premier changement de la ligne 1?
Merci.
Où est ce "code d'interruption" placé? Il semble que ce soit dans votre boucle while, plutôt que dans un vecteur d'interruption. Votre commutateur de cas est une partie du code répétitif. En outre, cette question pourrait mieux sur EE.SE ou Arduino.SE. – Paul
Vous pouvez également utiliser UART/série, ce qui est idéal pour la communication entre les microcontrôleurs. – Paul
La photo traite un écran de leds, le rafraîchissant tout le temps. – takluiper