CodeVision AVR в вопросах и ответах
Почему не сделать одномерный массив из 14 букв, а выбирать 2 буквы начиная с N*2 (N*2 и N*2+1), где N = 0, ..., 6 — день недели?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Реклама
- Сообщения: 171
- Зарегистрирован: Вс июн 17, 2012 16:32:42
Хотя да,можно наверное и так... Ну почему умная мысля приходит опосля????!!!!!!!! 
А символы конца строки где?
Так будет выводиться только две буквы.
Код: Выделить всё
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 и подобные.
- Сообщения: 171
- Зарегистрирован: Вс июн 17, 2012 16:32:42
Однако многомерный массив,наверное, был бы более удобен. Ведь под номером элемента будет подразумеваться зачение переменной 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]);
- Сообщения: 171
- Зарегистрирован: Вс июн 17, 2012 16:32:42
- Реклама
- Сообщения: 171
- Зарегистрирован: Вс июн 17, 2012 16:32:42
Чтобы не мучаться, вот такой код:
Использование:
Код: Выделить всё
#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 и подобные.
- Сообщения: 822
- Зарегистрирован: Вс июн 02, 2013 12:23:03
все элементарно!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 и уже в этих расчетах использовать эту переменную.
Или проще
Код: Выделить всё
1UL << X- Сообщения: 73
- Зарегистрирован: Вс июн 07, 2009 23:16:16
Спасибо большое! Все заработало как требуется!
Подскажите пожалуйста
Раньше я выводил шим на 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;
Кот этот код
Код: Выделить всё
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;Может можно вторым таймером выводить на OC0.
Прошу помощи
- Сообщения: 268
- Зарегистрирован: Вт мар 16, 2010 20:30:29
Доброго всем времени суток
Кто может подсказать какой нужен алгоритм для калибровки бакомера,скажем по 4 точкам.
залили 5 литров -есть значение ADC,еще 5 ,и т д.
Кто может подсказать какой нужен алгоритм для калибровки бакомера,скажем по 4 точкам.
залили 5 литров -есть значение ADC,еще 5 ,и т д.
а в чем, собственно, проблема? алгоритм вы расписали: залили 5 литров - первая точка, залили еще 5 - вторая и т.д. 
а потом по этой таблице и аппроксимируете
а потом по этой таблице и аппроксимируете
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 268
- Зарегистрирован: Вт мар 16, 2010 20:30:29
Может кто пример даст посмотреть,ничего там не понятно такому чайнику как я
1. "там" есть пример.
2. "там" есть описание словами всего того, что надо делать.
что конкретно вам не понятно? задайте вопрос, чтобы на него можно было отвечать.
2. "там" есть описание словами всего того, что надо делать.
что конкретно вам не понятно? задайте вопрос, чтобы на него можно было отвечать.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Берём лист бумаги в клетку, лучше миллиметровку. По горизонтали откладываем 0, 5, 10, 15, 20, 25, 30, 35, 40 л. По вертикали 0...255 (градаций преобразования АЦП). Ставим контрольные точки на 5-ти, 10-ти, 20-ти и ещё сколько нужно литрах. Соединяем все точки плавной линией. Теперь для каждого единичного отсчёта АЦП есть значение в литрах. Их можно занести в ЕЕПРОМ.
Но всё-же формула интереснее.
Но всё-же формула интереснее.
Docendo discimus
- Сообщения: 268
- Зарегистрирован: Вт мар 16, 2010 20:30:29
Это мой первый проэкт,сильно не пинайте
Делаю бакомер для газа.
Есть датчик с выходом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 итд сохраняем в епром.
Как то так,но не могу я придумать как описать/написать.
Ну так вам же уже дали хорошие советы!
Отградуируйте свой бак вручную, т.к. в программе калибровку сделать вам будет сложно. Сделайте сначала "вольтметр", и запишите на бумажке таблицу литры-вольты. Затем переведите вольты в литры, чтобы показания были сразу в литрах (надеюсь, найти коэффициент, на который надо умножить или разделить вольты, чтобы результат совпал с литрами, сумеете сами?).
Затем внесите эту таблицу в вашу программу в виде массива точек, как сказано в моей статье, и добавьте функцию из моей статьи, которая будет сразу переводить показания АЦП в литры по вашей таблице - останется только вывести это значение на индикатор...
неужели из ранее сказанного это было не понятно?
Отградуируйте свой бак вручную, т.к. в программе калибровку сделать вам будет сложно. Сделайте сначала "вольтметр", и запишите на бумажке таблицу литры-вольты. Затем переведите вольты в литры, чтобы показания были сразу в литрах (надеюсь, найти коэффициент, на который надо умножить или разделить вольты, чтобы результат совпал с литрами, сумеете сами?).
Затем внесите эту таблицу в вашу программу в виде массива точек, как сказано в моей статье, и добавьте функцию из моей статьи, которая будет сразу переводить показания АЦП в литры по вашей таблице - останется только вывести это значение на индикатор...
неужели из ранее сказанного это было не понятно?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Самый простой и верный вариант для Вас - откалибровать всё в реале, вычислить формулу и забить её в программу.
Формулу по точкам определить можно в Exel'е
Формулу по точкам определить можно в Exel'е
- Сообщения: 166
- Зарегистрирован: Вт янв 22, 2013 16:31:22
Звиняюсь если вопрос покажется примитивным.
В 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); автоматически будут передаваться на прерывания или нужны какие телодвижения....?
С уважением...
С уважением...


