Я пытаюсь познакомиться с pic18f24k50 с arduino 101. Я использую две строки, чтобы установить синхронизированную связь. При каждом изменении от низкого к высокому в первой строке я читаю значение со второй строки. У меня нет проблем с кодом arduino, моя проблема в том, что на рис., Прерывание по смене триггеров на втором изменяет с низкого на высокий, а не на запуск при первом изменении. Это происходит только в первый раз, когда я отправляю данные, после чего он работает отлично (он запускается при первом изменении, и я получаю байт правильно). Извините за мой английский, я попытаюсь объяснить себя лучше с этим изображением:pic Прерывание при изменении не запускается в первый раз
Канал 1 является сигналом синхронизации, channel2 это данные (Im посылая один байт на данный момент, с битовыми значениями 10101010). Канал 4 - это выход, который я меняю каждый раз, когда обрабатываю бит. (как вы можете видеть, он начинается со второго повышения тактового сигнала вместо первого). Это фиксируется в первом отправленном байте, а остальные работают нормально.
я отправляю соответствующий код в картинке здесь:
Это где я инициализировать вещи:
TRISCbits.TRISC6 = 0;
TRISCbits.TRISC1 = 1;
TRISCbits.TRISC2 = 1;
IOCC1 = 1;
ANSELCbits.ANSC2=0;
IOCC2 = 0;
INTCONbits.IOCIE = 1;
INTCONbits.IOCIF = 0;
И это на код прерывания:
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; < - это линия, соответствующая каналу 4.
RC1 является канал 1 и RC2 является канал 2
Мой вопрос: что я делаю не так, почему на первый послал байт прерывания Безразлично» t триггеров при первом изменении строки 1?
спасибо.
Где находится этот «код прерывания»? Кажется, что он находится в вашем цикле while, а не в векторе прерывания. Переключатель вашего случая - это одна из основных частей повторяющегося кода. Кроме того, этот вопрос может поместиться лучше на EE.SE или Arduino.SE. – Paul
Вы также можете использовать UART/serial, что отлично подходит для связи между микроконтроллерами. – Paul
Pic обрабатывает экран светодиодов, обновляя его все время. У меня нет доступных портов UART :(, поэтому я попытался реализовать свой собственный «протокол», потому что информация, которую я должен отправить, довольно проста. – takluiper