CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Amstron
Нашел транзистор. Понюхал.
Сообщения: 173
Зарегистрирован: Вт дек 21, 2010 21:18:52

Re: CodeVision AVR в вопросах и ответах

Сообщение Amstron »

Amstron писал(а):Откройте страницу 477 в Лебедеве пособие для начинающих 2008 год. В низу есть два обзаца. ДАк в них говориться:
В последнем говорится, что все элементы массив инициализируются со значением НОЛЬ!
Почему то у меня не так, после того как я начал использовать eeprom ...

Ответ кто-нибудь знает почему у меня весь массив не инициализируется НУЛЯМИ???
Или у меня в настройках что то не то? Компиль CV
Аватара пользователя
Sounds
Прорезались зубы
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Re: CodeVision AVR в вопросах и ответах

Сообщение 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 );
}


помогите пожалуйста победить эту проблемку
artem_zp
Родился
Сообщения: 5
Зарегистрирован: Ср сен 23, 2009 12:16:43
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение artem_zp »

подскажите как выводить на lcd данные записаные в eeprom
----------
уже нашел
Rusja2008
Открыл глаза
Сообщения: 68
Зарегистрирован: Пн окт 06, 2008 15:51:58
Откуда: Черкассы

Re: CodeVision AVR в вопросах и ответах

Сообщение Rusja2008 »

To Sounds
Выводить цифры на дисплей нужно с помощью Вашей функции display_putchar, а функция display_puts предназначена для вывода текста, на что явно указывает char *str. Потому компилятор и ругается на то, что Вы вместо указателя подставляете переменную.
Не умееш - не берись, но не взявшись не научишся.
Аватара пользователя
Moto_v3x
Потрогал лапой паяльник
Сообщения: 307
Зарегистрирован: Ср мар 31, 2010 11:45:58
Откуда: Славянск

Re: CodeVision AVR в вопросах и ответах

Сообщение Moto_v3x »

Sounds
Вам необходимо преобразовать I из int(или как там у Вас) в str
dm211
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Re: CodeVision AVR в вопросах и ответах

Сообщение 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;
   }
 }
 }
,то работает, а если так-

Код: Выделить всё

eeprom char mass[]={"a,b,c"};
-нет. Как сделать,чтобы работало? Почему не работает-я знаю, а как сделать-не могу додуматься.
Аватара пользователя
Sounds
Прорезались зубы
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Re: CodeVision AVR в вопросах и ответах

Сообщение 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++; }
}


Какие могут быть соображения?
Аватара пользователя
Hudgun
Электрический кот
Сообщения: 1071
Зарегистрирован: Пн май 04, 2009 16:43:07
Откуда: Набережные Челны

Re: CodeVision AVR в вопросах и ответах

Сообщение 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

Выводится прекрасно
Аватара пользователя
Moto_v3x
Потрогал лапой паяльник
Сообщения: 307
Зарегистрирован: Ср мар 31, 2010 11:45:58
Откуда: Славянск

Re: CodeVision AVR в вопросах и ответах

Сообщение 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 с местным примером работало.
Аватара пользователя
Hudgun
Электрический кот
Сообщения: 1071
Зарегистрирован: Пн май 04, 2009 16:43:07
Откуда: Набережные Челны

Re: CodeVision AVR в вопросах и ответах

Сообщение Hudgun »

в обучалку нашел "Нумерация разрядов всегда идет справа-налево, от младшего к старшему" - разобрался
Аватара пользователя
Sounds
Прорезались зубы
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Re: CodeVision AVR в вопросах и ответах

Сообщение Sounds »

все равно не получается!
dm211
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Re: CodeVision AVR в вопросах и ответах

Сообщение dm211 »

Еще раз вопрос- как вытаскивать символы из массива, которая находится в EEPROM, кто обьяснит мне?

Код: Выделить всё

eeprom unsigned char mass[]={"a,b,c"};
Rusja2008
Открыл глаза
Сообщения: 68
Зарегистрирован: Пн окт 06, 2008 15:51:58
Откуда: Черкассы

Re: CodeVision AVR в вопросах и ответах

Сообщение 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, и функции перевода в строки.
Не умееш - не берись, но не взявшись не научишся.
Аватара пользователя
Sounds
Прорезались зубы
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Re: CodeVision AVR в вопросах и ответах

Сообщение Sounds »

Спасибо за ответ! Скажите а как правильней будет сделать?
Rusja2008
Открыл глаза
Сообщения: 68
Зарегистрирован: Пн окт 06, 2008 15:51:58
Откуда: Черкассы

Re: CodeVision AVR в вопросах и ответах

Сообщение Rusja2008 »

Sounds писал(а):Спасибо за ответ! Скажите а как правильней будет сделать?


Это уже решать Вам, неправильный только тот способ, который выводит мусор на дисплей :) .
Мне, так, намного удобнее разбить число и вывести поразрядно, тем более что у Вас i от 0 до 50 ну так и напишите:
display_putchar( i/10+0x30,0,0,0 );
display_putchar( i%10+0x30,0,0,0 );
Нет никаких преобразований, как с ипользованием sprintf, код выполняется быстро и не ест оперативной памяти.
Не умееш - не берись, но не взявшись не научишся.
Аватара пользователя
Sounds
Прорезались зубы
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Re: CodeVision AVR в вопросах и ответах

Сообщение Sounds »

ну это оно сейчас от 0 до 50 а в дальнейшем может быть и 1000.

А если мне нужно выводить строку и число ну например: Номер цикла - 223
Как быть в такой ситуации?
Аватара пользователя
Sounds
Прорезались зубы
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Re: CodeVision AVR в вопросах и ответах

Сообщение Sounds »

а если попробовать через функцию sprintf , то должно по идеи получится?
Rusja2008
Открыл глаза
Сообщения: 68
Зарегистрирован: Пн окт 06, 2008 15:51:58
Откуда: Черкассы

Re: CodeVision AVR в вопросах и ответах

Сообщение Rusja2008 »

В таком случае библиотека stdio.h Вам в помощь.
Я ее всячески стараюсь избегать, нужно вывести строку - использую puts, а число putchar, если число отрицательное использую ветвление if/else, да и для больших чисел не трудно написать функцию деления числа поразрядно и отображения на дисплее.
Не умееш - не берись, но не взявшись не научишся.
Аватара пользователя
Sounds
Прорезались зубы
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Re: CodeVision AVR в вопросах и ответах

Сообщение Sounds »

А можешь немного поподробней рассказать про поразрядное деление числа и про вывод отрицательного значения!
Спасибо за помощь!
Rusja2008
Открыл глаза
Сообщения: 68
Зарегистрирован: Пн окт 06, 2008 15:51:58
Откуда: Черкассы

Re: CodeVision AVR в вопросах и ответах

Сообщение 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);
Не умееш - не берись, но не взявшись не научишся.
Ответить

Вернуться в «AVR»