CodeVision AVR в вопросах и ответах
- Gudd-Head
- Друг Кота
- Сообщения: 20091
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: CodeVision AVR в вопросах и ответах
Почему не сделать одномерный массив из 14 букв, а выбирать 2 буквы начиная с N*2 (N*2 и N*2+1), где N = 0, ..., 6 — день недели?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: CodeVision AVR в вопросах и ответах
Хотя да,можно наверное и так... Ну почему умная мысля приходит опосля????!!!!!!!! 

Re: CodeVision AVR в вопросах и ответах
А символы конца строки где?
Так будет выводиться только две буквы.
Код: Выделить всё
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 и подобные.
слева!Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Re: CodeVision AVR в вопросах и ответах
Однако многомерный массив,наверное, был бы более удобен. Ведь под номером элемента будет подразумеваться зачение переменной sutki
char sutki;
if((часы==23&минуты==59)&секунды==0)sutki++;
if(sutki==8)sutki=0;
lcd_puts(dny[sutki]);
char sutki;
if((часы==23&минуты==59)&секунды==0)sutki++;
if(sutki==8)sutki=0;
lcd_puts(dny[sutki]);
Re: CodeVision AVR в вопросах и ответах
А-а,вона как!!! Щас попробую.... 
Re: CodeVision AVR в вопросах и ответах
Уррра-а-а!!!! Получилось!!!!! Спасибо Trigger. 

Re: CodeVision AVR в вопросах и ответах
Чтобы не мучаться, вот такой код:
Использование:
Код: Выделить всё
#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 и подобные.
слева!Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Re: CodeVision AVR в вопросах и ответах
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 в вопросах и ответах
Или проще
Код: Выделить всё
1UL << XRe: CodeVision AVR в вопросах и ответах
Спасибо большое! Все заработало как требуется!
Re: CodeVision AVR в вопросах и ответах
Подскажите пожалуйста
Раньше я выводил шим на oc0 38кГц вот таким кодом
Затем я убрал эту функцию за ненадобностью и использовал нулевой тймер для шима по нужным мне портам C и D
Кот этот код
Вот теперь случилось самое интересное. Мне нужно оптять выводить 38кГц на ocr0 при этом оставить pwm для портов как есть.
Может можно вторым таймером выводить на OC0.
Прошу помощи
Раньше я выводил шим на 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.
Прошу помощи
Re: CodeVision AVR в вопросах и ответах
Доброго всем времени суток
Кто может подсказать какой нужен алгоритм для калибровки бакомера,скажем по 4 точкам.
залили 5 литров -есть значение ADC,еще 5 ,и т д.
Кто может подсказать какой нужен алгоритм для калибровки бакомера,скажем по 4 точкам.
залили 5 литров -есть значение ADC,еще 5 ,и т д.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
а в чем, собственно, проблема? алгоритм вы расписали: залили 5 литров - первая точка, залили еще 5 - вторая и т.д. 
а потом по этой таблице и аппроксимируете:)))
а потом по этой таблице и аппроксимируете:)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: CodeVision AVR в вопросах и ответах
Может кто пример даст посмотреть,ничего там не понятно такому чайнику как я
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
1. "там" есть пример.
2. "там" есть описание словами всего того, что надо делать.
что конкретно вам не понятно? задайте вопрос, чтобы на него можно было отвечать.
2. "там" есть описание словами всего того, что надо делать.
что конкретно вам не понятно? задайте вопрос, чтобы на него можно было отвечать.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Берём лист бумаги в клетку, лучше миллиметровку. По горизонтали откладываем 0, 5, 10, 15, 20, 25, 30, 35, 40 л. По вертикали 0...255 (градаций преобразования АЦП). Ставим контрольные точки на 5-ти, 10-ти, 20-ти и ещё сколько нужно литрах. Соединяем все точки плавной линией. Теперь для каждого единичного отсчёта АЦП есть значение в литрах. Их можно занести в ЕЕПРОМ.
Но всё-же формула интереснее.
Но всё-же формула интереснее.
Docendo discimus
Re: CodeVision AVR в вопросах и ответах
Это мой первый проэкт,сильно не пинайте
Делаю бакомер для газа.
Есть датчик с выходом0-5в (0вольт пустой,5вольт полный)
По сути бакомер мой это простой вольтметр,переводит вольты в литры 5 вольт-50 литров.
Введена установка емкости бака от30 до 50 литров,и задержка для усреденения показаний от 1с до 30сек.
А теперь хочу ввести калибровку бака,так как бак неправильной формы и показания нелинейны.
Хотел бы сделать калибровку типа залил 5 литров-сохранил(программа делит показания ADC на 5 и сохраняет "точку" в епром)разил еще 5 или 10-сохранил,и опять есть деление показаний на вводимое число-естественно переменные 5,10,15 итд сохраняем в епром.
Как то так,но не могу я придумать как описать/написать.
Делаю бакомер для газа.
Есть датчик с выходом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 в вопросах и ответах
Ну так вам же уже дали хорошие советы!
Отградуируйте свой бак вручную, т.к. в программе калибровку сделать вам будет сложно. Сделайте сначала "вольтметр", и запишите на бумажке таблицу литры-вольты. Затем переведите вольты в литры, чтобы показания были сразу в литрах (надеюсь, найти коэффициент, на который надо умножить или разделить вольты, чтобы результат совпал с литрами, сумеете сами?).
Затем внесите эту таблицу в вашу программу в виде массива точек, как сказано в моей статье, и добавьте функцию из моей статьи, которая будет сразу переводить показания АЦП в литры по вашей таблице - останется только вывести это значение на индикатор...
неужели из ранее сказанного это было не понятно?
Отградуируйте свой бак вручную, т.к. в программе калибровку сделать вам будет сложно. Сделайте сначала "вольтметр", и запишите на бумажке таблицу литры-вольты. Затем переведите вольты в литры, чтобы показания были сразу в литрах (надеюсь, найти коэффициент, на который надо умножить или разделить вольты, чтобы результат совпал с литрами, сумеете сами?).
Затем внесите эту таблицу в вашу программу в виде массива точек, как сказано в моей статье, и добавьте функцию из моей статьи, которая будет сразу переводить показания АЦП в литры по вашей таблице - останется только вывести это значение на индикатор...
неужели из ранее сказанного это было не понятно?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Самый простой и верный вариант для Вас - откалибровать всё в реале, вычислить формулу и забить её в программу.
Формулу по точкам определить можно в Exel'е
Формулу по точкам определить можно в Exel'е
Re: CodeVision AVR в вопросах и ответах
Звиняюсь если вопрос покажется примитивным.
В CodeVision при работе контроллера с компьютером необходимо пересылать информацию через Сом - порт.Причём в компьютер слать как байты так и строки.И чтоб сократить время простоя контроллера решил слать их по прерываниям...В CodeWizard установил Tx Interrupt в программе появилось interrupt [USART_TXC] void usart_tx_isr(void). И тут немного не понял.При приёме я анализирую начало и конец строки что приходят в rx_buffer и как они совпали - перебрасываю данные в другой буфер очищая приёмный...Ну а там уж разбираюсь что пришло...А как работать с прерываниями в передаче ? Мне нужно что-то запихивать в tx_counter вручную и как мне это сделать из программы ?
Тоесть из программы putchar(c); или puts(string_out); автоматически будут передаваться на прерывания или нужны какие телодвижения....?
С уважением...
В CodeVision при работе контроллера с компьютером необходимо пересылать информацию через Сом - порт.Причём в компьютер слать как байты так и строки.И чтоб сократить время простоя контроллера решил слать их по прерываниям...В CodeWizard установил Tx Interrupt в программе появилось interrupt [USART_TXC] void usart_tx_isr(void). И тут немного не понял.При приёме я анализирую начало и конец строки что приходят в rx_buffer и как они совпали - перебрасываю данные в другой буфер очищая приёмный...Ну а там уж разбираюсь что пришло...А как работать с прерываниями в передаче ? Мне нужно что-то запихивать в tx_counter вручную и как мне это сделать из программы ?
Тоесть из программы putchar(c); или puts(string_out); автоматически будут передаваться на прерывания или нужны какие телодвижения....?
С уважением...
С уважением...