RS232 => X10 на PIC

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Встал на лапы
Сообщения: 91
Зарегистрирован: Чт сен 13, 2007 16:44:46
Откуда: Минск

Сообщение Aleksis »

Собираю устройство, которое по RS232 получает 6 байт и передает их в сеть X10. Возникла такая проблема. Если отключить функции связанные с RS232 и просто передавать по X10 заранее прошитые данные - работает. Если отключить функции X10 и оставить обмен по RS232 - тоже работает. Вместе - нет. Ничего не передает по X10 и никак не реагирует на RS232. Подскажите, пожалуйста, в чем может быть дело. Контроллер PIC16F684. Среда разработки - microC.

Код: Выделить всё

unsigned short i, data;
unsigned long send, w1, w2;

void interrupt() {
  if (INTCON.INTF) {
    OPTION_REG.INTEDG = ~OPTION_REG.INTEDG;
    if (send&0x200000) {
      TRISC.F5 = 0;
      Delay_us(1000);
      TRISC.F5 = 1;
    }
    send = send << 1;
    if (i!=0) {
      i--;
    }
    INTCON.INTF = 0;
  }
}

void X10Send () {

  INTCON = 0x90;

  INTCON.INTE = 0;
  i = 22;
  send = w1;
  INTCON.INTE = 1;

  while(i!=0) {
  }

  INTCON.INTE = 0;
  i = 22;
  send = w1;
  INTCON.INTE = 1;

  while(i!=0) {
  }

  INTCON.INTE = 0;
  i = 6;
  send = 0;
  INTCON.INTE = 1;

  while(i!=0) {
  }

  INTCON.INTE = 0;
  i = 22;
  send = w2;
  INTCON.INTE = 1;

  while(i!=0) {
  }

  INTCON.INTE = 0;
  i = 22;
  send = w2;
  INTCON.INTE = 1;

  while(i!=0) {
  }

  INTCON.INTE = 0;
  i = 6;
  send = 0;
  INTCON.INTE = 1;

  INTCON = 0x00;
}

void Delay_T1 () {
  Delay_us (417);
}

void Delay_T2 () {
  Delay_us (833);
}

void RS232_Init () {
  TRISA.F0 = 0;
  TRISA.F1 = 1;
}

void RS232_Write (char senddata) {

  // Start
  PORTA.F0 = 0;
  Delay_T2();

  // Data
  if (senddata.F0) PORTA.F0 = 1;
  else PORTA.F0 = 0;
  Delay_T2();
  if (senddata.F1) PORTA.F0 = 1;
  else PORTA.F0 = 0;
  Delay_T2();
  if (senddata.F2) PORTA.F0 = 1;
  else PORTA.F0 = 0;
  Delay_T2();
  if (senddata.F3) PORTA.F0 = 1;
  else PORTA.F0 = 0;
  Delay_T2();
  if (senddata.F4) PORTA.F0 = 1;
  else PORTA.F0 = 0;
  Delay_T2();
  if (senddata.F5) PORTA.F0 = 1;
  else PORTA.F0 = 0;
  Delay_T2();
  if (senddata.F6) PORTA.F0 = 1;
  else PORTA.F0 = 0;
  Delay_T2();
  if (senddata.F7) PORTA.F0 = 1;
  else PORTA.F0 = 0;
  Delay_T2();

  // Stop
  PORTA.F0 = 1;
  Delay_T2();
}

void RS232_Read (char *res) {
  char result;

  // Wait start
waitstart:
  if (PORTA.F1) goto waitstart;
  Delay_T1();
  if (PORTA.F1) goto waitstart;
  Delay_T2();

  // Data
  result.F0 = PORTA.F1;
  Delay_T2();
  result.F1 = PORTA.F1;
  Delay_T2();
  result.F2 = PORTA.F1;
  Delay_T2();
  result.F3 = PORTA.F1;
  Delay_T2();
  result.F4 = PORTA.F1;
  Delay_T2();
  result.F5 = PORTA.F1;
  Delay_T2();
  result.F6 = PORTA.F1;
  Delay_T2();
  result.F7 = PORTA.F1;
  Delay_T2();

  *res = result;
}


void main() {

//  OSCCON = 0x68;

  PORTA = 0;
  TRISA = 0xFF;
  ANSEL = 0;
  PORTC = 0;
  TRISC = 0xFF;
  CMCON0 = 0x07;

  RS232_Init();

  Pwm_Init(120000);         // Инициализация модуля PWM
  Pwm_Change_Duty(127);     // Установить скважность 50%
  Pwm_Start();          // Запуск PWM

  while(1) {
    data = 0xAA;
    RS232_Write(data);

    RS232_Read (&data);
    w1 = data << 16;

    RS232_Read (&data);
    w1 = w1 + data << 8;

    RS232_Read (&data);
    w1 = w1 + data;

    RS232_Read (&data);
    w2 = data << 16;

    RS232_Read (&data);
    w2 = w2 + data << 8;

    RS232_Read (&data);
    w2 = w2 + data;

    data = 0x55;
    RS232_Write(data);

    X10Send ();
  }
} //~!
Реклама
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»