Страница 331 из 421

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

Добавлено: Пт янв 16, 2015 15:40:04
Gudd-Head
Почему не сделать одномерный массив из 14 букв, а выбирать 2 буквы начиная с N*2 (N*2 и N*2+1), где N = 0, ..., 6 — день недели?

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

Добавлено: Пт янв 16, 2015 16:27:44
eduardo
Хотя да,можно наверное и так... Ну почему умная мысля приходит опосля????!!!!!!!! :beer:

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

Добавлено: Пт янв 16, 2015 16:33:20
*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}};
Так будет выводиться только две буквы.

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

Добавлено: Пт янв 16, 2015 16:44:51
eduardo
Однако многомерный массив,наверное, был бы более удобен. Ведь под номером элемента будет подразумеваться зачение переменной sutki

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

if(sutki==8)sutki=0;

lcd_puts(dny[sutki]);

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

Добавлено: Пт янв 16, 2015 17:05:43
eduardo
А-а,вона как!!! Щас попробую.... :shock:

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

Добавлено: Пт янв 16, 2015 17:15:44
eduardo
Уррра-а-а!!!! Получилось!!!!! Спасибо Trigger. :beer:

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

Добавлено: Пт янв 16, 2015 20:23:38
*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("Русский текст");

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

Добавлено: Пт янв 16, 2015 22:55:16
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 и уже в этих расчетах использовать эту переменную.

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

Добавлено: Пт янв 16, 2015 23:01:05
WiseLord
Или проще

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

1UL << X

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

Добавлено: Сб янв 17, 2015 17:43:19
RoTToR
Спасибо большое! Все заработало как требуется!

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

Добавлено: Чт янв 22, 2015 14:45:00
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.
Прошу помощи

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

Добавлено: Пн фев 02, 2015 00:46:13
redram55
Доброго всем времени суток
Кто может подсказать какой нужен алгоритм для калибровки бакомера,скажем по 4 точкам.
залили 5 литров -есть значение ADC,еще 5 ,и т д.

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

Добавлено: Пн фев 02, 2015 07:16:25
ARV
а в чем, собственно, проблема? алгоритм вы расписали: залили 5 литров - первая точка, залили еще 5 - вторая и т.д. :)))
а потом по этой таблице и аппроксимируете:)))

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

Добавлено: Пн фев 02, 2015 13:53:04
redram55
Может кто пример даст посмотреть,ничего там не понятно такому чайнику как я

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

Добавлено: Пн фев 02, 2015 13:58:37
ARV
1. "там" есть пример.
2. "там" есть описание словами всего того, что надо делать.
что конкретно вам не понятно? задайте вопрос, чтобы на него можно было отвечать.

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

Добавлено: Пн фев 02, 2015 15:27:31
pyzhman
Берём лист бумаги в клетку, лучше миллиметровку. По горизонтали откладываем 0, 5, 10, 15, 20, 25, 30, 35, 40 л. По вертикали 0...255 (градаций преобразования АЦП). Ставим контрольные точки на 5-ти, 10-ти, 20-ти и ещё сколько нужно литрах. Соединяем все точки плавной линией. Теперь для каждого единичного отсчёта АЦП есть значение в литрах. Их можно занести в ЕЕПРОМ.
Но всё-же формула интереснее.

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

Добавлено: Вт фев 03, 2015 09:17:03
redram55
Это мой первый проэкт,сильно не пинайте
Делаю бакомер для газа.
Есть датчик с выходом0-5в (0вольт пустой,5вольт полный)
По сути бакомер мой это простой вольтметр,переводит вольты в литры 5 вольт-50 литров.
Введена установка емкости бака от30 до 50 литров,и задержка для усреденения показаний от 1с до 30сек.
А теперь хочу ввести калибровку бака,так как бак неправильной формы и показания нелинейны.
Хотел бы сделать калибровку типа залил 5 литров-сохранил(программа делит показания ADC на 5 и сохраняет "точку" в епром)разил еще 5 или 10-сохранил,и опять есть деление показаний на вводимое число-естественно переменные 5,10,15 итд сохраняем в епром.
Как то так,но не могу я придумать как описать/написать.

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

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

неужели из ранее сказанного это было не понятно?

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

Добавлено: Вт фев 03, 2015 09:46:06
Аlex
Самый простой и верный вариант для Вас - откалибровать всё в реале, вычислить формулу и забить её в программу.
Формулу по точкам определить можно в Exel'е

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

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

С уважением...