В чём была проблема (кроме пайки)???mr_fany писал(а):...Проблема решена.
Контроллер для управления реле с ПК через COM порт
- Реклама
- Сообщения: 29
- Зарегистрирован: Пт мар 20, 2015 10:05:39
Перепрошил ПИК, как Вы посоветовали:
и добавил резисторы 20 кОм с каждой базы к GND.
Код: Выделить всё
SPBRG = 31;
TXEN = 1;
CREN = 1;
SPEN = 1;
SYNC = 0;
RCIF = 0;
TRISB = 0;
TRISC &= 0xF0;
TRISD = 0;
PORTB = 0;
PORTC &= 0xF0;
PORTC |= 0x0F;
PORTD = 0xFF;
и добавил резисторы 20 кОм с каждой базы к GND.
- Сообщения: 29
- Зарегистрирован: Пт мар 20, 2015 10:05:39
Дорогие эксперты, у меня все таки остались проблемы, точнее две.
1. Если сначала подключить COM порт потом питание, то МАХ начинает сильно греться. А если подключить наоборот, то все нормально.
2. После работы некоторое время ПИК начинает вести себя непонятно, т.е. в ответах на команды появляются лишние байты.
Вот прилагаю схему моего устройства (наконец нарисовал ее
).

Если в схеме нет проблем, могу и код прошивки выложить.
Пожалуйста помогите.
1. Если сначала подключить COM порт потом питание, то МАХ начинает сильно греться. А если подключить наоборот, то все нормально.
2. После работы некоторое время ПИК начинает вести себя непонятно, т.е. в ответах на команды появляются лишние байты.
Вот прилагаю схему моего устройства (наконец нарисовал ее
Если в схеме нет проблем, могу и код прошивки выложить.
Пожалуйста помогите.
Последний раз редактировалось mr_fany Пн мар 23, 2015 11:31:12, всего редактировалось 1 раз.
У вас обмотки реле ничем не зашунтированы?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Сообщения: 29
- Зарегистрирован: Пт мар 20, 2015 10:05:39
- Реклама
Если вы сначала подключаете СОМ-порт без подачи питания, вполне возможно что начинает течь ток через всроенные защитные диоды МАХа.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Сообщения: 29
- Зарегистрирован: Пт мар 20, 2015 10:05:39
Это только моё предположение.
Очевидно, не подавать Тх и Рх на МАХ пока не подано питание.
Очевидно, не подавать Тх и Рх на МАХ пока не подано питание.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Сообщения: 29
- Зарегистрирован: Пт мар 20, 2015 10:05:39
А других явных ошибок нет на схеме?
Я не могу понять, откуда появляется эхо (лишние байты в ответах от ПИКа)
Я не могу понять, откуда появляется эхо (лишние байты в ответах от ПИКа)
Накосячили чего-то в программе 
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Сообщения: 29
- Зарегистрирован: Пт мар 20, 2015 10:05:39
Вот весь код прошивки:
Код: Выделить всё
#include <htc.h>
#include <stdbool.h>
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config CP = OFF // FLASH Program Memory Code Protection bits (Code protection off)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low Voltage In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EE Memory Code Protection (Code Protection off)
#pragma config WRT = ON // FLASH Program Memory Write Enable (Unprotected program memory may be written to by EECON control)
#define _XTAL_FREQ 20000000
#define bit_is_set(flags, bit) ( ( flags ) & ( 1 << (bit) ) )
enum COMMANDS
{
CMD_STATUS = 1,
CMD_ACTION
};
void Initialize(void);
void SendByte(unsigned char Byte);
unsigned char ReceiveByte(void);
bool SendMessage (unsigned char * msg);
bool ReceiveMessage(unsigned char * );
#define RECEIVE_BYTES_COUNT 5
#define TO_SEND_BYTES_COUNT 6
void main(void)
{
Initialize();
unsigned char bytesReceived[RECEIVE_BYTES_COUNT] = {0};
unsigned char bytesToSend[TO_SEND_BYTES_COUNT] = {0};
bytesToSend[0] = 0x97;
bytesToSend[TO_SEND_BYTES_COUNT - 1] = 0xE9;
bool flag = false;
while(1==1)
{
flag = ReceiveMessage(bytesReceived);
if (!flag)
{
continue;
}
switch(bytesReceived[1])
{
case CMD_STATUS:
bytesToSend[1] = PORTD;
bytesToSend[2] = PORTC & 0x0F;
bytesToSend[2] |= ((PORTB & 0x0F) << 4);
bytesToSend[4] = bytesToSend[1] + bytesToSend[2];
SendMessage(bytesToSend);
break;
case CMD_ACTION:
PORTB = bytesReceived[2] & 0x0F;
break;
default:
break;
}
}
}
void Initialize(void)
{
SPBRG = 31;
TXEN = 1;
CREN = 1;
SPEN = 1;
SYNC = 0;
RCIF = 0;
TRISB = 0;
TRISC &= 0xF0;
TRISD = 0;
PORTB = 0;
PORTC &= 0xF0;
PORTC |= 0x0F;
PORTD = 0xFF;
}
void SendByte(unsigned char Byte)
{
while (!TXIF);
TXREG = Byte;
}
unsigned char ReceiveByte(void)
{
if (OERR)
{
CREN = 0;
CREN = 1;
}
while (!RCIF);
return RCREG;
}
bool SendMessage (unsigned char * msg)
{
for (int i = 0; i < TO_SEND_BYTES_COUNT; ++i)
{
SendByte(msg[i]);
}
return true;
}
bool ReceiveMessage(unsigned char * msg)
{
unsigned char checksum = 0;
unsigned char temp = 0;
int i;
CREN = 1;
while ((msg[0] = ReceiveByte()) != 0x97);
for (i = 1; i < RECEIVE_BYTES_COUNT; ++i)
{
if ((msg[i] = ReceiveByte()) == 0xE9)
{
break;
}
checksum += temp;
temp = msg[i];
}
CREN = 0;
if (i < 3 || i > RECEIVE_BYTES_COUNT)
{
return false;
}
if (checksum != msg[i - 1])
{
return false;
}
return true;
}
- Сообщения: 60
- Зарегистрирован: Пт янв 11, 2013 10:54:43
Есть, да и сама схема нарисована коряво!mr_fany писал(а):А других явных ошибок нет на схеме?
0.1мкФ на ножке сброса; 31,32 ноги должны быть подключены, к каждой паре ног питания по 0,1мкФ, на выходе DC-DC напрашивается 10мкФ; 0,1 для max может быть мало. Что коммутирует реле?
Для начала в программе инициализируйте всю периферию, все порты и т.д.mr_fany писал(а):Я не могу понять, откуда появляется эхо
Код: Выделить всё
if (!ReceiveMessage(bytesReceived))
{
switch(bytesReceived[1])
...
}Код: Выделить всё
TRISC &= 0xF0;- Сообщения: 29
- Зарегистрирован: Пт мар 20, 2015 10:05:39
А можно по подробнее?
На счет емкостей конденсаторов, я их брал из даташитов.
там стоит switch для дальнейших доработок, хотя я не вижу здесь проблемы.
А что неправильно в
TRISC &= 0xF0;
Просто я не хочу менять значения старших битов
какая ножка сброса?Vano79 писал(а):0.1мкФ на ножке сброса
На счет емкостей конденсаторов, я их брал из даташитов.
там стоит switch для дальнейших доработок, хотя я не вижу здесь проблемы.
А что неправильно в
TRISC &= 0xF0;
Просто я не хочу менять значения старших битов
- Сообщения: 1445
- Зарегистрирован: Вт июн 07, 2011 08:03:18
Всё правильно. Только ни о чём не говорит.))mr_fany писал(а):А можно по подробнее?
А что неправильно в
TRISC &= 0xF0;
Просто я не хочу менять значения старших битов
- Сообщения: 29
- Зарегистрирован: Пт мар 20, 2015 10:05:39
Тогда в чем смысл комментария???OKF писал(а):Только ни о чём не говорит.))
- Сообщения: 1445
- Зарегистрирован: Вт июн 07, 2011 08:03:18
Смысл в том что ваше 0xf0 ни о чём не говорит. И для того что бы определить правильно оно или нет нужны дополнительные тело/мозгодвижениея. Так понятно?
- Сообщения: 29
- Зарегистрирован: Пт мар 20, 2015 10:05:39
А как можно настроить порт C на вход?
USART тоже же использует порт C. Разве не помешаю работе USART инициализируя весь порт C на вход?
USART тоже же использует порт C. Разве не помешаю работе USART инициализируя весь порт C на вход?
Код: Выделить всё
TRISC = 0x00;- Сообщения: 1445
- Зарегистрирован: Вт июн 07, 2011 08:03:18
А я что, должен знать о вашем USARTе? Или ещё кто-то? Да кому оно надо! Вешайте смысловую нагрузку а не магические цифры. Не?
Ну не знаю как Вам, но мне операция &=0xF0 говорит о многом. И без всяких лишних телодвижений.OKF писал(а):Смысл в том что ваше 0xf0 ни о чём не говорит
Ну а тем, кому это ни о чём не говорит - читаем.
- Сообщения: 1445
- Зарегистрирован: Вт июн 07, 2011 08:03:18


