Re: Вопросы по С/С++ (СИ)
Добавлено: Пт май 31, 2013 07:44:46
Но в даташите же все прямым текстом написано!
Код: Выделить всё
typedef struct
{
uint16_t sign;
uint8_t param_1;
uint16_t param_2;
uint8_t param_3;
uint16_t param_4;
uint8_t param_5;
uint8_t param_6;
uint16_t param_7;
uint32_t crc32;
}cfg;
Код: Выделить всё
cfg config;
....
EEPROMWrite((uint8_t*)&config, sizeof(config));
EEPROMRead((uint8_t*)&config, sizeof(config));
ConfigCheckCRC32(&config); // = true То есть Все ОК.
......
Код: Выделить всё
bcount = BMSIReceive(buff); // Принимаю пакет
ParsePack(buff, bcount, (unsigned char*)&config, sizeof(config)); // Распаковываю данные
ConfigCheckCRC32(&config); // = false. То есть жопа.
Код: Выделить всё
BMSISend(buff, (BuildPack(buff, (uint8_t*)&config, cmd, addr)));
Код: Выделить всё
typedef struct
{
uint16_t sign;
uint16_t param_2;
uint16_t param_4;
uint16_t param_7;
uint8_t param_1;
uint8_t param_3;
uint8_t param_5;
uint8_t param_6;
uint32_t crc32;
}cfg;
Код: Выделить всё
struct data {
uint8_t id;
uint32_t address;
};
Код: Выделить всё
#pragma pack(push,1)// выравнивание по 1 байту
typedef struct sSingleMassPacket
{
unsigned char cMarker;
unsigned char cLenH;
unsigned char cLenL;
unsigned char cSend;
unsigned char cFrame;
unsigned char cAddr[10];
unsigned int iData;
sSingleMassPacket()// инициализация при создании
{
cMarker=0x7E;
cLenH=0;
cLenL=0x10;
cSend=0x10;
cFrame=0;
cAddr[0]=cAddr[1]=cAddr[2]=cAddr[3]=cAddr[4]=cAddr[5]=0;
cAddr[6]=cAddr[7]=cAddr[8]=0xFF;
cAddr[9]=0xFE;
iData=0;
}
}sSingleMassPacket;
#pragma pack(pop)
Проверка бита 0 порта С:Мikа писал(а):То есть b=PINC будет значить, взять все биты и этой команды будет достаточно? ТОгда до кучи ещё спрошу, как правильно прочитать какой-то отдельный бит? Большое спасибо!
Код: Выделить всё
if (PINC & (1<<0))
придем сюда если значение бита равно 1;
else
придем сюда если значение бита равно 0;Код: Выделить всё
if (PINC & (1<<7))
придем сюда если значение бита равно 1;
else
придем сюда если значение бита равно 0;Неоднократно мной проверенная... Применял во многих проектах.shads писал(а):Тут (почти в конце) процедурка от ЛИ которая может обрабатывать данные энкодера
Пора уже от определений "полный щелк" переходить к временным диаграммам состояний контактов (в общем случае - сигналов) и их фазовым соотношениям. На уровне "кнопок" далеко не уйдете.Мikа писал(а):Я посмотрел в Википедии что такое энкодер. Да, что-то вроде этого, но не так замудрено. У него 3 провода. Схема примерно такая:
Методом тыка установиЛ, что при единичном смещении (как бы один полный щёлк) происходит замыкание или размыкание ключей. В результате a и b подключаются или отключаются от c. Разница в направлении вращения сказывается очередностью вклдчений и выключений кнопок a и b.
В Си команд работы с портами НЕТ. Это уже эмбеддеры для себя понапридумывали портов всяких...Скажите вот ещё что, есть ли в Си команда, которая выводит весь порт в переменную? Или если я хочу весь код, то надо написать процедурку(или как правильно),к оторая поочередно составит из всех PINxx байт или почти-байт?
Код: Выделить всё
#include <mega8.h>
#include <delay.h>
void main(void)
{
DDRB=0b00000001;
PORTB=0x00;
PORTC=0x00;
DDRC=0b00000000;
PORTD=0x00;
DDRD=0x00;
ADCSRA=0b10001110;
ADMUX=01000000;
#asm("sei")
while (1)
{
unsigned int aa;
ADCSRA |=0b01000000;
while ((ADCSRA&0b00010000)==0);
if (aa > 500) {PORTB = 0b00000001;} else {PORTB = 0b00000000;};
ADCSRA|= 0b00010000;
}
}
Код: Выделить всё
while ((ADCSRA&0b00010000)==0);Код: Выделить всё
#include <mega8.h>
#include <delay.h>
#define ADC_VREF_TYPE 0x40
unsigned int adc_data;
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
adc_data=ADCW;
}
void main(void)
{
PORTB=0x00;
DDRB=0b00000001;
ADMUX=ADC_VREF_TYPE & 0xf0;
ADCSRA=0x8E;
// Global enable interrupts
#asm("sei")
while (1)
{
ADCSRA|=0b01000000;
if (adc_data < 500) {PORTB = 0b00000001;} else {PORTB = 0b00000000;}
}
}