реклама на сайте
подробности

 
 
> Вывод на ЖКИ значений переменных.
andre583
сообщение Mar 7 2008, 15:21
Сообщение #1





Группа: Новичок
Сообщений: 8
Регистрация: 7-03-08
Пользователь №: 35 720



Подскажите новичку, как выводить значения переменных на экран ЖКИ HD44780 при программировании в CodeVisionAVR. Вывод символьных строк и отдельных символов получается, а значений переменных - нет.
C примером на Си, пожалйста.
Go to the top of the page
 
+Quote Post
3 страниц V   1 2 3 >  
Start new topic
Ответов (1 - 35)
Aesthete Animus
сообщение Mar 7 2008, 15:27
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 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 на индикатор, той функцией, что у Вас имеется
Go to the top of the page
 
+Quote Post
andre583
сообщение Mar 7 2008, 15:33
Сообщение #3





Группа: Новичок
Сообщений: 8
Регистрация: 7-03-08
Пользователь №: 35 720



Спасибо, все заработало!!!
Go to the top of the page
 
+Quote Post
А.Петрович
сообщение Mar 20 2008, 08:41
Сообщение #4





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



Цитата(andre583 @ Mar 7 2008, 18:33) *
Спасибо, все заработало!!!


Приветствую , Вас. А у меня нет sad.gif На sprintf дебагер Протеуса останавливается и все... Дисплей горит, но дальше никаких действий. stdio.h в CVAvr присутствует. Размер 1.9kb. В чем может быть дело ?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 20 2008, 09:30
Сообщение #5


Беспросветный оптимист
******

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



sprintf формирует строку символов в памяти. Дальше её надо отправить на индикатор, как обычно.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
А.Петрович
сообщение Mar 20 2008, 10:00
Сообщение #6





Группа: Новичок
Сообщений: 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 - работает. Где я затупил ?

Прошу прощения, что спрашиваю такие элементарные вещи. Сейчас сижу вычитываю форум....
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 20 2008, 10:22
Сообщение #7


Беспросветный оптимист
******

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



Вверху - lcd_putsf()
внизу - lcd_puts()
Хотя, может просто описка
Можно глянуть на описание функции?


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
А.Петрович
сообщение Mar 20 2008, 10:41
Сообщение #8





Группа: Новичок
Сообщений: 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);
}

-----------------------------------------------------------------
и теперь я в полном тупике - обе функции описаны совершенно одинаково...
О smile.gif Нашел разницу, пардон.

Сообщение отредактировал А.Петрович - Mar 20 2008, 10:43
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 20 2008, 11:13
Сообщение #9


Беспросветный оптимист
******

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



разница только в том, что одна функция берёт строки-константы из флеши, другая - из озу.
если s - это массив char'ов, то вроде должно работать.
Если только sprintf не работает...
Хотя с чего бы ему не работать?


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
А.Петрович
сообщение Mar 20 2008, 11:24
Сообщение #10





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



Цитата(MrYuran @ Mar 20 2008, 14:13) *
Если только sprintf не работает...
Хотя с чего бы ему не работать?

Вот меня и терзают смутные сомнения sad.gif перерастающие в уверенность. Если б была какая-то проблема с 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 на "рабочесть" ?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 20 2008, 11:47
Сообщение #11


Беспросветный оптимист
******

Группа: Свой
Сообщений: 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 =)
Go to the top of the page
 
+Quote Post
А.Петрович
сообщение Mar 20 2008, 12:52
Сообщение #12





Группа: Новичок
Сообщений: 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.
Люди добрые, подскажите какие там буковки вообще могут быть. Все что у Кернигана с Ритчи указано перепробовал sad.gif По моему разумению, для вышеуказанного примера должно быть либо i либо d - но не работает... Может в CVAvr свои какие-то понятия о форматном выводе ?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 20 2008, 13:33
Сообщение #13


Беспросветный оптимист
******

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



а может, так попробовать?

sprintf(s,"Test");

уж если это не прокатит, то форматный вывод ни при чём
Ещё можно попробовать передать в функцию lcd_... указатель на s, хотя вроде имя массива и так должно быть указателем

Можно ещё вот чего: инициализировать массив s какой-нибудь строкой и попытаться вывести.
Только в конце строки обязательно должен стоять 0


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
А.Петрович
сообщение Mar 20 2008, 13:40
Сообщение #14





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



Цитата(MrYuran @ Mar 20 2008, 16:33) *
а может, так попробовать?

sprintf(s,"Test");

Это-то прокатывает sad.gif Проходит даже
sprintf(s,"%c",x);
Выдает символ соответствующий скан коду знакогенерируещей таблицы...
Может s как-то по другому описывать надо ? Может не char s[33] ?


Цитата(MrYuran @ Mar 20 2008, 16:33) *
Ещё можно попробовать передать в функцию lcd_... указатель на s, хотя вроде имя массива и так должно быть указателем

Можно ещё вот чего: инициализировать массив s какой-нибудь строкой и попытаться вывести.
Только в конце строки обязательно должен стоять 0

Попробую пока второй вариант. Спасибо за подсказки a14.gif
Go to the top of the page
 
+Quote Post
Goodefine
сообщение Mar 20 2008, 13:56
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581



А если в настройках Project-Configure-C Compiler установить параметры sprintf в "long, widht"? Может поможет?..


--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 20 2008, 14:05
Сообщение #16


Беспросветный оптимист
******

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



Цитата(Goodefine @ Mar 20 2008, 16:56) *
А если в настройках Project-Configure-C Compiler установить параметры sprintf в "long, widht"? Может поможет?..

Кстати, да, я об этом запарил.
Скорее всего тут собака и порылась.
Функции форматного вывода обычно имеют несколько градаций функционала:
нормальный, облегченный и полноприводный.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
А.Петрович
сообщение Mar 20 2008, 14:23
Сообщение #17





Группа: Новичок
Сообщений: 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 smile.gif
Go to the top of the page
 
+Quote Post
А.Петрович
сообщение Mar 21 2008, 13:19
Сообщение #18





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



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


Беспросветный оптимист
******

Группа: Свой
Сообщений: 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 =)
Go to the top of the page
 
+Quote Post
Freerider
сообщение Sep 9 2008, 06:46
Сообщение #20





Группа: Участник
Сообщений: 11
Регистрация: 21-06-08
Пользователь №: 38 476



Здраствуйте , я решил тоже разобраться с HD44780, есть ли какие нибудь примеры в Proteuse с этими LCD? и еще пробую подключить инастроить работу LCD через Pattern generator кто нибудь так пробовал ,и если да то скиньте пожалуйста ваш пример.
Go to the top of the page
 
+Quote Post
XVR
сообщение Sep 9 2008, 12:17
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(А.Петрович @ Mar 21 2008, 17:19) *
И иеще вопрос, если можно... ?
ATMega 8 можно использовать тип данных float и unsigned long float ?
Ой, а кто такой unsigned long float? 07.gif unsigned long знаю, long float тоже знаю, а вот что бы все вместе - это впервой sad.gif
Go to the top of the page
 
+Quote Post
Sergey529
сообщение Jan 13 2012, 19:43
Сообщение #22


Участник
*

Группа: Участник
Сообщений: 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.

Прошу заранее не пинать... wacko.gif

Сообщение отредактировал Sergey529 - Jan 13 2012, 19:45
Go to the top of the page
 
+Quote Post
Herz
сообщение Jan 14 2012, 10:51
Сообщение #23


Гуру
******

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



Что это за странная команда?
Цитата
PORTB = (1<<i); //сдвигаем 1 в порте влево на 1 бит (i-номер бита)
Go to the top of the page
 
+Quote Post
Sergey529
сообщение Jan 14 2012, 11:04
Сообщение #24


Участник
*

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



Цитата(Herz @ Jan 14 2012, 13:51) *
Что это за странная команда?

Смысл в том, что имеется 8-светодиодная линейка, подключенная к порту В - и этой командой "сдвигается" единичка в порте B, и соответственно зажигаются светодиоды с 1 по 8 при нажатии кнопки. Но меня очень интересует вывод переменной на lcd.

Сообщение отредактировал Sergey529 - Jan 14 2012, 11:06
Go to the top of the page
 
+Quote Post
Herz
сообщение Jan 14 2012, 11:13
Сообщение #25


Гуру
******

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



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

Я надеялся, что приглядитесь повнимательнее. Единичку саму по себе сдвигать бессмысленно, независимо от того, чему потом присваивать результат сего действа...
Кроме того, что именно Вы передаёте в качестве аргументов функции:
Цитата
LCDstring(array, 10);

Где индексация?
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение Jan 14 2012, 12:46
Сообщение #26


Местный
***

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



Цитата(Herz @ Jan 14 2012, 15:13) *
Я надеялся, что приглядитесь повнимательнее. Единичку саму по себе сдвигать бессмысленно, независимо от того, чему потом присваивать результат сего действа...

Часто пользуюсь такой конструкцией нечто = (1 << номер_бита) - а почему оно бессмысленно, может, я всё делал неправильно?
Go to the top of the page
 
+Quote Post
Herz
сообщение Jan 14 2012, 12:57
Сообщение #27


Гуру
******

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



Цитата(RabidRabbit @ Jan 14 2012, 14:46) *
Часто пользуюсь такой конструкцией нечто = (1 << номер_бита) - а почему оно бессмысленно, может, я всё делал неправильно?

Может, всё-таки: нечто |= (1 << номер_бита)?
Go to the top of the page
 
+Quote Post
Sergey529
сообщение Jan 14 2012, 13:24
Сообщение #28


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Jan 14 2012, 13:48
Сообщение #29


Начинающий профессионал
*****

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



Обе конструкции
Цитата(Herz @ Jan 14 2012, 15:57) *
Может, всё-таки: нечто |= (1 << номер_бита)?

и
Цитата
Часто пользуюсь такой конструкцией нечто = (1 << номер_бита) - а почему оно бессмысленно, может, я всё делал неправильно?

имеют право на жизнь, в зависимости от ситуации.
В первой: установить в "1" в нечто бит "номер_бита", не трогая остальные биты.
Во второй: сбросить все биты в "0" и установить единственный бит "номер_бита" в "1".


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение Jan 14 2012, 13:54
Сообщение #30


Местный
***

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



Цитата(Herz @ Jan 14 2012, 16:57) *
Может, всё-таки: нечто |= (1 << номер_бита)?

А Вы не допускаете, что всё зависит от задачи? У ТС, например, совершенно правильно использован оператор присваивания =, а не |=, чтобы "горящий" светодиод двигался по линейке. И, например, для портов AT91SAM7S Ваша запись совершенно бессмысленная, ибо выполняет лишнюю работу по чтению порта sm.gif А для АВРок при настройке оборудования я пользуюсь именно простым присваиванием, чтобы быть уверенным, что в порт попадёт нужное мне значение, а не значение OR неизвестно_что wink.gif
Go to the top of the page
 
+Quote Post
Herz
сообщение Jan 14 2012, 14:05
Сообщение #31


Гуру
******

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



Да это я Вас запутал, извините. Всё правильно там со сдвигом. Только при работе с портом надо учитывать особенность операций чтение-модификация-запись, а то иногда могут быть сюрпризы, связанные с чтением из порта не того, что туда записано.

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

Да, верно, уже сам заметил. rolleyes.gif Думал о другом и утратил внимательность...
Go to the top of the page
 
+Quote Post
Sergey529
сообщение Jan 14 2012, 14:43
Сообщение #32


Участник
*

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



Вроде разобрались rolleyes.gif И все-таки, что делать с предупреждением компилятора?
Go to the top of the page
 
+Quote Post
Alexashka
сообщение Jan 14 2012, 20:32
Сообщение #33


Практикующий маг
******

Группа: Свой
Сообщений: 3 634
Регистрация: 28-04-05
Из: Дубна, Моск.обл
Пользователь №: 4 576



Цитата
unsigned char array[10];

Цитата
Компилятор выдает предупреждение pointer targets in passing argument 1 of 'sprintf' differ in signedness.

'может он хочет чтоб был просто char array[10]; ?
Go to the top of the page
 
+Quote Post
ASDFG123
сообщение May 10 2016, 05:35
Сообщение #34


Частый гость
**

Группа: Участник
Сообщений: 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.
Спасибо
Go to the top of the page
 
+Quote Post
Lagman
сообщение May 11 2016, 07:12
Сообщение #35


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



Если вам понятен пример, который вы привели, тогда как функция printf знает в какой uart выводить символы? Как перенаправить ее вывод на другой uart?

Напишите сами свои функции вывода типа как у Чана http://elm-chan.org/fsw/strf/xprintf.html
Go to the top of the page
 
+Quote Post
ASDFG123
сообщение May 16 2016, 17:02
Сообщение #36


Частый гость
**

Группа: Участник
Сообщений: 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);
    }
то все показывает как надо.

(но при этом в коде с ДМА данные в буфер АЦП записываются корректно и отладчик не виснет)
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 23:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.07766 секунд с 7
ELECTRONIX ©2004-2016