Страница 1 из 1

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

Добавлено: Вт янв 28, 2014 20:04:41
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!");   
                    }
Помогите пожалуйста, как все это делать??

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

Добавлено: Вт янв 28, 2014 20:39:35
vem566
if( (mass2[j] == mass3)&(mass2[j+1] == mass3[i+1])&(mass2[j+2] == mass3[i+2]))

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

Добавлено: Ср янв 29, 2014 00:43:44
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();
          } 
      };
}

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

Добавлено: Ср янв 29, 2014 01:33:30
master3763
Мне нужно сравнить 2 массива. В массиве mass3[3]={'1','2','3'}; хронится пароль доступа который я хочу сравнить с паролем который вбивается через клавиатуру 4х4 (mass2[4][4]). Если пароль верный (равен 123) то на LCD выводится "Parol priniat!" если не верный "Parol nevernyj!" .
Понятно что массив с числом нельзя сравнивать. Поэтому и сравниваю массив с массивом. Только как все это сделать так чтобы работало?

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

Добавлено: Ср янв 29, 2014 06:05:51
vem566
if( (mass2[j] == mass3)&(mass2[j+1] == mass3[i+1])&(mass2[j+2] == mass3[i+2]))
Два раза вопрос - два раза ответ.
Можно продолжить.

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

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

Разумеется, все делал бы, постоянно контролируя границы массивов

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

Добавлено: Ср янв 29, 2014 11:40:18
vem566
Тут вообще не понятно. Если
master3763 писал(а):Не хочу работать с EEPROM. Можно ли без EEPROM памяти?
, то получается, что пароль жестко зашит в программу. Смена пароля только новой прошивкой. Это уже не кодовый замок, а просто замок с секретом. Тогда отпадает смысл массивов в принципе. Переходим к константе и не морочим голову.

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

Добавлено: Ср янв 29, 2014 12:08:47
WiseLord
Кстати, непонятно, что у вас должно происходить в прерывании timer2_comp_isr.

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

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

Задача прерывания - быстро что-то поменять, и закончиться. Внутри обработчиков прерываний разные while() {} весьма нежелательны, иначе прерывание не успеет отработать до следующего по сроку прерывания, которое, в итоге, будет игнорировано.

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

Добавлено: Ср янв 29, 2014 12:55:31
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();
          }
      };
}

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

Добавлено: Ср янв 29, 2014 13:19:45
vem566
Судя по ответу, есть смысл повторить синтаксис языка.
Можно перевести:
ЕСЛИ( (М1[1][1] = M2[1]) И (M1[1][2] = М2[2]) И (M1[1][3] = M2[3]))
Только не понятно зачем, если пароль это константа.

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

Добавлено: Ср янв 29, 2014 14:00:37
Psych
Как вариант можно хранить не пароль, а его хэш. Дополнительная защита от взлома(если конечно требуется).
Почему бы не воспользоваться strcmp из библиотеки??

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

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

Высылаю все файлы проэкта с Proteus.

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

Добавлено: Ср янв 29, 2014 15:42:51
metan
master3763 писал(а):А вы попробуйте скомпилировать и проверить файл в Proteus
Навряд ли кто захочет тестировать в протеусе программу, написанную в таком стиле (с трешем внутри прерывания я имею ввиду).
И еще. Посмотрите в справочнике использование оператора &. Кто дает советы тоже :)

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

Добавлено: Вт фев 18, 2014 13:35:58
Михаил31
По своему опыту – еще можно попробовать вот сюда обратиться: dx-dy.ru - решение задач по программированию относительно программирования различных устройств. Быстро подскажут.

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

Добавлено: Вт фев 18, 2014 17:25:48
BCluster
А как вообще можно сравнивать два массива разной размерности? Они никогда не будут равны.

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

Добавлено: Вт фев 18, 2014 17:44:23
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!"   };