Сравнить два массива в микроконтроллере atmega8

Обсуждаем контроллеры компании Atmel.
Ответить
master3763
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Сб дек 10, 2011 17:45:25
Контактная информация:

Сравнить два массива в микроконтроллере atmega8

Сообщение master3763 »

Здравствуйте! Помогите решить задачу в Code Vision C++.
Есть массивы:

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

char mass2[4][4]={{'1','2','3','4'},
                  {'5','6','7','8'},
                  {'9','A','B','C'},
                  {'D','E','F','D'}};
и

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

char mass3[3]={'1','2','3'};
Массив mass2[j] выводится на LCD дисплей.

Мне нужно организовать проверку сравнения массивов. Тесть если массив char mass2[4][4] равен 123 (массив mass3[3]={'1','2','3'};) то пароль принят.
Если нет то выводит пароль неверный.

Делаю так:

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

if( (mass2[i][j] == mass3[i])&(mass2[i][j] == mass3[i+1])&(mass2[i][j] == mass3[i+2]))  
             
                    {                     
                     lcd_putsf("Parol priniat!");   
                    }
                    else
                   {                     
                     lcd_putsf("Parol nevernyj!");   
                    }
Помогите пожалуйста, как все это делать??
Реклама
Аватара пользователя
vem566
Друг Кота
Сообщения: 4732
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Re: Сравнить два массива в микроконтроллере atmega8

Сообщение vem566 »

if( (mass2[j] == mass3)&(mass2[j+1] == mass3[i+1])&(mass2[j+2] == mass3[i+2]))
Реклама
master3763
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Сб дек 10, 2011 17:45:25
Контактная информация:

Re: Сравнить два массива в микроконтроллере atmega8

Сообщение master3763 »

А как можно тут переделать чтобы получился кодовый замочек? Не хочу работать с EEPROM. Можно ли без EEPROM памяти?

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

#include <mega8.h>
// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>

int i=0,j=0, k=0;
char portState[4]= {0xEF,0xDF,0xBF,0x7F};
char inputState[4]={0x01,0x02,0x04,0x08};
char mass2[4][4]={{'1','2','3','4'},
                  {'5','6','7','8'},
                  {'9','A','B','C'},
                  {'D','E','F','D'}}; 
char mass3[3]={'1','2','3'};  


// Timer 2 output compare interrupt service routine
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{ 
    for(i=0; i<4; i++)
    { 
       PORTD=portState[i];
       for(j=0; j<4; j++)
       { 
          if(((PIND&inputState[j])==0))
          {
             while((PIND&inputState[j])!=inputState[j]){};  
                
                if( (mass2[i][j] == mass3[i])&(mass2[i][j+1] == mass3[i+1])&(mass2[i][j+2] == mass3[i+2])) // ?  
             
                    {                     
                     lcd_putsf("Parol priniat!");   
                    }
                    else
                   {                     
                     lcd_putsf("Parol nevernyj!");   
                    }    
                 
                   lcd_putchar(mass2[i][j]);             // vyvod informatsii (mass2[i][j]) na LCD 
                
                     
          }  
       }                          
    }  
}

void main(void)
{

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State6=T State5=T State4=T State3=T State2=T State1=P State0=P 
PORTC=0x03;
DDRC=0x00;

// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In 
// State7=1 State6=1 State5=1 State4=1 State3=P State2=P State1=P State0=P 
PORTD=0xFF;
DDRD=0xF0;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 7,813 kHz
// Mode: CTC top=OCR2
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x0F;
TCNT2=0x00;
OCR2=0xC3;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x80;


lcd_init(16);

// Global enable interrupts
#asm("sei")
while (1)
      {
          if(PINC.0==0)
          {
          lcd_clear();
          } 
      };
}
master3763
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Сб дек 10, 2011 17:45:25
Контактная информация:

Re: Сравнить два массива в микроконтроллере atmega8

Сообщение master3763 »

Мне нужно сравнить 2 массива. В массиве mass3[3]={'1','2','3'}; хронится пароль доступа который я хочу сравнить с паролем который вбивается через клавиатуру 4х4 (mass2[4][4]). Если пароль верный (равен 123) то на LCD выводится "Parol priniat!" если не верный "Parol nevernyj!" .
Понятно что массив с числом нельзя сравнивать. Поэтому и сравниваю массив с массивом. Только как все это сделать так чтобы работало?
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
vem566
Друг Кота
Сообщения: 4732
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Re: Сравнить два массива в микроконтроллере atmega8

Сообщение vem566 »

if( (mass2[j] == mass3)&(mass2[j+1] == mass3[i+1])&(mass2[j+2] == mass3[i+2]))
Два раза вопрос - два раза ответ.
Можно продолжить.
Реклама
metan
Вымогатель припоя
Сообщения: 593
Зарегистрирован: Ср янв 06, 2010 10:01:46

Re: Сравнить два массива в микроконтроллере atmega8

Сообщение metan »

Лично я бы не стал сравнивать массивы с разной размерностью.
Сделал бы так:
1) храню пароль в епром
2) при старте добываю его оттуда в рам (в одномерный массив1)
3) резервирую место в рам для одномерного массив2
4) читаю с клавы в массив2
5) сравниваю в цикле
6) все

Разумеется, все делал бы, постоянно контролируя границы массивов
Реклама
Аватара пользователя
vem566
Друг Кота
Сообщения: 4732
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Re: Сравнить два массива в микроконтроллере atmega8

Сообщение vem566 »

Тут вообще не понятно. Если
master3763 писал(а):Не хочу работать с EEPROM. Можно ли без EEPROM памяти?
, то получается, что пароль жестко зашит в программу. Смена пароля только новой прошивкой. Это уже не кодовый замок, а просто замок с секретом. Тогда отпадает смысл массивов в принципе. Переходим к константе и не морочим голову.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Сравнить два массива в микроконтроллере atmega8

Сообщение WiseLord »

Кстати, непонятно, что у вас должно происходить в прерывании timer2_comp_isr.

Таймер периодчески вырабатывает прерывания (лень выяснять частоту их по вашим настройкам таймера и даташитам).

Я не пойму, вы хотите чтобы в каждом таком прерывании очень быстро успевали пробежать циклы for(i=0; i<4; i++) и for(j=0; j<4; j++)? Вряд ли получится из-за наличия потенциального зацикливания в while(){};

Задача прерывания - быстро что-то поменять, и закончиться. Внутри обработчиков прерываний разные while() {} весьма нежелательны, иначе прерывание не успеет отработать до следующего по сроку прерывания, которое, в итоге, будет игнорировано.
master3763
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Сб дек 10, 2011 17:45:25
Контактная информация:

Re: Сравнить два массива в микроконтроллере atmega8

Сообщение master3763 »

if( (mass2[j] == mass3)&(mass2[j+1] == mass3[i+1])&(mass2[j+2] == mass3[i+2]))
Два раза вопрос - два раза ответ.
Можно продолжить.


Так не получается.. Мне надо чтобы все цифры (123) проверялись. А тут только первая(1)

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

#include <mega8.h>
// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>

int i=0,j=0;
char portState[4]= {0xEF,0xDF,0xBF,0x7F};
char inputState[4]={0x01,0x02,0x04,0x08};
char mass2[4][4]={{'1','2','3','4'},
                  {'5','6','7','8'},
                  {'9','A','B','C'},
                  {'D','E','F','D'}};
char mass3[3]={'1','2','3'}; 


// Timer 2 output compare interrupt service routine
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
    for(i=0; i<4; i++)
    {
       PORTD=portState[i];
       for(j=0; j<4; j++)
       {
          if(((PIND&inputState[j])==0))
          {
             while((PIND&inputState[j])!=inputState[j]){}; 
               
                if( (mass2[i][j] == mass3[i])&(mass2[i][j+1] == mass3[i+1])&(mass2[i][j+2] == mass3[i+2])) // ? 
             
                    {  
                     lcd_clear();
                     lcd_putchar(mass2[i][j]);    
                     lcd_gotoxy(0,1);
                                       
                     lcd_putsf("Parol priniat!");   
                    }
                    else
                   {  
                     lcd_clear();
                     lcd_putchar(mass2[i][j]);
                     lcd_gotoxy(0,1);
                     lcd_putsf("Parol nevernyj!");
                                         
                        
                    }   
                 
                   // lcd_putchar(mass2[i][j]);              vyvod informatsii (mass2[i][j]) na LCD
               
                     
          } 
       }                         
    } 
}

void main(void)
{

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=P State0=P
PORTC=0x03;
DDRC=0x00;

// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In
// State7=1 State6=1 State5=1 State4=1 State3=P State2=P State1=P State0=P
PORTD=0xFF;
DDRD=0xF0;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 7,813 kHz
// Mode: CTC top=OCR2
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x0F;
TCNT2=0x00;
OCR2=0xC3;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x80;


lcd_init(16);

// Global enable interrupts
#asm("sei")
while (1)
      {
          if(PINC.0==0)
          {
          lcd_clear();
          }
      };
}
Аватара пользователя
vem566
Друг Кота
Сообщения: 4732
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Re: Сравнить два массива в микроконтроллере atmega8

Сообщение vem566 »

Судя по ответу, есть смысл повторить синтаксис языка.
Можно перевести:
ЕСЛИ( (М1[1][1] = M2[1]) И (M1[1][2] = М2[2]) И (M1[1][3] = M2[3]))
Только не понятно зачем, если пароль это константа.
Аватара пользователя
Psych
Опытный кот
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

Re: Сравнить два массива в микроконтроллере atmega8

Сообщение Psych »

Как вариант можно хранить не пароль, а его хэш. Дополнительная защита от взлома(если конечно требуется).
Почему бы не воспользоваться strcmp из библиотеки??
master3763
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Сб дек 10, 2011 17:45:25
Контактная информация:

Re: Сравнить два массива в микроконтроллере atmega8

Сообщение master3763 »

Судя по ответу, есть смысл повторить синтаксис языка.
Можно перевести:
ЕСЛИ( (М1[1][1] = M2[1]) И (M1[1][2] = М2[2]) И (M1[1][3] = M2[3]))
Только не понятно зачем, если пароль это константа.
А вы попробуйте скомпилировать и проверить файл в Proteus. Там только первая цифра (1) выдает результат "Parol priniat!" все остальное в том числе и полный пароль (123) выдает "Parol nevernyj!"

Высылаю все файлы проэкта с Proteus.
Вложения
kod-zamok.rar
(60.24 КБ) 149 скачиваний
metan
Вымогатель припоя
Сообщения: 593
Зарегистрирован: Ср янв 06, 2010 10:01:46

Re: Сравнить два массива в микроконтроллере atmega8

Сообщение metan »

master3763 писал(а):А вы попробуйте скомпилировать и проверить файл в Proteus
Навряд ли кто захочет тестировать в протеусе программу, написанную в таком стиле (с трешем внутри прерывания я имею ввиду).
И еще. Посмотрите в справочнике использование оператора &. Кто дает советы тоже :)
Михаил31
Родился
Сообщения: 2
Зарегистрирован: Сб май 12, 2012 22:45:42

Re: Сравнить два массива в микроконтроллере atmega8

Сообщение Михаил31 »

По своему опыту – еще можно попробовать вот сюда обратиться: dx-dy.ru - решение задач по программированию относительно программирования различных устройств. Быстро подскажут.
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: Сравнить два массива в микроконтроллере atmega8

Сообщение BCluster »

А как вообще можно сравнивать два массива разной размерности? Они никогда не будут равны.
Аватара пользователя
C@at
Вымогатель припоя
Сообщения: 652
Зарегистрирован: Вс ноя 13, 2011 16:42:05
Откуда: Украина

Re: Сравнить два массива в микроконтроллере atmega8

Сообщение C@at »

master3763 писал(а): Понятно что массив с числом нельзя сравнивать. Поэтому и сравниваю массив с массивом. Только как все это сделать так чтобы работало?
Массивы принципиально?, для кодового замка такого уровня, можно просто сравнить сумму двух чисел.

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

//Например правильный код 4,5,6

unsigned int   M1=4,M2=5,M3=6;

 if ( ((M1*100) + M2*10) + M3 == ((4*100) + 5*10) + 6)) { "Parol priniat!" }else  {  "Parol nevernyj!"   };


Ответить

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