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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20091
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

Почему не сделать одномерный массив из 14 букв, а выбирать 2 буквы начиная с N*2 (N*2 и N*2+1), где N = 0, ..., 6 — день недели?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
eduardo
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

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

Сообщение eduardo »

Хотя да,можно наверное и так... Ну почему умная мысля приходит опосля????!!!!!!!! :beer:
Аватара пользователя
*Trigger*
Друг Кота
Сообщения: 3059
Зарегистрирован: Пн май 11, 2009 14:15:00
Откуда: СПб

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

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

А символы конца строки где?

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

unsigned char dni[8][3]={{0xA8,0x48,0},{0x42,0x54,0},{0x43,0x50,0},{0xAB,0x54,0},{0xA8,0x54,0},{0x43,0xA0,0},{0x42,0x43,0}};

Так будет выводиться только две буквы.
Последний раз редактировалось *Trigger* Пт янв 16, 2015 16:47:37, всего редактировалось 1 раз.
Этот пост оказался полезен? Не поленись, нажми Изображение слева!
:) :)) :)))
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
eduardo
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

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

Сообщение eduardo »

Однако многомерный массив,наверное, был бы более удобен. Ведь под номером элемента будет подразумеваться зачение переменной sutki

char sutki;
if((часы==23&минуты==59)&секунды==0)sutki++;

if(sutki==8)sutki=0;

lcd_puts(dny[sutki]);
eduardo
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

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

Сообщение eduardo »

А-а,вона как!!! Щас попробую.... :shock:
eduardo
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

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

Сообщение eduardo »

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

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

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

Чтобы не мучаться, вот такой код:

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

#define max_len 64 //Максимальная длина отображаемой строки
//Русские буквы
flash unsigned char kirilTable[64]= { 
0x41
, 0xA0, 0x42, 0xA1, 0xE0, 0x45, 0xA3, 0xA4, 0xA5, 0xA6, 0x4B, 0xA7, 0x4D, 0x48, 0x4F, 0xA8, 
0x50
, 0x43, 0x54, 0xA9, 0xAA, 0x58, 0xE1, 0xAB, 0xAC, 0xE2, 0xAD, 0xAE, 0xAD, 0xAF, 0xB0, 0xB1, 
0x61
, 0xB2, 0xB3, 0xB4, 0xE3, 0x65, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0x6F, 0xBE, 
0x70
, 0x63, 0xBF, 0x79, 0xE4, 0x78, 0xE5, 0xC0, 0xC1, 0xE6, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7}; 
void dd_lcd
(unsigned char *mas )
{
unsigned char ii; 
for 
(ii=0;(mas[ii]!=0)&&(ii<max_len); ii++) 
{
  if(mas[ii]>=0xC0) lcd_putchar(kirilTable[mas[ii]-0xC0]);
  else lcd_putchar(mas[ii]); 
}
}

Использование:

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

unsigned char dni[8][3]={"ПН","ВТ","СР","ЧТ","ПТ","СБ","ВС"};
dd_lcd(dni[sutki]);
dd_lcd("Русский текст");
Этот пост оказался полезен? Не поленись, нажми Изображение слева!
:) :)) :)))
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
amd9800
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

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

Сообщение amd9800 »

RoTToR писал(а):то все работает замечательно. Но стоит только сдвигать единичку в led на некую переменную Х, то биты старше 16-го не выводятся, и выскакивает предупреждение при компиляции.

unsigned char X=29;

led = 1 << X;


все элементарно!
RoTToR писал(а): = 1 << X;

посмотрите на выражение с права от переменной лед.
Мы имеем 1 которая константа и X переменная типа char.
Эти операции выполняются из расчета что тут максимум будет переменная либо char либо int.
то есть с права размерность будет максимум int.
Так работает компилятор. К сожалению он не достаточно умен чтоб определить что тут ему работать с данными типа long. Что же делать? указать явно что тут ему работать с long.
первый вариант = (long) (1 << X)
второй вариант - объявить переменную ей присвоить 1 и уже в этих расчетах использовать эту переменную.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Или проще

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

1UL << X
RoTToR
Открыл глаза
Сообщения: 73
Зарегистрирован: Вс июн 07, 2009 23:16:16
Контактная информация:

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

Сообщение RoTToR »

Спасибо большое! Все заработало как требуется!
ipf
Встал на лапы
Сообщения: 131
Зарегистрирован: Вт сен 20, 2011 18:41:41
Откуда: Вьетнам

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

Сообщение ipf »

Подскажите пожалуйста
Раньше я выводил шим на oc0 38кГц вот таким кодом

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

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
static char v=0x19;
TCCR0=v;
v^=0x19;
}

TCCR0 = 0x00; //stop
TCNT0 = 0x97; //set count
OCR0  = 52;  //set compare
TCCR0 = 0x19; //start timer
TCCR1A=0x00;     //Инициализация Таймера/Счетчика 1
TCCR1B=0x05;
ASSR=0x00;
MCUCR=0x00;
MCUCSR=0x00;
TIMSK=0x80;
ACSR=0x80;
SFIOR=0x00;


Затем я убрал эту функцию за ненадобностью и использовал нулевой тймер для шима по нужным мне портам C и D
Кот этот код

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

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
count++;
if (count == 0){                                //если счетчик переполнился и принял значение 0
        p1_b   = ped1;                          //сохранием значения в буфер
        p2_b = ped2;
        p1  = 1;                               //выставляем ноги, отвечающие за ШИМ в логическую 1
        p2  = 1;
 
        }

TCCR0=0x01;                                     //настраиваем таймер
TCNT0=0x00;
TCCR1A=0x00;     //Инициализация Таймера/Счетчика 1
TCCR1B=0x02;
ASSR=0x00;
MCUCR=0x00;
MCUCSR=0x00;
TIMSK=0x01;
ACSR=0x80;
SFIOR=0x00;


Вот теперь случилось самое интересное. Мне нужно оптять выводить 38кГц на ocr0 при этом оставить pwm для портов как есть.
Может можно вторым таймером выводить на OC0.
Прошу помощи
Аватара пользователя
redram55
Грызет канифоль
Сообщения: 268
Зарегистрирован: Вт мар 16, 2010 20:30:29

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

Сообщение redram55 »

Доброго всем времени суток
Кто может подсказать какой нужен алгоритм для калибровки бакомера,скажем по 4 точкам.
залили 5 литров -есть значение ADC,еще 5 ,и т д.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

а в чем, собственно, проблема? алгоритм вы расписали: залили 5 литров - первая точка, залили еще 5 - вторая и т.д. :)))
а потом по этой таблице и аппроксимируете:)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
redram55
Грызет канифоль
Сообщения: 268
Зарегистрирован: Вт мар 16, 2010 20:30:29

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

Сообщение redram55 »

Может кто пример даст посмотреть,ничего там не понятно такому чайнику как я
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

1. "там" есть пример.
2. "там" есть описание словами всего того, что надо делать.
что конкретно вам не понятно? задайте вопрос, чтобы на него можно было отвечать.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

Сообщение pyzhman »

Берём лист бумаги в клетку, лучше миллиметровку. По горизонтали откладываем 0, 5, 10, 15, 20, 25, 30, 35, 40 л. По вертикали 0...255 (градаций преобразования АЦП). Ставим контрольные точки на 5-ти, 10-ти, 20-ти и ещё сколько нужно литрах. Соединяем все точки плавной линией. Теперь для каждого единичного отсчёта АЦП есть значение в литрах. Их можно занести в ЕЕПРОМ.
Но всё-же формула интереснее.
Docendo discimus
Аватара пользователя
redram55
Грызет канифоль
Сообщения: 268
Зарегистрирован: Вт мар 16, 2010 20:30:29

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

Сообщение redram55 »

Это мой первый проэкт,сильно не пинайте
Делаю бакомер для газа.
Есть датчик с выходом0-5в (0вольт пустой,5вольт полный)
По сути бакомер мой это простой вольтметр,переводит вольты в литры 5 вольт-50 литров.
Введена установка емкости бака от30 до 50 литров,и задержка для усреденения показаний от 1с до 30сек.
А теперь хочу ввести калибровку бака,так как бак неправильной формы и показания нелинейны.
Хотел бы сделать калибровку типа залил 5 литров-сохранил(программа делит показания ADC на 5 и сохраняет "точку" в епром)разил еще 5 или 10-сохранил,и опять есть деление показаний на вводимое число-естественно переменные 5,10,15 итд сохраняем в епром.
Как то так,но не могу я придумать как описать/написать.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Ну так вам же уже дали хорошие советы!
Отградуируйте свой бак вручную, т.к. в программе калибровку сделать вам будет сложно. Сделайте сначала "вольтметр", и запишите на бумажке таблицу литры-вольты. Затем переведите вольты в литры, чтобы показания были сразу в литрах (надеюсь, найти коэффициент, на который надо умножить или разделить вольты, чтобы результат совпал с литрами, сумеете сами?).
Затем внесите эту таблицу в вашу программу в виде массива точек, как сказано в моей статье, и добавьте функцию из моей статьи, которая будет сразу переводить показания АЦП в литры по вашей таблице - останется только вывести это значение на индикатор...

неужели из ранее сказанного это было не понятно?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

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

Самый простой и верный вариант для Вас - откалибровать всё в реале, вычислить формулу и забить её в программу.
Формулу по точкам определить можно в Exel'е
andr_lar
Нашел транзистор. Понюхал.
Сообщения: 166
Зарегистрирован: Вт янв 22, 2013 16:31:22

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

Сообщение andr_lar »

Звиняюсь если вопрос покажется примитивным.
В CodeVision при работе контроллера с компьютером необходимо пересылать информацию через Сом - порт.Причём в компьютер слать как байты так и строки.И чтоб сократить время простоя контроллера решил слать их по прерываниям...В CodeWizard установил Tx Interrupt в программе появилось interrupt [USART_TXC] void usart_tx_isr(void). И тут немного не понял.При приёме я анализирую начало и конец строки что приходят в rx_buffer и как они совпали - перебрасываю данные в другой буфер очищая приёмный...Ну а там уж разбираюсь что пришло...А как работать с прерываниями в передаче ? Мне нужно что-то запихивать в tx_counter вручную и как мне это сделать из программы ?
Тоесть из программы putchar(c); или puts(string_out); автоматически будут передаваться на прерывания или нужны какие телодвижения....?

С уважением...
С уважением...
Ответить

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