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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

Сообщение Igor_67 »

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

Сообщение ARV »

нет, неправильно.
у вас в главном цикле постоянно сбрасывается время на 12:00:00, соответственно и показания у вас будут неизменные :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

Сообщение Igor_67 »

Сэмулировал всё это дело в Протеусе. На индикаторе только:

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

Сообщение ARV »

Igor_67 писал(а):Сэмулировал всё это дело в Протеусе. На индикаторе только:

time: : . Никаких значений нет. Даже установленных 12.00.00

ну, вы показывали кусок кода - что там выше - я не в курсе. например, lcd_buffer - есть/нет? и потом, лично мне что-то не очень понравился формат %с:%с:%с: - мне кажется, более правильно было бы %u:%u:%u

а вообще, у меня на CodeVision аллергия и тошнота :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

Сообщение Igor_67 »

Всё переделал поставил %u:%u:%u. На индикаторе всё высветилось, но вот загрузка МК - 99% и считает секунды с периодом секунд 20. Увеличение тактовой частоты МК ничего не даёт.
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

Сообщение Igor_67 »

Вот так это всё выглядит:


Длинные листинги оформляются вложением, 1024 раза уже говорили... Aheir

Файл протеуса прилепил.http://radiokot.ru/forum/viewtopic.php?p=153760#153760
Последний раз редактировалось Igor_67 Вт дек 09, 2008 07:32:25, всего редактировалось 1 раз.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

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

Мой уютный бложик... заходите!
Doniak
Встал на лапы
Сообщения: 137
Зарегистрирован: Вс дек 02, 2007 14:11:07
Откуда: Кривой Рог

Сообщение Doniak »

Здраствуйте, возник такой вапрос. Пишу свою библиотеку которая должна обработать текст, а вот как с главной функцыи main(void) перекинуть текст в функцыю библиотеки незнаю. Подчкажете?
П.С. я могу текст перекинуть побуквам с помощю цыкла но хотелосьбы цэликом.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

передайте в функцию указатель на ваш текст
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Doniak
Встал на лапы
Сообщения: 137
Зарегистрирован: Вс дек 02, 2007 14:11:07
Откуда: Кривой Рог

Сообщение Doniak »

Пробывал, выдаёт ошибку, наверно неправельно чтото делаю

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

unsigned char txt[]="Kolya";   //Текст
c1=&txt[];                             //указатель
LCD_text(10,10,*c1);              //передаём указатель функцыи
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

Doniak писал(а):Пробывал, выдаёт ошибку, наверно неправельно чтото делаю

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

unsigned char txt[]="Kolya";   //Текст
c1=&txt[];                             //указатель
LCD_text(10,10,*c1);              //передаём указатель функцыи


LCD_text(10,10,*c1); - это что такое?

объявляем указатель на символ:
unsigned char *c1;

присваиваем указателю адрес начала строки:
с1 = &txt;

в нормальных реализациях Си можно и так сразу:
unsigned char *c1 = "строка";

а в вашем случае LCD_text(10,10,c1); или LCD_text(10,10,&txt);

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

Мой уютный бложик... заходите!
Doniak
Встал на лапы
Сообщения: 137
Зарегистрирован: Вс дек 02, 2007 14:11:07
Откуда: Кривой Рог

Сообщение Doniak »

ARV писал(а):LCD_text(10,10,*c1); - это что такое?
объявляем указатель на символ:
unsigned char *c1;
присваиваем указателю адрес начала строки:
с1 = &txt;
в нормальных реализациях Си можно и так сразу:
unsigned char *c1 = "строка";
а в вашем случае LCD_text(10,10,c1); или LCD_text(10,10,&txt);
а вообще читайте книжки по Си

о всё заработало спасиба :)
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

Сообщение Igor_67 »

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


Добрый день! Всё переделал. Пришлось отказаться от секундных импульсов и опроса порта. Без них проще. Переменные беру сразу из функции. Только вот какое дело... Так то всё работает, но индикатор часто мигает, неприятно глазам. Думаю это от частого вызова ф-ции lcd_clear(). Но вот такой глюк, я не знаю откуда: При изменении тактовой частоты МК, изменяется скорость счёта секунд. ИМХО секунды зависят от DS1307 и от кварца, при чём здесь тактовая в МК??? :shock:
Аватара пользователя
Aheir
Модератор
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург
Контактная информация:

Сообщение Aheir »

Так не надо лишний раз lcd_clear() вызывать. Выводит е данные только если они изменились, причем выводить можно "поверх" старых, строка просто перепишется на новую. Если все строки одинаковой длинны - вообще никаких проблем, если в строках есть изменяющаяся по длинне часть (ну там переменную какую выводим, например) просто добавляем в конце короткой строки несколько пробелов, чтобы при выводе они "затерли" последние символы предыдущей длинной строки.
По поводу счета секунд, мне думается, что такой эффект возникает из-за смены частоты обновления LCD, реже обновляется => кажется, что медленнее считает. Или реже вычитываете данные из DS'ки, опять же.
Оптимизм х (Опыт + Знания) = const
Kaban
Прорезались зубы
Сообщения: 235
Зарегистрирован: Пн дек 01, 2008 14:19:31
Откуда: Киргизия.

Сообщение Kaban »

У меня вопрос. Есть в наличии древний комп. Характеристики- Пентиум 1, операционка Win 98, Объём жёсткого диска 1 Ггб, свободное пространство 300 мб,память 32 мб. Этих параметров хватит для работы Code Vision AVR?И где можно взять полную версию?
Аватара пользователя
Aheir
Модератор
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург
Контактная информация:

Сообщение Aheir »

Должно хватить. Полной бесплатной версии нет, можно лишь доработать пробную. Инструменты для этого есть в Сети, найти не проблема поисковиком.
Оптимизм х (Опыт + Знания) = const
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Re: Переести строку битов в символ-байт в CodeVisionAVR

Сообщение smac »

Aster писал(а):Добрый день( вечер), уважаемые электронщики. Меня беспокоит один момент с программированием в среде CodeVisionAVR. Хотел бы спросить как перевести биты в байты, но немного в другой тематики… то есть я имею в символьном виде значения битов, ну например строку “00000111” и мне ее необходимо перевести именно в значение байта- символа, которому соответствуют биты данной строки (таблица ASCII). Будьте любезны подскажите с кодом или алгоритмом, в какую сторону копать.

Вот набросал функцию, подозреваю что не оптимальная, т. к. только начал изучать C, на АСМе решается наверное даже проще и быстрее.
Код написан на GCC, проверен на ПК, компилится без ошибок на AVR-GCC на железе АВР не тестировался, если есть ошибки то пусть форумчане меня поправят

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

/* функция преобразования строки вида 01010101\0 в код символа
 * через указатели наверное можно сделать оптимальнее, но
 * я сомневаюсь в своих силах и не знаю КОДЕ ВИЗИОН
 * Внимание !! в функции не проводится проверка на наличие
 * ошибочных симоволов в строке, наличие символов, отличных от
 * 1 или 0 приведет к непредсказуемым результатам */
 
unsigned char bintos(unsigned char str[])   
#define MNUMB 8                           /* максимальное ко-во символов
в преобразуемой строке в данном случае поскольку типы переменных char значение
константы больше 8 приведет к непредсказуемым результатам */
{
   unsigned char i, s;                  
   s=0;
   
   for (i=0; i<MNUMB ; ++i)   // для каждого элемента строки,  делаем
   {   
      s<<=1;               // сдвигаем на 1 влево результат преобразования
      s|=~(~0<<1)&(str[i]-'0');   // логическое или младшего бита числа соответствующего символу
                        // с результатом 
   }      
   return s;
}
 
/* в общем ф-я работает так:
 * 1 s=0;
 * 2.2 Сдвигаем s на 1 бит влево
 * 2.3 Вычисляем число, соответсвующее str[i] (str[i]-'0')
 * 2.4 Накладываем на это число маску, выделяющую только младший бит
 * 2.5 Делаем лог. ИЛИ с получившимся числом
 * 3 Повторяем пункт 2 8 раз
 * В результате в s получается код символа, соответствующий строке из 1 и 0
 *
 * П. С. Для кодировки ASCII, где 0 имеет код 0x30, а 1 -  0x31 будет работать даже
 * если строку s|=~(~0<<1)&(str[i]-'0'); заменить на строку s|=~(~0<<1)&str[i];
 */
kalobyte
Друг Кота
Сообщения: 13796
Зарегистрирован: Чт сен 20, 2007 14:08:00

Сообщение kalobyte »

функция itoa()
пишеш типа
char ascii;
ascii = itoa(0b00000111);
хедер вроде stdio.h или смотри справку по компилятору
pirotehnick
Потрогал лапой паяльник
Сообщения: 327
Зарегистрирован: Пт фев 08, 2008 13:46:03
Откуда: Воронеж
Контактная информация:

Сообщение pirotehnick »

kalobyte писал(а):функция itoa()
пишеш типа
char ascii;
ascii = itoa(0b00000111);


Хмм... Вообще-то в стандартной библиотеке Си параметры этой функции представляются несколько иначе. Она содержит три параметра:
1 - значение типа int
2 - ссылка на принимающий буфер
3 - значение используемое в алгоритме расчёта (обычно - 10)
ManFm
Родился
Сообщения: 1
Зарегистрирован: Чт дек 18, 2008 09:19:19

Сообщение ManFm »

Доброго времени суток,

Просьба подсказать по возможности:

// описание пунктов меню 1
flash char* flash MenuItem01 [] =
{
"Menu01",
"Free Menu",
"Exit"
};

// описание пунктов меню 2
flash char* flash MenuItem02 [] =
{
"Menu02",
"Exit"
};

// вывод текста
void TextOut (char x, char y, char flash *pStr)
{
char S;
// код символа
S = *pStr ++;
...
}

// передать для печати 2 строку Menu01
TextOut (12, 12, MenuItem01 [1]);

// передать для печати 1 строку Menu02
TextOut (12, 12, MenuItem02 [0]);

Есть желание (вернее необходимость) передавать в функцию TextOut, не посредственно массив указателей на строки,
а указатель (если так корректно сказать) на массив указателей на строки.

для примера, образно:

pMenuItem = MenuItem01;

TextOut (12, 12, pMenuItem [1]);

pMenuItem = MenuItem02;

TextOut (12, 12, pMenuItem [0]);

На данный момент затруднение, в обьявлении такого указателя (pMenuItem)

Спасибо.
Ответить

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