Страница 104 из 421
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 03, 2011 17:04:05
Amstron
Amstron писал(а):
Откройте страницу 477 в Лебедеве пособие для начинающих 2008 год. В низу есть два обзаца. ДАк в них говориться:
В последнем говорится, что все элементы массив инициализируются со значением НОЛЬ!
Почему то у меня не так, после того как я начал использовать eeprom ...
Ответ кто-нибудь знает почему у меня весь массив не инициализируется НУЛЯМИ???
Или у меня в настройках что то не то? Компиль CV
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср янв 05, 2011 14:41:13
Sounds
Хочу выводить на графический LCD номер цикла, делаю так:
Код: Выделить всё
int i;
for(i=0; i<50; i++){
display_puts( i,0,1,0 ); //функция вывода
}
и в итоги так не получается пишет ошибку что типы переменных не корректны.
Вот код самой функции вывода:
Код: Выделить всё
void display_puts( char *str,unsigned char x,unsigned char y,unsigned char inv )
{
char k;
textx=x;
texty=y;
do{
k=*str++;
if( k==0 ){break;}
display_putchar( k,textx,texty,inv );
}while( 1 );
}
помогите пожалуйста победить эту проблемку
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср янв 05, 2011 16:04:41
artem_zp
подскажите как выводить на lcd данные записаные в eeprom
---------------------
уже нашел
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср янв 05, 2011 18:41:28
Rusja2008
To Sounds
Выводить цифры на дисплей нужно с помощью Вашей функции display_putchar, а функция display_puts предназначена для вывода текста, на что явно указывает char *str. Потому компилятор и ругается на то, что Вы вместо указателя подставляете переменную.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср янв 05, 2011 18:47:37
Moto_v3x
Sounds
Вам необходимо преобразовать I из int(или как там у Вас) в str
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср янв 05, 2011 19:29:17
dm211
Если так-
Код: Выделить всё
char mass[]={"a,b,c"};
void read_stroka(){unsigned int i;
for(i=0; i<sizeof(mass); i++){
switch(mass[i]){
case 'a': cifra0(); break;
case 'b': cifra1(); break;
case 'c': cifra2(); break;
}
}
}
,то работает, а если так-
-нет. Как сделать,чтобы работало? Почему не работает-я знаю, а как сделать-не могу додуматься.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср янв 05, 2011 20:31:13
Sounds
Что-то через display_putchar( i,0,0,0 ); тоже не выходит, заместо числа выдаёт квадрат!
вот код функции display_putchar:
Код: Выделить всё
void display_putchar( unsigned char character,unsigned char x,unsigned char y,unsigned char inv )
{
unsigned char k=0;
unsigned char strLen;
unsigned char cs;
//textx=x;
//texty=y;
cs=goto_xy( x,y );
if( character < 0x7F ){ strLen=0X20; } //символы, цифры, английский алфавит
if( character > 0xBF ){ strLen=0X60; } //русский алфавит
do{
write_data_display( data,charsets[character-strLen][k]^inv,cs );
if( ++k==array ){ break; }
}while( 1 );
if( textx < 19 ){ textx++; }else{ textx=0; if( texty < 8 ) texty++; }
}
Какие могут быть соображения?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср янв 05, 2011 20:48:02
Hudgun
Вот простенькая програмка:
Код: Выделить всё
#include <mega32.h>
void indwr(int x)
{
DDRD = 0b11111111;
switch (x) {
//case 5: PORTD = 0b01001001; // 1 случай
case 5: PORTD = 0b10010010; // 2 случай
}
}
void main(void)
{
indwr(5);
}
Почему в первом случае выводится полная фигня:

А если ввести биты в обратном порядке (второй случай), то все нормально:
Пробовал так, аналогично первому случаю:
Код: Выделить всё
PORTD.0=0
PORTD.1=1
PORTD.2=0
PORTD.3=0
PORTD.4=1
PORTD.5=0
PORTD.6=0
PORTD.7=1
Выводится прекрасно
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср янв 05, 2011 21:35:20
Moto_v3x
Sounds
прпробуйте так:
Код: Выделить всё
int i;
char c[10];
for(i=0; i<50; i++){
itoa(i,c,);
display_puts( c,0,1,0 ); //функция вывода
}
у меня на мелт128х64 с местным примером работало.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср янв 05, 2011 22:46:07
Hudgun
в обучалку нашел "Нумерация разрядов всегда идет справа-налево, от младшего к старшему" - разобрался
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср янв 05, 2011 23:03:29
Sounds
все равно не получается!
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт янв 06, 2011 08:00:15
dm211
Еще раз вопрос- как вытаскивать символы из массива, которая находится в EEPROM, кто обьяснит мне?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт янв 06, 2011 11:20:59
Rusja2008
To Sounds
Ваше i не выведется и это ессесно, по таблице индикатора первые ячейки памяти пустые, они используются для записи своих символов. Чтоб вместо крокозябров писало цифры сделайте так display_putchar( i+0x30,0,0,0 ). Но это позволит вывести одноразрядное число 0-9, чтоб вывести старшие разряды, например число 56 то нужно написать display_putchar( i/10+0x30,0,0,0 ); display_putchar( i%10+0x30,0,0,0 ) (ну и так дальше, нужно просто число разбить на разряды). Так писать конешно дольше и может не совсем удобно для больших чисел, зато не надо использовать sprintf, и функции перевода в строки.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт янв 06, 2011 11:25:19
Sounds
Спасибо за ответ! Скажите а как правильней будет сделать?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт янв 06, 2011 11:45:13
Rusja2008
Sounds писал(а):Спасибо за ответ! Скажите а как правильней будет сделать?
Это уже решать Вам, неправильный только тот способ, который выводит мусор на дисплей

.
Мне, так, намного удобнее разбить число и вывести поразрядно, тем более что у Вас i от 0 до 50 ну так и напишите:
display_putchar( i/10+0x30,0,0,0 );
display_putchar( i%10+0x30,0,0,0 );
Нет никаких преобразований, как с ипользованием sprintf, код выполняется быстро и не ест оперативной памяти.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт янв 06, 2011 12:06:08
Sounds
ну это оно сейчас от 0 до 50 а в дальнейшем может быть и 1000.
А если мне нужно выводить строку и число ну например: Номер цикла - 223
Как быть в такой ситуации?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт янв 06, 2011 12:21:06
Sounds
а если попробовать через функцию sprintf , то должно по идеи получится?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт янв 06, 2011 12:43:19
Rusja2008
В таком случае библиотека stdio.h Вам в помощь.
Я ее всячески стараюсь избегать, нужно вывести строку - использую puts, а число putchar, если число отрицательное использую ветвление if/else, да и для больших чисел не трудно написать функцию деления числа поразрядно и отображения на дисплее.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт янв 06, 2011 13:09:46
Sounds
А можешь немного поподробней рассказать про поразрядное деление числа и про вывод отрицательного значения!
Спасибо за помощь!
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт янв 06, 2011 14:07:21
Rusja2008
Ну вот навскидку первое что в голову пришло
void display (unsigned int data, unsigned char size, unsigned char x, unsigned char y)
{
unsigned int temp=0;
if(data<0)
{temp=-data;
lcd_goto(x, y);
lcd_putchar(0x2D); //помоему это соответствует знаку -
x++;
}
else temp=data;
for(unsigned char i=0; i<size; i++)
{
lcd_goto(x+(size-i), y);
lcd_putchar(temp%10+0x30);
temp=temp/10;
}
}
Вобщем это так, для примера (далеко не идеал), что можно поделить число на разряды.
В функцию подставляется само число, количество разрядов, и координаты старшего разряда числа на дисплее. Хитрость в том, что деление ведется с младшего разряда числа и поэтому нужно инвртировать порядок его отбражения на дисплее.
Конечно sprintf по компактнее будет.
char data_buffer[10];
sprintf(data_buffer, "i = %i", i);
lcd_puts(data_buffer);