Сэмулировал всё это дело в Протеусе. На индикаторе только:
time: : . Никаких значений нет. Даже установленных 12.00.00
ну, вы показывали кусок кода - что там выше - я не в курсе. например, lcd_buffer - есть/нет? и потом, лично мне что-то не очень понравился формат %с:%с:%с: - мне кажется, более правильно было бы %u:%u:%u
а вообще, у меня на CodeVision аллергия и тошнота
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Всё переделал поставил %u:%u:%u. На индикаторе всё высветилось, но вот загрузка МК - 99% и считает секунды с периодом секунд 20. Увеличение тактовой частоты МК ничего не даёт.
ваша прошивка у меня вообще дисплей не обновляет я думаю, проблема в том, что во-первых, после инициализации дисплея надо сделать паузу (по-моему, процесс инициализации длится довольно долго - сотни миллисекунд), в течение которой не обращаться к дисплею, а, во-вторых, в главном цикле обновлять информацию на дисплее пореже. посудите сами: вывод на дисплей и опрос часов происходят за сотые доли секунды, т.е. вы каждые несколько сотых долей очищаете дисплей и выводите, очищаете и выводите... думаю, в этом и причина. судя по схеме, вы завели на отдельный вход секундный сигнал с часов - вот и опрашивайте этот порт - как только уровень сменился - вот тогда вычитывайте время и выводите его на дисплей. и будет вам счастье
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Здраствуйте, возник такой вапрос. Пишу свою библиотеку которая должна обработать текст, а вот как с главной функцыи main(void) перекинуть текст в функцыю библиотеки незнаю. Подчкажете?
П.С. я могу текст перекинуть побуквам с помощю цыкла но хотелосьбы цэликом.
LCD_text(10,10,*c1); - это что такое? объявляем указатель на символ: unsigned char *c1; присваиваем указателю адрес начала строки: с1 = &txt; в нормальных реализациях Си можно и так сразу: unsigned char *c1 = "строка"; а в вашем случае LCD_text(10,10,c1); или LCD_text(10,10,&txt); а вообще читайте книжки по Си
ваша прошивка у меня вообще дисплей не обновляет я думаю, проблема в том, что во-первых, после инициализации дисплея надо сделать паузу (по-моему, процесс инициализации длится довольно долго - сотни миллисекунд), в течение которой не обращаться к дисплею, а, во-вторых, в главном цикле обновлять информацию на дисплее пореже. посудите сами: вывод на дисплей и опрос часов происходят за сотые доли секунды, т.е. вы каждые несколько сотых долей очищаете дисплей и выводите, очищаете и выводите... думаю, в этом и причина. судя по схеме, вы завели на отдельный вход секундный сигнал с часов - вот и опрашивайте этот порт - как только уровень сменился - вот тогда вычитывайте время и выводите его на дисплей. и будет вам счастье
Добрый день! Всё переделал. Пришлось отказаться от секундных импульсов и опроса порта. Без них проще. Переменные беру сразу из функции. Только вот какое дело... Так то всё работает, но индикатор часто мигает, неприятно глазам. Думаю это от частого вызова ф-ции lcd_clear(). Но вот такой глюк, я не знаю откуда: При изменении тактовой частоты МК, изменяется скорость счёта секунд. ИМХО секунды зависят от DS1307 и от кварца, при чём здесь тактовая в МК???
Так не надо лишний раз lcd_clear() вызывать. Выводит е данные только если они изменились, причем выводить можно "поверх" старых, строка просто перепишется на новую. Если все строки одинаковой длинны - вообще никаких проблем, если в строках есть изменяющаяся по длинне часть (ну там переменную какую выводим, например) просто добавляем в конце короткой строки несколько пробелов, чтобы при выводе они "затерли" последние символы предыдущей длинной строки.
По поводу счета секунд, мне думается, что такой эффект возникает из-за смены частоты обновления LCD, реже обновляется => кажется, что медленнее считает. Или реже вычитываете данные из DS'ки, опять же.
_________________ Оптимизм х (Опыт + Знания) = const
У меня вопрос. Есть в наличии древний комп. Характеристики- Пентиум 1, операционка Win 98, Объём жёсткого диска 1 Ггб, свободное пространство 300 мб,память 32 мб. Этих параметров хватит для работы Code Vision AVR?И где можно взять полную версию?
Добрый день( вечер), уважаемые электронщики. Меня беспокоит один момент с программированием в среде CodeVisionAVR. Хотел бы спросить как перевести биты в байты, но немного в другой тематики… то есть я имею в символьном виде значения битов, ну например строку “00000111” и мне ее необходимо перевести именно в значение байта- символа, которому соответствуют биты данной строки (таблица ASCII). Будьте любезны подскажите с кодом или алгоритмом, в какую сторону копать.
Вот набросал функцию, подозреваю что не оптимальная, т. к. только начал изучать C, на АСМе решается наверное даже проще и быстрее.
Код написан на GCC, проверен на ПК, компилится без ошибок на AVR-GCC на железе АВР не тестировался, если есть ошибки то пусть форумчане меня поправят
Код:
/* функция преобразования строки вида 01010101\0 в код символа * через указатели наверное можно сделать оптимальнее, но * я сомневаюсь в своих силах и не знаю КОДЕ ВИЗИОН * Внимание !! в функции не проводится проверка на наличие * ошибочных симоволов в строке, наличие символов, отличных от * 1 или 0 приведет к непредсказуемым результатам */
unsignedcharbintos(unsignedchar str[]) #define MNUMB 8 /* максимальное ко-во символов в преобразуемой строке в данном случае поскольку типы переменных char значение константы больше 8 приведет к непредсказуемым результатам */ { unsignedchar 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]; */
функция 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)
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения