Контроллер для управления реле с ПК через COM порт

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Сообщение Albert_V »

mr_fany писал(а):...Проблема решена.
В чём была проблема (кроме пайки)???
Реклама
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Пт мар 20, 2015 10:05:39

Сообщение mr_fany »

Перепрошил ПИК, как Вы посоветовали:

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

    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

Сообщение mr_fany »

Дорогие эксперты, у меня все таки остались проблемы, точнее две.
1. Если сначала подключить COM порт потом питание, то МАХ начинает сильно греться. А если подключить наоборот, то все нормально.
2. После работы некоторое время ПИК начинает вести себя непонятно, т.е. в ответах на команды появляются лишние байты.

Вот прилагаю схему моего устройства (наконец нарисовал ее :) ).
Изображение
Если в схеме нет проблем, могу и код прошивки выложить.
Пожалуйста помогите. :(
Последний раз редактировалось mr_fany Пн мар 23, 2015 11:31:12, всего редактировалось 1 раз.
Друг Кота
Аватара пользователя
Сообщения: 20105
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

У вас обмотки реле ничем не зашунтированы?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Пт мар 20, 2015 10:05:39

Сообщение mr_fany »

а.. я забыл на схеме диоды поставить, но они присутствуют.

Изображение
Реклама
Друг Кота
Аватара пользователя
Сообщения: 20105
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Если вы сначала подключаете СОМ-порт без подачи питания, вполне возможно что начинает течь ток через всроенные защитные диоды МАХа.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Пт мар 20, 2015 10:05:39

Сообщение mr_fany »

а можно как-то от этого избавится?
Друг Кота
Аватара пользователя
Сообщения: 20105
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Это только моё предположение.
Очевидно, не подавать Тх и Рх на МАХ пока не подано питание.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Пт мар 20, 2015 10:05:39

Сообщение mr_fany »

А других явных ошибок нет на схеме?

Я не могу понять, откуда появляется эхо (лишние байты в ответах от ПИКа)
Друг Кота
Аватара пользователя
Сообщения: 20105
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Накосячили чего-то в программе :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Пт мар 20, 2015 10:05:39

Сообщение mr_fany »

Вот весь код прошивки:

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

#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

Сообщение Vano79 »

mr_fany писал(а):А других явных ошибок нет на схеме?
Есть, да и сама схема нарисована коряво!
0.1мкФ на ножке сброса; 31,32 ноги должны быть подключены, к каждой паре ног питания по 0,1мкФ, на выходе DC-DC напрашивается 10мкФ; 0,1 для max может быть мало. Что коммутирует реле?
mr_fany писал(а):Я не могу понять, откуда появляется эхо
Для начала в программе инициализируйте всю периферию, все порты и т.д.

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

if (!ReceiveMessage(bytesReceived))
        {
            switch(bytesReceived[1])
            ...
        }
две команды вместо switch напрашиваются в if.. else.. и т.д.

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

TRISC &= 0xF0;
TRISC = 0xF0; и т.п.
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Пт мар 20, 2015 10:05:39

Сообщение mr_fany »

А можно по подробнее?
Vano79 писал(а):0.1мкФ на ножке сброса
какая ножка сброса?

На счет емкостей конденсаторов, я их брал из даташитов.
там стоит switch для дальнейших доработок, хотя я не вижу здесь проблемы.

А что неправильно в
TRISC &= 0xF0;
Просто я не хочу менять значения старших битов
OKF
Это не хвост, это антенна
Сообщения: 1445
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

mr_fany писал(а):А можно по подробнее?
А что неправильно в
TRISC &= 0xF0;
Просто я не хочу менять значения старших битов
Всё правильно. Только ни о чём не говорит.))
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Пт мар 20, 2015 10:05:39

Сообщение mr_fany »

OKF писал(а):Только ни о чём не говорит.))
Тогда в чем смысл комментария???
OKF
Это не хвост, это антенна
Сообщения: 1445
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

Смысл в том что ваше 0xf0 ни о чём не говорит. И для того что бы определить правильно оно или нет нужны дополнительные тело/мозгодвижениея. Так понятно?
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Пт мар 20, 2015 10:05:39

Сообщение mr_fany »

А как можно настроить порт C на вход?
USART тоже же использует порт C. Разве не помешаю работе USART инициализируя весь порт C на вход?

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

TRISC = 0x00;
OKF
Это не хвост, это антенна
Сообщения: 1445
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

А я что, должен знать о вашем USARTе? Или ещё кто-то? Да кому оно надо! Вешайте смысловую нагрузку а не магические цифры. Не?
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

OKF писал(а):Смысл в том что ваше 0xf0 ни о чём не говорит
Ну не знаю как Вам, но мне операция &=0xF0 говорит о многом. И без всяких лишних телодвижений.
Ну а тем, кому это ни о чём не говорит - читаем.
OKF
Это не хвост, это антенна
Сообщения: 1445
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

Ага, даже поэму можно сложить.
Ответить

Вернуться в «PIC»