Перейти к содержанию

Кодовый Замок На Atmega 328


Рекомендуемые сообщения

Здравствуйте форумчане)

Недавно начал заниматься микроконтроллерами. Решил сделать кодовый замок по книге Белов А.В. - "Самоучитель разработчика устройств на микроконтроллерах AVR."

Так вот, хочу реализовать его на ATmega328P-PU c использованием Atmel Studio.

Ниже код в СV

/*
* Kodovii_zamok.c
* Version: 1
* Created: 17.02.2015 13:57:56
* Author: Белов А.В. - Самоучитель разработчика устройств на микроконтроллерах AVR
* Chip type: Tiny2313
*/

#include <tiny2313.h>
#define klfree 0x77f
#define kzad 3000
#define kandr 20
#define bsize 30
unsigned char flz;
unsigned int bufr[bsize];
#pragma warn-
eeprom unsigned char klen;
eeprom unsigned int bufe[bsize];
#pragma warn-
interrupt[TIM1_OVF] void timer1_ovf_isr(void){

flz=1;
}
interrupt[TIM1_COMPA] void timer1_compa_isr(void){

flz=1;
}

unsigned int incod (void)
{
unsigned int cod0=0;
unsigned int cod1;
unsigned char k;
for (k=0;k<kandr;k++)
{
cod1=PINB&amp;amp;0x7;
cod1=(cod1<<8)+(PIND&amp;amp;0x7F);
if (cod0!=cod1)
{
k=0;
cod0=cod1;
}
}
return cod1;
}
void wait (unsigned char kodz)
{
if (kodz==1) TIMSK=0x40;
else TIMSK=0x80;
TCNT1=0;
flz=0;
#asm("sei");
if (kodz!=2) while(flz==0);
}
void main(void)
{
unsigned char ii;
unsigned char i;
unsigned int codS;

PORTB=0xE7;
DDRB=0x18;

PORTD=0x7F;
DDRD=0x00;

TCCR1A=0x00;
TCCR1B=0x03;
TCNT1=0;
DCR1A=kzad;

ACSR=0x80;

while(1)
{
m1: while(incod()!=klfree);
while(incod()==klfree);
ii=0;
m2: #asm("cli");
wait(1);
codS=incod();
bufr[ii++]=codS;
if(ii>=bsize)goto m4;

wait(2);
m3: if(incod()!=codS)goto m2;
if(flz==0) goto m3;

m4: if(PINB.7==1) goto comp;

klen=ii;
for(i=0; i<ii; i++) bufe[i]=bufr[i];
goto zamok;

comp: if(klen!=ii) goto m1;
for(i=0; i<ii; i++)
if(bufe[i]!=bufr[i]) goto m1;

zamok: PORTB.4=1;
wait(3);
PORTB.4=0;
}
}

Ниже я пытался его перенести в студию на язык Си

#define F_CPU 8000000
#include <avr/io.h>
#include <avr/eeprom.h>
#include <avr/interrupt.h>
#define klfree 0x77f
#define kzad 3000
#define kandr 20
#define bsize 30
unsigned char flz;
unsigned int bufr[bsize];
//#pragma warning (default)
EEMEM unsigned char klen;
EEMEM unsigned int bufe[bsize];
//#pragma warning (default)

ISR(TIMER0_OVF_vect)
{
flz=1;
}
ISR(TIMER0_COMPA_vect)
{
flz=1;
}

unsigned int incod (void)
{
unsigned int cod0=0;
unsigned int cod1;
unsigned char k;
for (k=0;k<kandr;k++)
{
cod1=PINB &amp;amp; 0x7;
cod1=(cod1<<8)+(PIND &amp;amp; 0x7F);
if (cod0!=cod1)
{
k=0;
cod0=cod1;
}
}
return cod1;
}
void wait (unsigned char kodz)
{
if (kodz==1)
TIMSK0=0x40;
else
TIMSK0=0x80;
TCNT0=0;
flz=0;
asm("sei");
if (kodz!=2)
while(flz==0);
}
int main(void)
{


unsigned char ii;
unsigned char i;
unsigned int codS;

PORTB=0xA7;
DDRB=0x40;

PORTD=0x7F;
DDRD=0x00;

TCCR0A=0x00;
TCCR0B=0x03;
TCNT0=0;
OCR0A=kzad;

ACSR=0x80;

while(1)
{
m1: while(incod()!=klfree);
while(incod()==klfree);
ii=0;
m2: asm("cli");
wait(1);
codS=incod();
bufr[ii++]=codS;
if(ii>=bsize)goto m4;

wait(2);
m3: if(incod()!=codS)goto m2;
if(flz==0) goto m3;

m4: if(PINB |= (1<<7)) goto comp;

klen=ii;
for(i=0; i<ii; i++)
bufe[i]=bufr[i];
goto zamok;

comp: if(klen!=ii) goto m1;
for(i=0; i<ii; i++)
if(bufe[i]!=bufr[i]) goto m1;

zamok: PORTB |= (1<<6);
wait(3);
PORTB &=~(1<<6);
}
}

не работает(

Посоветуйте как заставить этот код работать)

post-187398-0-79631100-1424682543.gif

Изменено пользователем NemoS
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Очевидно, разобраться, почему не работает и исправить. Поиск багов - важная часть программирования, не стоит ее переносить на форум, да еще с дурацким описанием "не работает". Если "не работает" вообще, в контроллер заливается тестовая прошивка, которая не работать не может, проверяются отдельные блоки кода и железа, определяется что конкретно не работает, и это место исправляется.

На первый взгляд, важное отличие в использовании EEPROM, то есть EEMEM x; x=1; в avr-gcc не приведет к физической записи нового значения в ПЗУ.

Конструкция

unsigned char flz;
ISR(TIMER0_OVF_vect){
 flz;
}

также выглядит весьма странно, что в первоисточнике (кстати, а он работал?) что в переделанном. Странно, что у вас компилятор на это не ругался. Ну и, разумеется , если переменная используется в прерывании и в main (возможно, через функции), ее надо объявлять как volatile.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Очевидно, разобраться, почему не работает и исправить. Поиск багов - важная часть программирования, не стоит ее переносить на форум, да еще с дурацким описанием "не работает".

Вы меня конечно извините, но я думал это раздел для тех кто только начал осваивать микроконтроллеры, и рассчитывал на помощь. Но видимо я ошибся.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Если есть желание осваивать, так лучше писать свое, тем более кодовый замок (по крайней мере в виде модели) является достаточно простым устройством. А простое повторение чужих устройств может научить разве что пайке. От того, что вам здесь напишут готовое решение, у вас знаний не прибавится. Проанализируйте свой код, как он должен работать и как работает, на каком этапе возникает различие, откуда оно возникает и как его устранить.

Ну и отношение к невероятно информативному описанию неисправности "не работает" я уже написал.

Проверить можно в симуляторах (та же Студия или Протеус). Еще один интересный момент в исходном коде, вызывающий вопрос "оно вообще работать способно?":

unsigned char flz; //модификатора volatile нет, поэтому на изменение переменной в прерывании остальная программа может плевать

*interrupt[TIM1_OVF] void timer1_ovf_isr(void){ //Что в cvavr значит * перед interrupt я не знаю, но вряд ли эта конструкция правильная
flz; //эта конструкция не делает ничего
}
interrupt[TIM1_COMPA] void timer1_compa_isr(void){
flz; //эта тоже
}
...
void wait (unsigned char kodz){
if (kodz==1) TIMSK=0x40;else TIMSK=0x80;TCNT1=0; //прошу прощения, что слегка отформатировал
flz=0; //обнуляем переменную ...
#asm("sei"); // ...включаем прерывания...
if (kodz!=2) while(flz==0); //... и в случае kodz!=2 зацикливаемся, пока переменная не изменится. А меняться ей не с чего: возврата в основную программу не происходит, а в прерываниях переменная не меняется. А если бы и менялась, без volatile этот кусок кода запросто мог игнорировать изменения. Собственно, какой-нибудь компилятор вправе оптимизировать его до while(1){}
}

Изменено пользователем COKPOWEHEU

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

у меня есть эта книга, автор белов,

то что вы написали в первом посте, с книгой ну никак не сходится и работать не будет хотябы потому что вы навставляли в код который написан на Си кучу вставок на ассме

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

почитайте внимательно эту книгу она впринципе не плохо написана

Не знаеш как? Спроси у Google'а !!!

Ссылка на комментарий
Поделиться на другие сайты

*interrupt[TIM1_OVF] void timer1_ovf_isr(void)

этот кусочек я поправил. Убрал звездочку. Это моя ошибка, извините. Протеусом я конечно пользуюсь. Согласен что конструкции с прерываниями не делают ничего.Выбрал пример с кодовым замком по 2м причинам. 1. Это довольно простой пример.2. Использовать по назначению.И еще момент. Если возможно, меня интересует только Atmel Studio, а не CVAVR.Да, конечно, у меня есть желание осваивать микроконтроллеры. Я считаю так, пака я не разберусь с простым примером ( в моем случае кодовый замок) нет смысла двигаться дальше. По этому я пришел сюда за помощью.

interrupt[TIM1_OVF] void timer1_ovf_isr(void){
flz=1;
}
interrupt[TIM1_COMPA] void timer1_compa_isr(void){
flz=1;
}

Тоже изменил, моя ошибка(

Изменено пользователем NemoS
Ссылка на комментарий
Поделиться на другие сайты

post-166713-0-00605300-1424706807_thumb.jpg

покажите мне где вы в коде увидели метки

m2:

m3:

m4:

и тому подобные

Изменено пользователем Viktor26

Не знаеш как? Спроси у Google'а !!!

Ссылка на комментарий
Поделиться на другие сайты

у меня есть эта книга, автор белов,

то что вы написали в первом посте, с книгой ну никак не сходится и работать не будет хотябы потому что вы навставляли в код который написан на Си кучу вставок на ассме

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

почитайте внимательно эту книгу она впринципе не плохо написана

Эта книга издавалась кажется 3 раза, они у меня есть, и год издания у них разный. я взял за 2008.

Viktor26

Вы видимо смотрите кодовый замок с мелодией.

Ссылка на комментарий
Поделиться на другие сайты

вы поймите что в Си так подпрограммы не делаются как вы это сделали, вы или на ассме пишите или на Си

не надо все в кучу сваливать

перелистнул страницу, и вправду, есть эти метки,

ща с диска загружу этот проект побробую,

но чота он сомнительный какойто

Изменено пользователем Viktor26

Не знаеш как? Спроси у Google'а !!!

Ссылка на комментарий
Поделиться на другие сайты

компилятор CV ругается, на готовый исходник с диска который шел вместе с книгой.

:unknw: :unknw: :unknw:

это для меня нонсенс, неужели автор не проверял свои проекты???

не реклама, попробуйте этот, у него клава матричная, он интереснее

http://datagor.ru/microcontrollers/1865-kodovyy-zamok.html

Изменено пользователем Viktor26

Не знаеш как? Спроси у Google'а !!!

Ссылка на комментарий
Поделиться на другие сайты

компилятор CV ругается, на готовый исходник с диска который шел вместе с книгой. :unknw: :unknw: :unknw: это для меня нонсенс, неужели автор не проверял свои проекты???

Ну я этому не удивлен, Для меня это обычное явление.

не реклама, попробуйте этот, у него клава матричная, он интереснее

http://datagor.ru/mi...ovyy-zamok.html

Ну тоже не плохо. Но хотелось бы разобраться с этим. Буду дальше ковыряться. :umnik2:

Изменено пользователем NemoS
Ссылка на комментарий
Поделиться на другие сайты

Вообще, такое использование меток не является хорошим стилем программирования, наверняка их можно заменить на циклы.

В названии темы контроллер ATmega328, в схеме ATtiny2313, чему верить?

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Это - вообще не Си. Это - подъ...ка...Тупая попытка перенести ASM-код на Си. За такие примеры программ убивать нужно. Автор тупо все достоинства Си опустил таким кодом. Вот после таких книг и появляются вопли : "Си - г...но, Си - гемор" и.т.д. Вот "аффтары" подобных "книг" потом начинают еб..ть мозг, типа : "В нашем платном курсе Ваши программы станут ещё эффективнее". А более всего угнетает непонимание начинающих, что всё нужно изучать от самых истоков, а не с Предко и Беловых.

Ну тоже не плохо. Но хотелось бы разобраться с этим. Буду дальше ковыряться. :umnik2:

Нет там ничего хорошего. Такое-же г...но. Лично мне хватило одного вступления: "Работаю я электромонтером в районе Крайнего Севера. Зимой у нас всегда возникала проблема, замерзает замок на входе в электроцех. И вот попался мне на глаза журнал «Радио» №5 за 2008 год. Там была опубликована статья Е. Переверзева «Цифровой кодовый замок»."

Это - уже, IMHO, диагноз. Прочтите нормальную книгу. Соберите хоть что-то не из убогого "Радио", а хоть из чего-то реально работающего, идеально что-то из Application notes любой фирмы, там ребята за работу отвечают.

Изменено пользователем shindbad
Ссылка на комментарий
Поделиться на другие сайты

Попробую написать код с нуля, используя схему из книги Белова. Еще бы грамотную книжку найти по программированию микроконтроллеров на Си. Сколько книг не смотрел в основном все на ассемблере.

Ссылка на комментарий
Поделиться на другие сайты

Это - вообще не Си. Это - подъ...ка...Тупая попытка перенести ASM-код на Си...

Автор тупо все достоинства Си опустил таким кодом...

Что ж Вы так жестоко? Метки тут совсем не эхо Ассма. Они часть Си и требуются для оператора goto. Вы совершенствуютесь постоянно, а книга остается на уровне того времени, когда была написана. Стыдно ругать учителя, если ученик превзошел его.

Сколько книг не смотрел в основном все на ассемблере.

Потому что грамотное программирование только на нем и возможно. :)

.... Только не бейте... :D

Ссылка на комментарий
Поделиться на другие сайты

ничего сложного там нет, книгу Евстифеева распечатал, и радуюсь сижу, надо было сразу с ассма начинать

msg-166713-0-00772200-1424859008_thumb.jpg

Не знаеш как? Спроси у Google'а !!!

Ссылка на комментарий
Поделиться на другие сайты

ничего сложного там нет, книгу Евстифеева распечатал, и радуюсь сижу, надо было сразу с ассма начинать

Еще советовали книгу автор А.В. Евстифеев: Микроконтроллеры AVR семейства Mega. Это как справочник.

Я пока учусь по видеоурокам, Хорошие уроки дает Паялник П.

Надеюсь проект с кодовым замком я завершу) :yes:

Ссылка на комментарий
Поделиться на другие сайты

Что ж Вы так жестоко? Метки тут совсем не эхо Ассма. Они часть Си и требуются для оператора goto.

Поскольку в Си метки и goto нужны крайне редко (а для начинающих - не нужны вовсе), в данном случае это именно эхо Асма.

Попробую написать код с нуля, используя схему из книги Белова. Еще бы грамотную книжку найти по программированию микроконтроллеров на Си. Сколько книг не смотрел в основном все на ассемблере.

Возможно стоит сначала освоить сам язык, без привязки к контроллерам, а уже потом вникать в тонкости. Ну и ассемблер не сложнее Си, только листинг получается длиннее, а конечная прошивка - короче.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Возможно стоит сначала освоить сам язык, без привязки к контроллерам, а уже потом вникать в тонкости. Ну и ассемблер не сложнее Си, только листинг получается длиннее, а конечная прошивка - короче.

В свое время я изучал язык С++, писал простые программки. Некоторое представление имею.

У меня вот вопросик: для внешних прерываний используются ( в атмеге 328) только INT0 и INT1?

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...