CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение pyzhman »

Так, а где 1, которую надо выставлять? И где ее сбрасывать?
Docendo discimus
Аватара пользователя
pashaumnov
Прорезались зубы
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

Re: CodeVision AVR в вопросах и ответах

Сообщение pashaumnov »

в коде котоый вы мне поправили нужно дописать что бы програма работала без удержания нажатой кнопки а при повторном нажатии останавливала работу.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

Ребята, по кнопкам есть соответствующая тема, давайте туда... Там и примеры есть.
Аватара пользователя
pashaumnov
Прорезались зубы
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

Re: CodeVision AVR в вопросах и ответах

Сообщение pashaumnov »

сылочку напишите пожалуйста
kotriks
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

Re: CodeVision AVR в вопросах и ответах

Сообщение kotriks »

как будет называтся таймер в cvavr если в авр студио он называется ISR(INT0_vect) ?
Аватара пользователя
0867532
Встал на лапы
Сообщения: 142
Зарегистрирован: Сб май 25, 2013 21:14:11
Откуда: Москва
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение 0867532 »

вроде это внешка по T0?
Если возникнут вопросы - посмотрите на мой аватар.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение pyzhman »

Это же не таймер. Это обработчик внешнего прерывания по INT0.
Docendo discimus
ujin
Открыл глаза
Сообщения: 41
Зарегистрирован: Пн дек 21, 2009 15:16:31

Re: CodeVision AVR в вопросах и ответах

Сообщение ujin »

есть ли примерчик CVAVR для атмеги8 с аппаратным twi с микро 24с02с работающим в проте....спс
kotriks
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

Re: CodeVision AVR в вопросах и ответах

Сообщение kotriks »

:))
S@neK
Родился
Сообщения: 11
Зарегистрирован: Чт сен 19, 2013 19:52:13

Re: CodeVision AVR в вопросах и ответах

Сообщение S@neK »

Всем привет!!! Занялся фильтром звуковой частоты (Для светомузыки) на Меге8. фильтр усреднением. Нагуглил интересную статью http://www.enlight.ru/demo/faq/smth.pht ... nd_filters как я понимаю значения должны заноситься в масив по прерываниям АЦП.


Написал небольшую прогу, проверте её плиз!!!
по идее она должна считывать зачение 0 порта и запсывать их в 200-от значный масив по кругу
А входы 1,2,3- просто обновляемые переменные (яркость канала)
Кстате значение для масива берётся разность напряжения на входе и половины напр питания.
Вложения
Фильтр 1.1.rar
(29.8 КБ) 160 скачиваний
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение pyzhman »

Паяем и проверяем.
Docendo discimus
alexval2006
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб мар 10, 2007 20:05:39
Откуда: валуйки
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение alexval2006 »

Помогите разобраться с кодом
нужно отправить по 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 Правил Форума
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

запустить не получается
Отличное описание проблемы :)
alexval2006
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб мар 10, 2007 20:05:39
Откуда: валуйки
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение alexval2006 »

Ладно попробуем объяснить проблему ещё раз с заходом с другого бока.
Как я уже говорил нужно отправить по 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 скачиваний
kotriks
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

Re: CodeVision AVR в вопросах и ответах

Сообщение kotriks »

народ помогите исправить ошибка лезет

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

volatile struct
{
  unsigned char data;

} off;

for(a=0; a<sizeof(off.data); a++) off.data[a]=0;

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

Error: 1.c(229): '[' not expected
Аватара пользователя
*Trigger*
Друг Кота
Сообщения: 3059
Зарегистрирован: Пн май 11, 2009 14:15:00
Откуда: СПб

Re: CodeVision AVR в вопросах и ответах

Сообщение *Trigger* »

Проблема в том, что 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 и подобные.
kotriks
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

Re: CodeVision AVR в вопросах и ответах

Сообщение kotriks »

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

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'



не канает :))
Аватара пользователя
*Trigger*
Друг Кота
Сообщения: 3059
Зарегистрирован: Пн май 11, 2009 14:15:00
Откуда: СПб

Re: CodeVision AVR в вопросах и ответах

Сообщение *Trigger* »

А можно строчки подписать, пожалуйста?
Этот пост оказался полезен? Не поленись, нажми Изображение слева!
:) :)) :)))
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
kotriks
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

Re: CodeVision AVR в вопросах и ответах

Сообщение kotriks »

вы имеете ввиду в каких строках ошибки?

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

off.data<<=1; первая
if(p_len<off.mu+off.mu/2) off.data|=1; вторая
putchar(off.data);   третья
Ответить

Вернуться в «AVR»