RS232 => X10 на PIC
Добавлено: Ср окт 06, 2010 18:59:25
Собираю устройство, которое по 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 ();
}
} //~!