Страница 2 из 4

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

Добавлено: Пт мар 20, 2015 17:31:04
Albert_V
mr_fany писал(а):...Проблема решена.
В чём была проблема (кроме пайки)???

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

Добавлено: Пт мар 20, 2015 17:51:19
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.

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

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

Вот прилагаю схему моего устройства (наконец нарисовал ее :) ).
Изображение
Если в схеме нет проблем, могу и код прошивки выложить.
Пожалуйста помогите. :(

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

Добавлено: Пн мар 23, 2015 11:19:31
Gudd-Head
У вас обмотки реле ничем не зашунтированы?

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

Добавлено: Пн мар 23, 2015 11:30:39
mr_fany
а.. я забыл на схеме диоды поставить, но они присутствуют.

Изображение

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

Добавлено: Пн мар 23, 2015 11:36:22
Gudd-Head
Если вы сначала подключаете СОМ-порт без подачи питания, вполне возможно что начинает течь ток через всроенные защитные диоды МАХа.

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

Добавлено: Пн мар 23, 2015 11:42:20
mr_fany
а можно как-то от этого избавится?

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

Добавлено: Пн мар 23, 2015 11:44:23
Gudd-Head
Это только моё предположение.
Очевидно, не подавать Тх и Рх на МАХ пока не подано питание.

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

Добавлено: Пн мар 23, 2015 11:52:01
mr_fany
А других явных ошибок нет на схеме?

Я не могу понять, откуда появляется эхо (лишние байты в ответах от ПИКа)

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

Добавлено: Пн мар 23, 2015 12:26:13
Gudd-Head
Накосячили чего-то в программе :)

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

Добавлено: Пн мар 23, 2015 12:32:33
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;
}

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

Добавлено: Пн мар 23, 2015 14:57:58
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; и т.п.

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

Добавлено: Пн мар 23, 2015 15:21:08
mr_fany
А можно по подробнее?
Vano79 писал(а):0.1мкФ на ножке сброса
какая ножка сброса?

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

А что неправильно в
TRISC &= 0xF0;
Просто я не хочу менять значения старших битов

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

Добавлено: Пн мар 23, 2015 16:15:02
OKF
mr_fany писал(а):А можно по подробнее?
А что неправильно в
TRISC &= 0xF0;
Просто я не хочу менять значения старших битов
Всё правильно. Только ни о чём не говорит.))

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

Добавлено: Пн мар 23, 2015 16:34:54
mr_fany
OKF писал(а):Только ни о чём не говорит.))
Тогда в чем смысл комментария???

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

Добавлено: Пн мар 23, 2015 16:41:05
OKF
Смысл в том что ваше 0xf0 ни о чём не говорит. И для того что бы определить правильно оно или нет нужны дополнительные тело/мозгодвижениея. Так понятно?

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

Добавлено: Пн мар 23, 2015 16:58:12
mr_fany
А как можно настроить порт C на вход?
USART тоже же использует порт C. Разве не помешаю работе USART инициализируя весь порт C на вход?

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

TRISC = 0x00;

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

Добавлено: Пн мар 23, 2015 17:30:29
OKF
А я что, должен знать о вашем USARTе? Или ещё кто-то? Да кому оно надо! Вешайте смысловую нагрузку а не магические цифры. Не?

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

Добавлено: Пн мар 23, 2015 17:38:15
Аlex
OKF писал(а):Смысл в том что ваше 0xf0 ни о чём не говорит
Ну не знаю как Вам, но мне операция &=0xF0 говорит о многом. И без всяких лишних телодвижений.
Ну а тем, кому это ни о чём не говорит - читаем.

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

Добавлено: Пн мар 23, 2015 17:41:18
OKF
Ага, даже поэму можно сложить.