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

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

eeprom char mass[]={"a,b,c"};
-нет. Как сделать,чтобы работало? Почему не работает-я знаю, а как сделать-не могу додуматься.

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, кто обьяснит мне?

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

eeprom unsigned char mass[]={"a,b,c"};

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);