CodeVision AVR в вопросах и ответах
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Так, а где 1, которую надо выставлять? И где ее сбрасывать?
Docendo discimus
- pashaumnov
- Прорезались зубы
- Сообщения: 236
- Зарегистрирован: Чт июн 25, 2009 16:00:25
- Откуда: нижний новгород
Re: CodeVision AVR в вопросах и ответах
в коде котоый вы мне поправили нужно дописать что бы програма работала без удержания нажатой кнопки а при повторном нажатии останавливала работу.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Ребята, по кнопкам есть соответствующая тема, давайте туда... Там и примеры есть.
- pashaumnov
- Прорезались зубы
- Сообщения: 236
- Зарегистрирован: Чт июн 25, 2009 16:00:25
- Откуда: нижний новгород
Re: CodeVision AVR в вопросах и ответах
сылочку напишите пожалуйста
Re: CodeVision AVR в вопросах и ответах
как будет называтся таймер в cvavr если в авр студио он называется ISR(INT0_vect) ?
- 0867532
- Встал на лапы
- Сообщения: 142
- Зарегистрирован: Сб май 25, 2013 21:14:11
- Откуда: Москва
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
вроде это внешка по T0?
Если возникнут вопросы - посмотрите на мой аватар.
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Это же не таймер. Это обработчик внешнего прерывания по INT0.
Docendo discimus
Re: CodeVision AVR в вопросах и ответах
есть ли примерчик CVAVR для атмеги8 с аппаратным twi с микро 24с02с работающим в проте....спс
Re: CodeVision AVR в вопросах и ответах
Всем привет!!! Занялся фильтром звуковой частоты (Для светомузыки) на Меге8. фильтр усреднением. Нагуглил интересную статью http://www.enlight.ru/demo/faq/smth.pht ... nd_filters как я понимаю значения должны заноситься в масив по прерываниям АЦП.
Написал небольшую прогу, проверте её плиз!!!
по идее она должна считывать зачение 0 порта и запсывать их в 200-от значный масив по кругу
А входы 1,2,3- просто обновляемые переменные (яркость канала)
Кстате значение для масива берётся разность напряжения на входе и половины напр питания.
Написал небольшую прогу, проверте её плиз!!!
по идее она должна считывать зачение 0 порта и запсывать их в 200-от значный масив по кругу
А входы 1,2,3- просто обновляемые переменные (яркость канала)
Кстате значение для масива берётся разность напряжения на входе и половины напр питания.
- Вложения
-
- Фильтр 1.1.rar
- (29.8 КБ) 160 скачиваний
-
alexval2006
- Прорезались зубы
- Сообщения: 225
- Зарегистрирован: Сб мар 10, 2007 20:05:39
- Откуда: валуйки
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Помогите разобраться с кодом
нужно отправить по UART посылку 03 B4 02 01 80 E6 где 03 B4 02 01 данные
а оставшиеся два байта 80 E6 crc_16_modbus
Вот с этим crc_16_modbus и проблема нашёл нужный пример расчёта а запустить не получается подскажите где ошибка
нужно отправить по UART посылку 03 B4 02 01 80 E6 где 03 B4 02 01 данные
а оставшиеся два байта 80 E6 crc_16_modbus
Вот с этим crc_16_modbus и проблема нашёл нужный пример расчёта а запустить не получается подскажите где ошибка
Спойлер
Код: Выделить всё
/*****************************************************
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;
}
- Вложения
-
- 555.RAR
- (5.78 КБ) 140 скачиваний
Последний раз редактировалось Gudd-Head Пт окт 25, 2013 15:48:18, всего редактировалось 1 раз.
Причина: Нарушение п.2.5 Правил Форума
Причина: Нарушение п.2.5 Правил Форума
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Отличное описание проблемызапустить не получается
-
alexval2006
- Прорезались зубы
- Сообщения: 225
- Зарегистрирован: Сб мар 10, 2007 20:05:39
- Откуда: валуйки
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Ладно попробуем объяснить проблему ещё раз с заходом с другого бока.
Как я уже говорил нужно отправить по UART посылку 03 B4 02 01 80 E6 где 03 B4 02 01 данные а оставшиеся два байта 80 E6 crc_16_modbus.
Нашёл пример после 3х дней мучений запустил с считает правильно. Но не устраивает что для оправки посылки придется каждый раз вставлять кучу кода для расчёта crc_16_modbus. Решил переделать функцию чтобы не писать каждый раз один и тот же код.
Есть массив unsigned char TX_Buf[32]; // Buffer TX в него записываю данные для отправки по UART.
unsigned int len=0;
unsigned int i=0;
//03 B4 02 01 80 E6 то что должно уйти по UART с уже посчитанным crc_16_modbus
//последние 2 байта первые 4 это данные.
//calc_crc16();//вызываем функцию расчёта crc_16_modbus
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]);
}
Ну вот примерно такого результата хотелось бы добиться.
Проблема решена возможно что то еще можно улучшить но код уже работает буду рад замечаниям
Прилагаю рабочий код с проектом для протеуса.
PS спасение утопающих дело рук самих утопающих.
Как я уже говорил нужно отправить по UART посылку 03 B4 02 01 80 E6 где 03 B4 02 01 данные а оставшиеся два байта 80 E6 crc_16_modbus.
Нашёл пример после 3х дней мучений запустил с считает правильно. Но не устраивает что для оправки посылки придется каждый раз вставлять кучу кода для расчёта crc_16_modbus. Решил переделать функцию чтобы не писать каждый раз один и тот же код.
Есть массив unsigned char TX_Buf[32]; // Buffer TX в него записываю данные для отправки по UART.
unsigned int len=0;
unsigned int i=0;
//03 B4 02 01 80 E6 то что должно уйти по UART с уже посчитанным crc_16_modbus
//последние 2 байта первые 4 это данные.
//calc_crc16();//вызываем функцию расчёта crc_16_modbus
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]);
}
Ну вот примерно такого результата хотелось бы добиться.
Проблема решена возможно что то еще можно улучшить но код уже работает буду рад замечаниям
Спойлер
Код: Выделить всё
/*****************************************************
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)
{
}
}
Прилагаю рабочий код с проектом для протеуса.
PS спасение утопающих дело рук самих утопающих.
- Вложения
-
- 555.ZIP
- (83.22 КБ) 169 скачиваний
Re: CodeVision AVR в вопросах и ответах
народ помогите исправить ошибка лезет
Код: Выделить всё
volatile struct
{
unsigned char data;
} off;
for(a=0; a<sizeof(off.data); a++) off.data[a]=0;
Код: Выделить всё
Error: 1.c(229): '[' not expected
Re: CodeVision AVR в вопросах и ответах
Проблема в том, что data объявлена не как массив, а как просто число. Так попробуйте:
Код: Выделить всё
#define b 10 //тут размер массива
volatile struct
{
unsigned char data[b];
} off;
for(a=0; a<sizeof(off.data); a++) off.data[a]=0;Этот пост оказался полезен? Не поленись, нажми
слева!

Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
слева!Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Re: CodeVision AVR в вопросах и ответах
Код: Выделить всё
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'
не канает
Re: CodeVision AVR в вопросах и ответах
А можно строчки подписать, пожалуйста?
Этот пост оказался полезен? Не поленись, нажми
слева!

Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
слева!Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Re: CodeVision AVR в вопросах и ответах
вы имеете ввиду в каких строках ошибки?
Код: Выделить всё
off.data<<=1; первая
if(p_len<off.mu+off.mu/2) off.data|=1; вторая
putchar(off.data); третья