Страница 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'}};
и
Массив 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!" };