CodeVision AVR в вопросах и ответах
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
нет, неправильно.
у вас в главном цикле постоянно сбрасывается время на 12:00:00, соответственно и показания у вас будут неизменные
у вас в главном цикле постоянно сбрасывается время на 12:00:00, соответственно и показания у вас будут неизменные
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Igor_67 писал(а):Сэмулировал всё это дело в Протеусе. На индикаторе только:
time: : . Никаких значений нет. Даже установленных 12.00.00
ну, вы показывали кусок кода - что там выше - я не в курсе. например, lcd_buffer - есть/нет? и потом, лично мне что-то не очень понравился формат %с:%с:%с: - мне кажется, более правильно было бы %u:%u:%u
а вообще, у меня на CodeVision аллергия и тошнота
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Вот так это всё выглядит:
Длинные листинги оформляются вложением, 1024 раза уже говорили... Aheir
Файл протеуса прилепил.http://radiokot.ru/forum/viewtopic.php?p=153760#153760
Длинные листинги оформляются вложением, 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
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
передайте в функцию указатель на ваш текст
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Пробывал, выдаёт ошибку, наверно неправельно чтото делаю
Код: Выделить всё
unsigned char txt[]="Kolya"; //Текст
c1=&txt[]; //указатель
LCD_text(10,10,*c1); //передаём указатель функцыи- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
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);
а вообще читайте книжки по Си
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
ARV писал(а):LCD_text(10,10,*c1); - это что такое?
объявляем указатель на символ:
unsigned char *c1;
присваиваем указателю адрес начала строки:
с1 = &txt;
в нормальных реализациях Си можно и так сразу:
unsigned char *c1 = "строка";
а в вашем случае LCD_text(10,10,c1); или LCD_text(10,10,&txt);
а вообще читайте книжки по Си
о всё заработало спасиба
ARV писал(а):ваша прошивка у меня вообще дисплей не обновляет
я думаю, проблема в том, что во-первых, после инициализации дисплея надо сделать паузу (по-моему, процесс инициализации длится довольно долго - сотни миллисекунд), в течение которой не обращаться к дисплею, а, во-вторых, в главном цикле обновлять информацию на дисплее пореже. посудите сами: вывод на дисплей и опрос часов происходят за сотые доли секунды, т.е. вы каждые несколько сотых долей очищаете дисплей и выводите, очищаете и выводите... думаю, в этом и причина. судя по схеме, вы завели на отдельный вход секундный сигнал с часов - вот и опрашивайте этот порт - как только уровень сменился - вот тогда вычитывайте время и выводите его на дисплей. и будет вам счастье
Добрый день! Всё переделал. Пришлось отказаться от секундных импульсов и опроса порта. Без них проще. Переменные беру сразу из функции. Только вот какое дело... Так то всё работает, но индикатор часто мигает, неприятно глазам. Думаю это от частого вызова ф-ции lcd_clear(). Но вот такой глюк, я не знаю откуда: При изменении тактовой частоты МК, изменяется скорость счёта секунд. ИМХО секунды зависят от DS1307 и от кварца, при чём здесь тактовая в МК???
- Aheir
- Модератор
- Сообщения: 4517
- Зарегистрирован: Пн апр 03, 2006 11:43:25
- Откуда: Санкт - Петербург
- Контактная информация:
Так не надо лишний раз lcd_clear() вызывать. Выводит е данные только если они изменились, причем выводить можно "поверх" старых, строка просто перепишется на новую. Если все строки одинаковой длинны - вообще никаких проблем, если в строках есть изменяющаяся по длинне часть (ну там переменную какую выводим, например) просто добавляем в конце короткой строки несколько пробелов, чтобы при выводе они "затерли" последние символы предыдущей длинной строки.
По поводу счета секунд, мне думается, что такой эффект возникает из-за смены частоты обновления LCD, реже обновляется => кажется, что медленнее считает. Или реже вычитываете данные из DS'ки, опять же.
По поводу счета секунд, мне думается, что такой эффект возникает из-за смены частоты обновления LCD, реже обновляется => кажется, что медленнее считает. Или реже вычитываете данные из DS'ки, опять же.
Оптимизм х (Опыт + Знания) = const
Re: Переести строку битов в символ-байт в CodeVisionAVR
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];
*/
-
pirotehnick
- Потрогал лапой паяльник
- Сообщения: 327
- Зарегистрирован: Пт фев 08, 2008 13:46:03
- Откуда: Воронеж
- Контактная информация:
kalobyte писал(а):функция itoa()
пишеш типа
char ascii;
ascii = itoa(0b00000111);
Хмм... Вообще-то в стандартной библиотеке Си параметры этой функции представляются несколько иначе. Она содержит три параметра:
1 - значение типа int
2 - ссылка на принимающий буфер
3 - значение используемое в алгоритме расчёта (обычно - 10)
Доброго времени суток,
Просьба подсказать по возможности:
// описание пунктов меню 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)
Спасибо.
Просьба подсказать по возможности:
// описание пунктов меню 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)
Спасибо.