Re: Контроллер для управления реле с ПК через COM порт
Добавлено: Пт мар 20, 2015 17:31:04
В чём была проблема (кроме пайки)???mr_fany писал(а):...Проблема решена.
Здесь можно немножко помяукать :)
https://radiokot.ru/forum/
В чём была проблема (кроме пайки)???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;
Код: Выделить всё
#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;
}
Есть, да и сама схема нарисована коряво!mr_fany писал(а):А других явных ошибок нет на схеме?
Для начала в программе инициализируйте всю периферию, все порты и т.д.mr_fany писал(а):Я не могу понять, откуда появляется эхо
Код: Выделить всё
if (!ReceiveMessage(bytesReceived))
{
switch(bytesReceived[1])
...
}Код: Выделить всё
TRISC &= 0xF0;какая ножка сброса?Vano79 писал(а):0.1мкФ на ножке сброса
Всё правильно. Только ни о чём не говорит.))mr_fany писал(а):А можно по подробнее?
А что неправильно в
TRISC &= 0xF0;
Просто я не хочу менять значения старших битов
Тогда в чем смысл комментария???OKF писал(а):Только ни о чём не говорит.))
Код: Выделить всё
TRISC = 0x00;Ну не знаю как Вам, но мне операция &=0xF0 говорит о многом. И без всяких лишних телодвижений.OKF писал(а):Смысл в том что ваше 0xf0 ни о чём не говорит