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

Обсуждаем контроллеры компании Atmel.
Ответить
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

Сообщение kotriks »

Аlex писал(а):Это не функция, а объявление переменной в области eeprom.
Вот к чему приводят фичи компиляторов :facepalm:
ну дак как можно присвоить это объявление в авр сдуии.
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Скорее всего никак. Это фишка CVAVR.
Курите хелп на тему чтения и записии в eeprom. Возможно, в студии есть встроенная библиотека для еепром.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

#include <avr/eeprom.h>
unsigned char eeVar EEMEM = 200;
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

Сообщение kotriks »

сделал

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


unsigned char Key EEMEM = 3;

void pass() {

unsigned char pas[3]; 
 
if  (Key[6]==255) {
Key[0]='z';
Key[1]='z';
Key[2]='z';

}

putchar('E'); putchar('n'); putchar('t'); putchar('e');  putchar('r'); putchar(' '); 
putchar('l'); putchar('a'); putchar('s'); putchar('t');  putchar(' ');
putchar('k'); putchar('e'); putchar('y');
putchar(13);
putchar(10);

pas[0]=getchar(); putchar('*');
pas[1]=getchar(); putchar('*');
pas[2]=getchar(); putchar('*');

putchar(13);
putchar(10);


if  (
pas[0]==Key[0]&&
pas[1]==Key[1]&&
pas[2]==Key[2]) 


{

putchar('E'); putchar('n'); putchar('t'); putchar('e');  putchar('r'); putchar(' '); 
putchar('n'); putchar('e'); putchar('w'); putchar(' ');
putchar('k'); putchar('e'); putchar('y');
putchar(13);
putchar(10);


Key[0]=getchar(); putchar(Key[0]);
Key[1]=getchar(); putchar(Key[1]);
Key[2]=getchar(); putchar(Key[2]);




putchar(13);
putchar(10);

putchar('n'); putchar('e'); putchar('w'); putchar(' ');
putchar('k'); putchar('e'); putchar('y'); putchar(' ');
putchar(Key[0]);
putchar(Key[1]);
putchar(Key[2]);
putchar(13);
putchar(10);

}

else {
putchar('I'); putchar('n'); putchar('c'); putchar('o'); putchar('r'); putchar('e'); putchar('c'); putchar('t'); putchar(13);putchar(10);
}
}

int main(void)
{

temp=Key[0]^Key[1]^Key[2];

while(1)
{
}
ошибка компиляции, вообщем не работает :(
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

так может быть:

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

#include <avr/io.h>
#include <avr/eeprom.h>

unsigned char EEMEM Key[10];

int main(void) 
{
	if  (eeprom_read_byte(&Key[6])==255) {
    PORTB &= ~(1<<PB4);}
}
на всякий почитать: http://samou4ka.net/page/chtenie-i-zapi ... m-v-winavr
Реклама
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

Сообщение kotriks »

что то не выходит нечего :( мне нужно прочитать с памяти и записать пасс в кодвижене это проще сделать, тут же не понятно нечего. хелп ми :o
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

а что непонятно?

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

Теперь объявим переменную в EEPROM и поработаем с ней:
unsigned char eeVar EEMEM = 200;//byte

Чтение/запись байта
unsigned char myVar;
myVar = eeprom_read_byte(&eeVar);//читаем содержимое переменной
myVar = 100;//изменяем значение
eeprom_write_byte(&eeVar, myVar); // записываем новые данные в EEPROM
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

Сообщение kotriks »

непонятно то что непонятно как это будет с моим кодом выглядеть, вообще не врубаюсь нечерта :))
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Неужели не лень писать столько букавок лишних?

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

 putchar('I'); putchar('n'); putchar('c'); putchar('o'); putchar('r'); putchar('e'); putchar('c'); putchar('t'); putchar(13);putchar(10);  
Можно ж сделать функцию использовать так :

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

 fputstr("Incorrect");  
и выводить сразу целой строкой ;-)

точно так же можно сравнивать строки

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

 if(strequal(key,pass)){  /*тут делаем все что нужно*/} 
Последний раз редактировалось vitalik_1984 Пн ноя 25, 2013 22:37:50, всего редактировалось 1 раз.
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

kotriks писал(а):непонятно то что непонятно как это будет с моим кодом выглядеть, вообще не врубаюсь нечерта :))
А я говорил:
Аlex писал(а):Вот к чему приводят фичи компиляторов :facepalm:
:)
Учитесь ручками управлять ресурсами МК, а не встроенными фичами в компилятор, тогда будет вам Щастье :)
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

kotriks, Выложили бы сразу архив с программой вам бы его за пару кило денерыбы с радостью портировали в студию.
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

А как же спортивный интерес, научиться, понять, .... Так можно и готовое устройство заказать/купить :)
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

Сообщение kotriks »

можно и printf но так ресурсов больше вроде как жрёт.
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

Сообщение kotriks »

сделал так но при запроссе пароля при нажатии первого любово символа в окне эмуля протеуса ошибка

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

unsigned char EEMEM Key[10];

unsigned char EEMEM Key[] = {
    'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z'};

void pass() {

unsigned char pas[10]; 
unsigned int i,value;

//if  (Key[6]==255) {
if  (eeprom_read_byte(&Key[i])==255){
Key[0]='z';
Key[1]='z';
Key[2]='z';
Key[3]='z';
Key[4]='z';
Key[5]='z';
Key[6]='z'; 
Key[7]='z';
Key[8]='z';
Key[9]='z'; 

}

putchar('E'); putchar('n'); putchar('t'); putchar('e');  putchar('r'); putchar(' '); 
putchar('l'); putchar('a'); putchar('s'); putchar('t');  putchar(' ');
putchar('k'); putchar('e'); putchar('y');
putchar(13);
putchar(10);

/*
pas[0]=getchar(); putchar(pas[0]);
pas[1]=getchar(); putchar(pas[1]);
pas[2]=getchar(); putchar(pas[2]);
pas[3]=getchar(); putchar(pas[3]);
pas[4]=getchar(); putchar(pas[4]);
pas[5]=getchar(); putchar(pas[5]);
pas[6]=getchar(); putchar(pas[6]);
pas[7]=getchar(); putchar(pas[7]);
pas[8]=getchar(); putchar(pas[8]);
pas[9]=getchar(); putchar(pas[9]);
putchar(13);
putchar(10);
*/
value = eeprom_read_byte( &pas[0] ); putchar(pas[0]);
eeprom_write_byte( &pas[0], value =getchar()); //getchar();
value = eeprom_read_byte( &pas[1] );
eeprom_write_byte( &pas[1], value ); putchar(pas[0]);
value = eeprom_read_byte( &pas[2] );
eeprom_write_byte( &pas[2], value ); putchar(pas[0]);
value = eeprom_read_byte( &pas[3] );
eeprom_write_byte( &pas[3], value ); putchar(pas[0]);
value = eeprom_read_byte( &pas[4] );
eeprom_write_byte( &pas[4], value ); putchar(pas[0]);
value = eeprom_read_byte( &pas[5] );
eeprom_write_byte( &pas[5], value ); putchar(pas[0]);
value = eeprom_read_byte( &pas[6] );
eeprom_write_byte( &pas[6], value ); putchar(pas[0]);
value = eeprom_read_byte( &pas[7] );
eeprom_write_byte( &pas[7], value ); putchar(pas[0]);
value = eeprom_read_byte( &pas[8] );
eeprom_write_byte( &pas[8], value ); putchar(pas[0]);
value = eeprom_read_byte( &pas[9] );
eeprom_write_byte( &pas[9], value ); putchar(pas[0]);

}
} 
не даёт ввести вообщем.
помогите люди добрые. :oops:
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

в окне эмуля протеуса ошибка
Какая ? На какой строке кода она вылезает ?
Нельзя вот так давать огромный кусок кода и говорить "не работает, помогите" :) У Вас отладчик в руках, попробуйте выловить конкретную проблему.
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

что не работает?
Спойлер

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

#include <avr/io.h>
#include <avr/eeprom.h>

unsigned char EEMEM Key[10]={'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z'};
unsigned char pas[10]; 

#define F_CPU 8000000UL
#define BAUD 9600l
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   

void uinit (void){					

  UCSR0C |= (3<<UCSZ00);    		
  //Baudrate (high und low byte)
  UBRR0H = (unsigned char)(UBRR_VAL>>8);
  UBRR0L = (unsigned char)UBRR_VAL;
  UCSR0B |= (1<<RXCIE0) | (1<<TXEN0) | (1<<RXEN0);  	
}

void uputc(unsigned char c){		

	loop_until_bit_is_set(UCSR0A,UDRE0);	
	UDR0=c;								
}

unsigned char ugetc(){			
	while (!(UCSR0A & (1<<RXC0)));	
  	return UDR0;  		               
}


int main(void) 
{
    uinit();

    uputc('E'); uputc('n'); uputc('t'); uputc('e');  uputc('r'); uputc(' ');
    uputc('l'); uputc('a'); uputc('s'); uputc('t');  uputc(' ');
    uputc('k'); uputc('e'); uputc('y');
    uputc(13);
    uputc(10);
    while (1)
    {
        pas[0]=ugetc(); uputc(pas[0]);
        pas[1]=ugetc(); uputc(pas[1]);
        pas[2]=ugetc(); uputc(pas[2]);
        pas[3]=ugetc(); uputc(pas[3]);
        pas[4]=ugetc(); uputc(pas[4]);
        pas[5]=ugetc(); uputc(pas[5]);
        pas[6]=ugetc(); uputc(pas[6]);
        pas[7]=ugetc(); uputc(pas[7]);
        pas[8]=ugetc(); uputc(pas[8]);
        pas[9]=ugetc(); uputc(pas[9]);
        uputc(13);
        uputc(10);
    }
}
СпойлерИзображение
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

Сообщение kotriks »

а где ввод старого пароля чтобы сверяло zzzzzzzzzz ввожу и он просто пишет не правильный пас и не даёт ввести новый чтобы его сменить

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

if  (Key[6]==255) {
Key[0]='z'; 
Key[1]='z'; 
Key[2]='z'; 
Key[3]='z'; 
Key[4]='z';
Key[5]='z'; 
Key[6]='z'; 
Key[7]='z'; 
Key[8]='z'; 
Key[9]='z';

}
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

Непонятна задача:
1 прочитать пароль из еепром
2 ждать ввода пароля
3 если пароль введен правильно - ввести новый пароль и записать его в еепром
так?
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

Сообщение kotriks »

oleg110592 писал(а):Непонятна задача:
1 прочитать пароль из еепром
2 ждать ввода пароля
3 если пароль введен правильно - ввести новый пароль и записать его в еепром
так?
да так. в кодвижене это работает нормально если стоит так

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


eeprom unsigned char Key[10];

void pass() {

unsigned char pas[10]; 
 
if  (Key[6]==255) {
Key[0]='z';
Key[1]='z';
Key[2]='z';
Key[3]='z';
Key[4]='z';
Key[5]='z';
Key[6]='z'; 
Key[7]='z';
Key[8]='z';
Key[9]='z'; 

}

putchar('E'); putchar('n'); putchar('t'); putchar('e');  putchar('r'); putchar(' '); 
putchar('l'); putchar('a'); putchar('s'); putchar('t');  putchar(' ');
putchar('k'); putchar('e'); putchar('y');
putchar(13);
putchar(10);

pas[0]=getchar(); putchar('*');
pas[1]=getchar(); putchar('*');
pas[2]=getchar(); putchar('*');
pas[3]=getchar(); putchar('*');
pas[4]=getchar(); putchar('*');
pas[5]=getchar(); putchar('*');
pas[6]=getchar(); putchar('*');
pas[7]=getchar(); putchar('*');
pas[8]=getchar(); putchar('*');
pas[9]=getchar(); putchar('*');
putchar(13);
putchar(10);


if  (
pas[0]==Key[0]&&
pas[1]==Key[1]&&
pas[2]==Key[2]&& 
pas[3]==Key[3]&& 
pas[4]==Key[4]&& 
pas[5]==Key[5]&& 
pas[6]==Key[6]&& 
pas[7]==Key[7]&& 
pas[8]==Key[8]&&
pas[9]==Key[9])  

{

putchar('E'); putchar('n'); putchar('t'); putchar('e');  putchar('r'); putchar(' '); 
putchar('n'); putchar('e'); putchar('w'); putchar(' ');
putchar('k'); putchar('e'); putchar('y');
putchar(13);
putchar(10);


Key[0]=getchar(); putchar(Key[0]);
Key[1]=getchar(); putchar(Key[1]);
Key[2]=getchar(); putchar(Key[2]);
Key[3]=getchar(); putchar(Key[3]);
Key[4]=getchar(); putchar(Key[4]);
Key[5]=getchar(); putchar(Key[5]);
Key[6]=getchar(); putchar(Key[6]);
Key[7]=getchar(); putchar(Key[7]);
Key[8]=getchar(); putchar(Key[8]);
Key[9]=getchar(); putchar(Key[9]);



putchar(13);
putchar(10);

putchar('n'); putchar('e'); putchar('w'); putchar(' ');
putchar('k'); putchar('e'); putchar('y'); putchar(' ');
putchar(Key[0]);
putchar(Key[1]);
putchar(Key[2]);
putchar(Key[3]);
putchar(Key[4]);
putchar(Key[5]);
putchar(Key[6]);
putchar(Key[7]);
putchar(Key[8]);
putchar(Key[9]);
putchar(13);
putchar(10);
putchar(13);
putchar(10);
reboot();

} else {
putchar('I'); putchar('n'); putchar('c'); putchar('o'); putchar('r'); putchar('e'); putchar('c'); putchar('t'); putchar(13);putchar(10);
  }

}
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

так пойдет?
Спойлер

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

#include <avr/io.h>
#include <avr/eeprom.h>

unsigned char EEMEM Key[10]={"zzzzzzzzzz"};

#define F_CPU 8000000UL
#define BAUD 9600l
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   

void uinit (void){					

  UCSR0C |= (3<<UCSZ00);    		
  //Baudrate (high und low byte)
  UBRR0H = (unsigned char)(UBRR_VAL>>8);
  UBRR0L = (unsigned char)UBRR_VAL;
  UCSR0B |= (1<<RXCIE0) | (1<<TXEN0) | (1<<RXEN0);  	
}

void uputc(unsigned char c){		

	loop_until_bit_is_set(UCSR0A,UDRE0);	
	UDR0=c;								
}

unsigned char ugetc(){			
	while (!(UCSR0A & (1<<RXC0)));	
  	return UDR0;  		               
}

void uputs (unsigned char *s){		//string send

  while(*s) uputc(*s++);				   
}

void SetDefaultPassword()
{
	unsigned char i;
	if(eeprom_read_byte(&Key[6]) == 255) {
        for(i=0; i<10; i++) {
           eeprom_write_byte(&Key[i], 'z'); 
        }
            
    }	
}

void GetPassword()
{
    unsigned char pas[10], i;
 
    SetDefaultPassword();
    uputs((unsigned char*)"Enter last key\n\r");
    for(i=0; i<10; i++) {
        pas[i]=ugetc(); uputc('*');
    }
    uputc(13);
    uputc(10);
    if(
        pas[0]==eeprom_read_byte(&Key[0])&&
        pas[1]==eeprom_read_byte(&Key[1])&&
        pas[2]==eeprom_read_byte(&Key[2])&&
        pas[3]==eeprom_read_byte(&Key[3])&&
        pas[4]==eeprom_read_byte(&Key[4])&&
        pas[5]==eeprom_read_byte(&Key[5])&&
        pas[6]==eeprom_read_byte(&Key[6])&&
        pas[7]==eeprom_read_byte(&Key[7])&&
        pas[8]==eeprom_read_byte(&Key[8])&&
        pas[9]==eeprom_read_byte(&Key[9]) ) {

        uputs((unsigned char*)"Enter new key\n\r");
        
        for(i=0; i<10; i++) {
            eeprom_write_byte(&Key[i], ugetc());
            uputc(eeprom_read_byte(&Key[i]));
        }

        uputc(13);
        uputc(10);
        uputs((unsigned char*)"new key ");
        for(i=0; i<10; i++) {
            uputc(eeprom_read_byte(&Key[i]));
        }
        uputc(13);
        uputc(10);
    }
    else {
        
        uputs((unsigned char*)"Incorect\n\r");
    }


}

int main(void) 
{
    uinit();
    while (1)
    {
        GetPassword();        

    }
}
Ответить

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