|
Вывод на ЖКИ значений переменных. |
|
|
|
Mar 7 2008, 15:21
|
Группа: Новичок
Сообщений: 8
Регистрация: 7-03-08
Пользователь №: 35 720

|
Подскажите новичку, как выводить значения переменных на экран ЖКИ HD44780 при программировании в CodeVisionAVR. Вывод символьных строк и отдельных символов получается, а значений переменных - нет. C примером на Си, пожалйста.
|
|
|
|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 35)
|
Mar 7 2008, 15:27
|

Местный
  
Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317

|
Цитата(andre583 @ Mar 7 2008, 18:21)  Подскажите новичку, как выводить значения переменных на экран ЖКИ HD44780 при программировании в CodeVisionAVR. Вывод символьных строк и отдельных символов получается, а значений переменных - нет. C примером на Си, пожалйста. Если CV поддерживает sprintf, то сделать можно так: Код #include <stdio.h>
int x = 123; char s[17]; sprintf(s, "x = %i", x);
// Дальше выводим строку s на индикатор, той функцией, что у Вас имеется
|
|
|
|
|
Mar 7 2008, 15:33
|
Группа: Новичок
Сообщений: 8
Регистрация: 7-03-08
Пользователь №: 35 720

|
Спасибо, все заработало!!!
|
|
|
|
|
Mar 20 2008, 08:41
|
Группа: Новичок
Сообщений: 8
Регистрация: 20-03-08
Пользователь №: 36 074

|
Цитата(andre583 @ Mar 7 2008, 18:33)  Спасибо, все заработало!!! Приветствую , Вас. А у меня нет  На sprintf дебагер Протеуса останавливается и все... Дисплей горит, но дальше никаких действий. stdio.h в CVAvr присутствует. Размер 1.9kb. В чем может быть дело ?
|
|
|
|
|
Mar 20 2008, 10:00
|
Группа: Новичок
Сообщений: 8
Регистрация: 20-03-08
Пользователь №: 36 074

|
Цитата(MrYuran @ Mar 20 2008, 12:30)  sprintf формирует строку символов в памяти. Дальше её надо отправить на индикатор, как обычно. Понимаю, что туплю... Занялся мк буквально неделю назад - интересно стало. За неделю разобрался с прерываниями, умудрился спидометр сделать (пока только в эмуляции) с выходом на семисегментные матрицы светодиодные и решил это дело перевести на LCD. Но что-то никак непойму эти функции вывода. Вот кусок кода : lcd_init(16); lcd_putsf("Test\nSpeed - control"); delay_ms(2000); lcd_clear(); x=123; sprintf(s,"x = %i", x) ; lcd_puts(s); Все что до sprintf - работает. Где я затупил ? Прошу прощения, что спрашиваю такие элементарные вещи. Сейчас сижу вычитываю форум....
|
|
|
|
|
Mar 20 2008, 10:41
|
Группа: Новичок
Сообщений: 8
Регистрация: 20-03-08
Пользователь №: 36 074

|
Цитата(MrYuran @ Mar 20 2008, 13:22)  Вверху - lcd_putsf() внизу - lcd_puts() Хотя, может просто описка Можно глянуть на описание функции? У меня внизу lcd_puts. Я что-то совсем ничего не пойму. Функции берутся из lcd.h, и там они описаны так : ------------------------------------------------------------ #ifndef _LCD_INCLUDED_ #define _LCD_INCLUDED_ #pragma used+ ....... // write the string str located in SRAM to the LCD void lcd_puts(char *str); // write the string str located in FLASH to the LCD void lcd_putsf(char flash *str); ....... #pragma used- #pragma library lcd.lib #endif --------------------------------------------------------------- Как я понимаю, нужно смотреть функции в lcd.lib ? Если так, то там вот что : // write the string str located in SRAM to the LCD void lcd_puts(char *str) { char k; while (k=*str++) lcd_putchar(k); } // write the string str located in FLASH to the LCD void lcd_putsf(char flash *str) { char k; while (k=*str++) lcd_putchar(k); } ----------------------------------------------------------------- и теперь я в полном тупике - обе функции описаны совершенно одинаково... О  Нашел разницу, пардон.
Сообщение отредактировал А.Петрович - Mar 20 2008, 10:43
|
|
|
|
|
Mar 20 2008, 11:24
|
Группа: Новичок
Сообщений: 8
Регистрация: 20-03-08
Пользователь №: 36 074

|
Цитата(MrYuran @ Mar 20 2008, 14:13)  Если только sprintf не работает... Хотя с чего бы ему не работать? Вот меня и терзают смутные сомнения  перерастающие в уверенность. Если б была какая-то проблема с lcd_puts(), то либо комприллятор ругнулся бы, либо просто ничего б не вывелось и программа пошла бы дальше, а там след.строкой опять стоит lcd_putsf("Text") . Как только убираю sprintf - печатается след.строка. Вот код : ------------------------------- ...... x=1; //sprintf(s,"x = %i", x) ; lcd_puts(s); delay_ms(200); lcd_putsf("sprintf not work !!!"); --------------------------------- В результате на дисплее "sprintf not work !!!". Вопрос в следущем - как проверить stdio.h на "рабочесть" ?
|
|
|
|
|
Mar 20 2008, 11:47
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(А.Петрович @ Mar 20 2008, 14:24)  Вопрос в следущем - как проверить stdio.h на "рабочесть" ? Про CodeVision врать не буду - не работал. Вот если MSP430+IAR - то пожалуйста. Может, попробовать #include <stdio.h> #include <stdlib.h> #include <stdarg.h> Хуже-то не станет... А линкёр не ругается? может пути до библиотек не прописаны и он не может прилинковать, и молчит себе в тряпочку?
Сообщение отредактировал MrYuran - Mar 20 2008, 11:50
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Mar 20 2008, 12:52
|
Группа: Новичок
Сообщений: 8
Регистрация: 20-03-08
Пользователь №: 36 074

|
Цитата(MrYuran @ Mar 20 2008, 14:47)  #include <stdio.h> #include <stdlib.h> #include <stdarg.h>
Хуже-то не станет...
А линкёр не ругается? может пути до библиотек не прописаны и он не может прилинковать, и молчит себе в тряпочку? Линкер не ругается, библиотеки подцепляются. Кажется понял я в чем дело. А дело в форматном выводе. Неправильно указываю тип выводимых данных похоже. sprintf(s,"%i",x) весь вопрос в том что ставить после %. Теперь вот роюсь в хелпах. Может на вскидку подскажете. Все перепробовал и i и f и u. Люди добрые, подскажите какие там буковки вообще могут быть. Все что у Кернигана с Ритчи указано перепробовал  По моему разумению, для вышеуказанного примера должно быть либо i либо d - но не работает... Может в CVAvr свои какие-то понятия о форматном выводе ?
|
|
|
|
|
Mar 20 2008, 13:40
|
Группа: Новичок
Сообщений: 8
Регистрация: 20-03-08
Пользователь №: 36 074

|
Цитата(MrYuran @ Mar 20 2008, 16:33)  а может, так попробовать?
sprintf(s,"Test"); Это-то прокатывает  Проходит даже sprintf(s,"%c",x); Выдает символ соответствующий скан коду знакогенерируещей таблицы... Может s как-то по другому описывать надо ? Может не char s[33] ? Цитата(MrYuran @ Mar 20 2008, 16:33)  Ещё можно попробовать передать в функцию lcd_... указатель на s, хотя вроде имя массива и так должно быть указателем
Можно ещё вот чего: инициализировать массив s какой-нибудь строкой и попытаться вывести. Только в конце строки обязательно должен стоять 0 Попробую пока второй вариант. Спасибо за подсказки
|
|
|
|
|
Mar 20 2008, 14:05
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(Goodefine @ Mar 20 2008, 16:56)  А если в настройках Project-Configure-C Compiler установить параметры sprintf в "long, widht"? Может поможет?.. Кстати, да, я об этом запарил. Скорее всего тут собака и порылась. Функции форматного вывода обычно имеют несколько градаций функционала: нормальный, облегченный и полноприводный.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Mar 20 2008, 14:23
|
Группа: Новичок
Сообщений: 8
Регистрация: 20-03-08
Пользователь №: 36 074

|
Цитата(Goodefine @ Mar 20 2008, 16:56)  А если в настройках Project-Configure-C Compiler установить параметры sprintf в "long, widht"? Может поможет?.. Помогло !!!! Спасибо огромное !!!! Цитата(А.Петрович @ Mar 20 2008, 17:17)  Помогло !!!! Спасибо огромное !!!! Теперь по плану прикрутить DS1820
|
|
|
|
|
Mar 21 2008, 13:19
|
Группа: Новичок
Сообщений: 8
Регистрация: 20-03-08
Пользователь №: 36 074

|
И иеще вопрос, если можно... ? ATMega 8 можно использовать тип данных float и unsigned long float ? Я так понимаю что нет... Но как быть, если нужно число больше чем FFFF ? Суть в чем, делаю для авто что-то типа маршрутника, что там будет : 1. Спидометр - уже работает 2. Время поездки - уже работает 3. Температура ОЖ - изучаю пока как прикрутить DS18B20, пока не очень получается, где-то чего-то недопонимаю... 4. Пробег за поездку - работает, но больше 65535 метров считать не получается, считать только километры - как-то неинтересно. 5. Скорсть в м/c - это пока для баловства, но тоже работает  Все выводится на ЖК дисплей. Все это пока симулируется в Протеусе. Переходить к железу намериваюсть, когда результаты симуляции будут устраивать меня полностью. Это первая моя конструкция, поэтому сразу извиняюсь за глупые вопросы. Конфу усиленно читаю...
|
|
|
|
|
Mar 22 2008, 10:34
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(А.Петрович @ Mar 21 2008, 16:19)  ATMega 8 можно использовать тип данных float и unsigned long float ? Я так понимаю что нет... Но как быть, если нужно число больше чем FFFF ? ??????????????????????? А чем мега8 хуже любого другого контроллера? У нас люди в 8253 такие шедевры запихивали... самим теперь не верится. так что можно и флот, и лонг long -> 0xffff ffff -> 4294967295=4294967,295 км. Должно хватить
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Sep 9 2008, 06:46
|
Группа: Участник
Сообщений: 11
Регистрация: 21-06-08
Пользователь №: 38 476

|
Здраствуйте , я решил тоже разобраться с HD44780, есть ли какие нибудь примеры в Proteuse с этими LCD? и еще пробую подключить инастроить работу LCD через Pattern generator кто нибудь так пробовал ,и если да то скиньте пожалуйста ваш пример.
|
|
|
|
|
Jan 13 2012, 19:43
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 12-12-11
Пользователь №: 68 814

|
Добрый вечер! Подниму эту старую тему, т.к. сам начинающий и столкнулся со следующей проблемой. Вот кусок программы, в котором значение переменной i увеличивается от 1 до 7 и всякий раз оно выводится на дисплей: Код #include <avr/io.h> //подключаем библиотеки #include <avr/delay.h> #include <stdio.h> #include <lcd_lib.h>
#define delay _delay_ms(20) #define button_0 (bit_is_clear(PIND,0)) //макрос - нажата кнопка 0 //итд
char i=-1; int p=0; unsigned char array[10];
int main(void) { LCDinit(); LCDclr(); LCDcursorOFF(); sprintf(array,"%u",i); LCDstring(array, 10); //10 - взял с запасом
while(1) //БЕСКОНЕЧНЫЙ ЦИКЛ ОПРОСА КНОПОК { if(button_0 && p==0) //проверяем нажатие кнопки 0, если нажата и p=0, продолжаем { delay; //антидребезговая задержка if(button_0 && p==0) //повторно проверяем, нажата ли кнопка. Если да, то { if(i<7) //если еще не сдвинуто 7 раз, то продолжить { i++; //увеличить i (номер бита) } else //иначе установить значение бита = 7 { i = 7; } PORTB = (1<<i); //сдвигаем 1 в порте влево на 1 бит (i-номер бита) LCDstring(array, 10); } else continue; //если кнопка не была нажата, то ПРОДОЛЖАТЬ ДАЛЬШЕ ОПРАШИВАТЬ КНОПКИ } //и так далее на разные вариации с переменной i и выводом ее в порт по нажатию кнопки } Компилятор выдает предупреждение pointer targets in passing argument 1 of 'sprintf' differ in signedness. На экране дисплея: 0 и далее в строке разные символы. Работаю в связке WinAVR + AVRStudio4. Прошу заранее не пинать...
Сообщение отредактировал Sergey529 - Jan 13 2012, 19:45
|
|
|
|
|
Jan 14 2012, 11:04
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 12-12-11
Пользователь №: 68 814

|
Цитата(Herz @ Jan 14 2012, 13:51)  Что это за странная команда? Смысл в том, что имеется 8-светодиодная линейка, подключенная к порту В - и этой командой "сдвигается" единичка в порте B, и соответственно зажигаются светодиоды с 1 по 8 при нажатии кнопки. Но меня очень интересует вывод переменной на lcd.
Сообщение отредактировал Sergey529 - Jan 14 2012, 11:06
|
|
|
|
|
Jan 14 2012, 11:13
|

Гуру
     
Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287

|
Цитата(Sergey529 @ Jan 14 2012, 13:04)  Смысл в том, что имеется 8-светодиодная линейка, подключенная к порту В - и этой командой "сдвигается" единичка в порте B, и соответственно зажигаются светодиоды с 1 по 8 при нажатии кнопки. Но меня очень интересует вывод переменной на lcd. Я надеялся, что приглядитесь повнимательнее. Единичку саму по себе сдвигать бессмысленно, независимо от того, чему потом присваивать результат сего действа... Кроме того, что именно Вы передаёте в качестве аргументов функции: Цитата LCDstring(array, 10); Где индексация?
|
|
|
|
|
Jan 14 2012, 12:46
|

Местный
  
Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040

|
Цитата(Herz @ Jan 14 2012, 15:13)  Я надеялся, что приглядитесь повнимательнее. Единичку саму по себе сдвигать бессмысленно, независимо от того, чему потом присваивать результат сего действа... Часто пользуюсь такой конструкцией нечто = (1 << номер_бита) - а почему оно бессмысленно, может, я всё делал неправильно?
|
|
|
|
|
Jan 14 2012, 13:24
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 12-12-11
Пользователь №: 68 814

|
Цитата(Herz @ Jan 14 2012, 14:13)  Я надеялся, что приглядитесь повнимательнее. Единичку саму по себе сдвигать бессмысленно, независимо от того, чему потом присваивать результат сего действа... Кроме того, что именно Вы передаёте в качестве аргументов функции:
Где индексация? Я прошил программу в процессор - все работает, нажимаю cкнопку и светодиоды поочередно загораются. Может тогда так написать : PORTB |= _BV(i); ? Ааа! Все увидел пост выше... Пропустил |. Кстати далее по программе у меня везде стоит " | ". А почему без него работает? С выводом на дисплей разобрался: Код LCDclr(); sprintf(array, "LED: %u", i); LCDstring(array, 7); На диплей выводится: "LED: 0" , 1, 2 итд. Но все же как убрать предупреждение компилятора "Pointer targets.." о котором я писал выше? Только вот еще уточнение: в программе написано PORTB |= (1<<i); то зажигаются светодиоды 1,2,3 - 8 И ОСТАЮТСЯ ВСЕ ГОРЯЩИМИ. А мне нужно - горит только 1, потом только 2, потом только 3 итд. И это получается только при команде PORTB = (1<<i); Запутался совсем...
Сообщение отредактировал Sergey529 - Jan 14 2012, 13:28
|
|
|
|
|
Jan 14 2012, 13:48
|

Начинающий профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648

|
Обе конструкции Цитата(Herz @ Jan 14 2012, 15:57)  Может, всё-таки: нечто |= (1 << номер_бита)? и Цитата Часто пользуюсь такой конструкцией нечто = (1 << номер_бита) - а почему оно бессмысленно, может, я всё делал неправильно? имеют право на жизнь, в зависимости от ситуации. В первой: установить в "1" в нечто бит "номер_бита", не трогая остальные биты. Во второй: сбросить все биты в "0" и установить единственный бит "номер_бита" в "1".
--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
|
|
|
|
|
Jan 14 2012, 13:54
|

Местный
  
Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040

|
Цитата(Herz @ Jan 14 2012, 16:57)  Может, всё-таки: нечто |= (1 << номер_бита)? А Вы не допускаете, что всё зависит от задачи? У ТС, например, совершенно правильно использован оператор присваивания =, а не |=, чтобы "горящий" светодиод двигался по линейке. И, например, для портов AT91SAM7S Ваша запись совершенно бессмысленная, ибо выполняет лишнюю работу по чтению порта  А для АВРок при настройке оборудования я пользуюсь именно простым присваиванием, чтобы быть уверенным, что в порт попадёт нужное мне значение, а не значение OR неизвестно_что
|
|
|
|
|
Jan 14 2012, 14:05
|

Гуру
     
Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287

|
Да это я Вас запутал, извините. Всё правильно там со сдвигом. Только при работе с портом надо учитывать особенность операций чтение-модификация-запись, а то иногда могут быть сюрпризы, связанные с чтением из порта не того, что туда записано. Цитата(RabidRabbit @ Jan 14 2012, 15:54)  А Вы не допускаете, что всё зависит от задачи? У ТС, например, совершенно правильно использован оператор присваивания =, а не |=, чтобы "горящий" светодиод двигался по линейке. И, например, для портов AT91SAM7S Ваша запись совершенно бессмысленная, ибо выполняет лишнюю работу по чтению порта  А для АВРок при настройке оборудования я пользуюсь именно простым присваиванием, чтобы быть уверенным, что в порт попадёт нужное мне значение, а не значение OR неизвестно_что  Да, верно, уже сам заметил.  Думал о другом и утратил внимательность...
|
|
|
|
|
Jan 14 2012, 14:43
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 12-12-11
Пользователь №: 68 814

|
Вроде разобрались  И все-таки, что делать с предупреждением компилятора?
|
|
|
|
|
May 10 2016, 05:35
|
Частый гость
 
Группа: Участник
Сообщений: 165
Регистрация: 2-01-13
Пользователь №: 75 042

|
Подскажите пожалуйста как правильно отображать переменные на lcd типа 1602. Конкретно надо данные с АЦП. Вот примерный урок тут printf и uart, но все равно не понятно как работает. Не понимаю как отображать переменные на экране, вроде как делить по разрядам 1000 100 10 1 (также как на 7сегментниках) затем прибавить 0х30 чтобы превратить в коды. Но чет на практике затык. Также кусок кода из библиотеки которую приделал для вывода на lcd. Код void lcd_out(char * txt) { while(*txt) { lcd_send(*txt,DATA); txt++; } //////// lcd_out("Hello world"); //////// Контроллер STM32F100RB, coocox ide. Спасибо
|
|
|
|
|
May 16 2016, 17:02
|
Частый гость
 
Группа: Участник
Сообщений: 165
Регистрация: 2-01-13
Пользователь №: 75 042

|
Вообщем частично разобрался. Функция Код sprintf(buf, "%d", value); вывод на дисплей переменной buf работает. Также работает функция Код snprintf(buf, buf_size, "%d", value); hd44780_write_string(&lcd, buf); взял из готовой библиотеки для hd44780. но ни то ни то не работает вместе с ADC зависает отладчик на выполнение строчки snprintf именно тогда когда АЦП вместе с ДМА, когда просто Код readADC1(u8 channel) { ADC_RegularChannelConfig(ADC1, channel, 1, ADC_SampleTime_1Cycles5); // Start the conversion ADC_SoftwareStartConvCmd(ADC1, ENABLE); // Wait until conversion completion while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); // Get the conversion value return ADC_GetConversionValue(ADC1); } то все показывает как надо. (но при этом в коде с ДМА данные в буфер АЦП записываются корректно и отладчик не виснет)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|