Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт окт 18, 2013 20:44:55
Так, а где 1, которую надо выставлять? И где ее сбрасывать?
Здесь можно немножко помяукать :)
https://radiokot.ru/forum/
Код: Выделить всё
/*****************************************************
CodeWizardAVR V2.05.0 Professional
Date : 23.10.2013
Chip type : ATmega8
AVR Core Clock frequency: 16,000000 MHz
*****************************************************/
#include <mega8.h>
#include <stdio.h>
//#include <string.h>
//#include <lib_crc.h>
#ifndef RXB8
#define RXB8 1
#endif
#ifndef TXB8
#define TXB8 0
#endif
#ifndef UPE
#define UPE 2
#endif
#ifndef DOR
#define DOR 3
#endif
#ifndef FE
#define FE 4
#endif
#ifndef UDRE
#define UDRE 5
#endif
#ifndef RXC
#define RXC 7
#endif
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
//**********************************************************
static unsigned short crc_tab16[256];
unsigned int crc_16_modbus = 0;
unsigned char crc_hi = 0;
unsigned char crc_lo = 0;
unsigned int TX_Buf[32]; // Buffer
// Write a character to the USART Transmitter
#ifndef _DEBUG_TERMINAL_IO_
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while ((UCSRA & DATA_REGISTER_EMPTY)==0);
UDR=c;
}
#pragma used-
#endif
void port(void)
{
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
// USART initialization : 8 Data, 1 Stop, Odd Parity
// Transmitter Asynchronous 9600
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0xB6;
UBRRH=0x00;
UBRRL=0x67;
// Analog Comparator: Off
ACSR=0x80;
}
void main(void)
{
port();
//03 B4 02 01 80 E6
// TX_Buf[0]=0x03;
// TX_Buf[1]=0xB4;
// TX_Buf[2]=0x02;
// TX_Buf[3]=0x01;
// update_crc_16(TX_Buf, 4);
// crc_hi_lo = calc_crc16(TX_Buf, 4);
// crc_lo = crc_16_modbus & 0x00FF;
// crc_hi = (crc_16_modbus>>8) & 0x00FF;
// TX_Buf[4]=crc_hi; // crc16
// TX_Buf[5]=crc_lo; // crc16
// TX_Buf[4]=0x80; // crc16
// TX_Buf[5]=0xE6; // crc16
// for(i = 0; i < 6; i++)
// {
// putchar(TX_Buf[i]);
// }
while (1)
{
calc_crc16();
}
}
//**************************************************************
void init_crc16_tab(void)
{
unsigned int i, j;
unsigned short crc, c;
for (i=0; i < 256; ++i)
{
crc = 0;
c = i;
for (j = 0; j < 8; ++j)
{
if ((crc ^ c) & 0x0001)
{
crc = (crc >> 1) ^ 0xA001;
}
else
{
crc = crc >> 1;
}
c = c >> 1;
}
crc_tab16[i] = crc;
}
} /* init_crc16_tab */
unsigned short update_crc_16(unsigned short crc, char c)
{
unsigned short tmp, short_c;
short_c = 0x00ff & (unsigned short) c;
tmp = crc ^ short_c;
crc = (crc >> 8) ^ crc_tab16[tmp & 0xff];
return crc;
} /* update_crc_16 */
void calc_crc16(void)//int crc_16_modbs2(int argc, char *argv[])
{
int i = 0;
unsigned short crc_16_modbus;
char input_string[] =
{
'\x01',
'\x03',
'\x00',
'\x00',
'\x00',
'\x28'
};//запишим в строку данные 01 03 00 00 00 28 в hex виде
init_crc16_tab();
crc_16_modbus = 0xffff; // обратите внимание на инициализацию
for (i = 0; i < sizeof(input_string ); ++i)
{
crc_16_modbus = update_crc_16(crc_16_modbus, input_string[i]);
putchar(input_string[i]);//выводим строку данных
}
//выводим её CRC
putchar(crc_16_modbus & 0xFF); // CRC 1
putchar((crc_16_modbus >> 8) & 0xFF); // CRC 2
//return 0;
}
Отличное описание проблемызапустить не получается
Код: Выделить всё
/*****************************************************
CodeWizardAVR V2.05.0 Professional
Date : 23.10.2013
Chip type : ATmega8
AVR Core Clock frequency: 16,000000 MHz
*****************************************************/
#include <mega8.h>
#include <stdio.h>
#include <delay.h>
#define DATA_REGISTER_EMPTY (1<<UDRE)
//**********************************************************
unsigned int update_crc_16(unsigned int crc, char c);
unsigned int calc_crc16_2(unsigned int *buf, unsigned int len);
static void init_crc16_tab(void);
static unsigned int crc_tab16[256];
unsigned int crc_hi = 0;
unsigned int crc_lo = 0;
unsigned int crc_hi_lo = 0;
unsigned int TX_Buf[32]; // Buffer
// Write a character to the USART Transmitter
#ifndef _DEBUG_TERMINAL_IO_
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while ((UCSRA & DATA_REGISTER_EMPTY)==0);
UDR=c;
}
#pragma used-
#endif
//**************************************************************
unsigned int update_crc_16(unsigned int crc, char c)
{
unsigned int tmp, i;
i = 0x00ff & c;
tmp = crc ^ i;
crc = (crc >> 8) ^ crc_tab16[tmp & 0xff];
return crc;
} /* update_crc_16 */
//**************************************************************
static void init_crc16_tab(void)
{
unsigned int i, j;
unsigned int crc, c;
for (i=0; i < 256; i++)
{
crc = 0;
c = i;
for (j = 0; j < 8; j++)
{
if ((crc ^ c) & 0x0001)
{
crc = (crc >> 1) ^ 0xA001;
}
else
{
crc = crc >> 1;
}
c = c >> 1;
}
crc_tab16[i] = crc;
}
} // init_crc16_tab
//**************************************************************
//Эта функция расчёта crc_16_modbus
unsigned int calc_crc16_2(unsigned int *buf, unsigned int len)
{
unsigned int i = 0;
unsigned int crc_16_modbus;
init_crc16_tab();
crc_16_modbus = 0xffff; // обратите внимание на инициализацию
for (i=0; i<len; i++)//в цыкле ращитаем crc_16_modbus для полученных данных
{
crc_16_modbus = update_crc_16(crc_16_modbus, buf[i]);
}
return (crc_16_modbus);//Вернём посчитаную CRC
}
//**************************************************************
void port(void)//Инициализация Портов ВВ и периферии
{
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
// USART initialization : 8 Data, 1 Stop, Odd Parity
// Transmitter Asynchronous 9600
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0xB6;
UBRRH=0x00;
UBRRL=0x67;
// Analog Comparator: Off
ACSR=0x80;
}
//**************************************************************
void main(void)
{
unsigned int len=0;
unsigned int i=0;
port();
//03 B4 02 01 80 E6 то что должно уйти по UART с уже посчитанным crc_16_modbus
//последние 2 байта первые 4 это данные.
TX_Buf[0]=0x03; //В этот массив записываю данные для отправки по UART.
TX_Buf[1]=0xB4;
TX_Buf[2]=0x02;
TX_Buf[3]=0x01;
len=4;//4 байта из массива
//вызываю функцию расчёта crc_16_modbus с параметрами массив данных и размер массива.
crc_hi_lo=calc_crc16_2(TX_Buf, len);
//После расчёта функция возвращает значение crc_16_modbus. Которое мы потом делим на два байта
crc_lo = crc_hi_lo & 0xFF; // CRC 1
crc_hi = (crc_hi_lo>>8) & 0xFF; // CRC 2
TX_Buf[4]=crc_lo;//сохраним посчитанные значения CRC в массив Buffer TX.
TX_Buf[5]=crc_hi;
for(i = 0; i < len+2; i++)//ну и передадим весь массив в цикле
{
putchar(TX_Buf[i]);
}
while (1)
{
}
}
Код: Выделить всё
volatile struct
{
unsigned char data;
} off;
for(a=0; a<sizeof(off.data); a++) off.data[a]=0;
Код: Выделить всё
Error: 1.c(229): '[' not expected
Код: Выделить всё
#define b 10 //тут размер массива
volatile struct
{
unsigned char data[b];
} off;
for(a=0; a<sizeof(off.data); a++) off.data[a]=0;Код: Выделить всё
Error: 1.c(268): the expression must be a modifiable lvalue
Error: 1.c(270): the expression must be a modifiable lvalue
Error: 1.c(443): function argument #1 of type 'unsigned char [10]' is incompatible with required parameter of type 'unsigned char'
Код: Выделить всё
off.data<<=1; первая
if(p_len<off.mu+off.mu/2) off.data|=1; вторая
putchar(off.data); третья