Простая сигналка - помогите пожалуйста с кодом.Attiny2313

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
ArtemKolesnikov
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Вс фев 26, 2012 10:53:30

Простая сигналка - помогите пожалуйста с кодом.Attiny2313

Сообщение ArtemKolesnikov »

Всем привет!
Я новичок в микроконтроллерах.
Собираю свой второй "Hello World" - миниатюрно-примитивную сигнализацию на Attiny2313.
Написал код, да вот че-то сомневаюсь в его рациональности.
Помогите пожалуйста упростить.
Логика:
Ничего не делаем, до тех пор, пока нет возмещения (не открыта дверь)
Как только есть возмущение - бъем тревогу.
И бъем тревогу эту до тех пор, пока возмущение не пропадет, и еще 5 минут после этого (для упрощения примера - 5 сек).
Если по истечению 5 минут (5 СЕК) все спокойно - все спокойно, то переходим в сторожевой режим.(ничего не делаем).

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

DDRD = 0xff;            /* все выводы порта D сконфигурировать как выходы */
  /* DDRB = 0x00;            все выводы порта B сконфигурировать как входы */    
		while (1) 
		{              // Бесконечный цикл
if (PINB != 0x00)		//Если первый бит порта Б не равен 0 (есть напряжение на входе)
						//(Если кто-то пришел и открыл дверь)
{
while (PINB != 0x00) 

           {
			   // И до тех пор, пока н закроют дверь - Включаем режим "тревога"
		       if (PIND != 0x01) PORTD = 0x01; //и его не выключаем во что бы то ни стало.
			   
		   }			
	            //Как только цикл закончится - дверь закроют, терпим время и возвращаем все в режим.
			   _delay_ms(5000);   // Ждем 5 сек.
			   PORTD = 0x00;  /* устанавливаем "спокойствие" */
				}                

		}       // закрывающая скобка бесконечного цикла

   }      // закрывающая скобка основной программы
Реклама
c717411
Встал на лапы
Сообщения: 148
Зарегистрирован: Ср дек 29, 2010 21:19:03

Re: Простая сигналка - помогите пожалуйста с кодом.Attiny23

Сообщение c717411 »

Рациональнее использовать прерывания для включения "тревоги", чтобы контроллер не молотил проверки в вечном цикле.
Реклама
Аватара пользователя
Shapa
Встал на лапы
Сообщения: 127
Зарегистрирован: Пт июн 20, 2008 09:38:05
Откуда: Харьков
Контактная информация:

Re: Простая сигналка - помогите пожалуйста с кодом.Attiny23

Сообщение Shapa »

ArtemKolesnikov У вас есть достаточно серьёзное место в программе, серьёзное в смысле допущенной ошибки. Вы пытаетесь узнать состояние конкретного бита, Но сравниваете весь байт. Прежде чем сравнивать, вам нужно выделить тот самый, нужный вам бит. Например датчик у вас весит на PB2, значит будет так:

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

If(PINB & _BV(PB2)) 
или
if(PINB & 4)
здесь мы веделяем значение конкретного бита, а не всего байта.
Кстати заметил у вас

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

  if (PIND != 0x01)
при том, что все биты порта Д натсроены как выходы. Это как поинмать?
ArtemKolesnikov
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Вс фев 26, 2012 10:53:30

Re: Простая сигналка - помогите пожалуйста с кодом.Attiny23

Сообщение ArtemKolesnikov »

Спасибо за советы!
Shapa писал(а):Shapa
if (PIND != 0x01)
Это я на всякий случай, вдруг каким-то боком на PIND исчезнет лог.1...
Возможно не нужно, глупо конечно...
Извините за глупый вопрос, а if(PINB & 4) что мы делаем?
Поразрядно "умножаем " значение PINB и 0b0100 и если не нулевой результат, тогда что-то делаем...?
То есть, чтобы не сравнивать все значение байта, мы этим "И" сразу ограничиваем его конкретным битом, как бы приводим все значение к этому биту, так получается?
То есть, если вдруг PINB == 0b00000110, а нам надо только 0b00000100 (4), то поразрядно умножая все равно получим: 0b00000100, я правильно рассуждаю?

Хочу разобраться в таких мелочах, после "учебного" Паскаля тяжеловато С изучать...
Пошел читать про прерывания...
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Shapa
Встал на лапы
Сообщения: 127
Зарегистрирован: Пт июн 20, 2008 09:38:05
Откуда: Харьков
Контактная информация:

Re: Простая сигналка - помогите пожалуйста с кодом.Attiny23

Сообщение Shapa »

ArtemKolesnikov писал(а): Это я на всякий случай, вдруг каким-то боком на PIND исчезнет лог.1...
Возможно не нужно, глупо конечно...
Извините за глупый вопрос, а if(PINB & 4) что мы делаем?
Поразрядно "умножаем " значение PINB и 0b0100 и если не нулевой результат, тогда что-то делаем...?
То есть, чтобы не сравнивать все значение байта, мы этим "И" сразу ограничиваем его конкретным битом, как бы приводим все значение к этому биту, так получается?
То есть, если вдруг PINB == 0b00000110, а нам надо только 0b00000100 (4), то поразрядно умножая все равно получим: 0b00000100, я правильно рассуждаю?
Глупых вопрос не бывает. Всякого случая не будет (вернее он может быть, но это значит что у вас процессор уже умер). То, что вы называете "поразрядно умножаем" есть Логическое "И". Посмотрите логические операнды &, |, !, ~, ^, что это, зачем нужны и какие таблицы истиности у них. К примеру, для &("И")
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

Вы абсолютно верно рассуждаете про то, как это работает.
Реклама
ArtemKolesnikov
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Вс фев 26, 2012 10:53:30

Re: Простая сигналка - помогите пожалуйста с кодом.Attiny23

Сообщение ArtemKolesnikov »

Всем еще раз привет!
Начитался про прерывания, за совет использования которых отдельное спасибо c717411.
Значит, схему решил немного изменить. Сигнал от датчика - это будет сигнал НИЗКОГО уровня . А нужно это для того, чтобы, если после того, как одно событие обработается, если сигнал продолжает поступать, сразу вызвался новый обработчик события.
Просто с другими условиями срабатывания (спадающий фронт, нарастающий фронт, любое логическое изменение) у меня не получается это сделать, да и не получится. Эти события иногда проходят можно сказать один раз, например, нажали кнопку и держим - событие то одно! А вдруг мы будем держать до ишачей пасхи! Обработчик больше не будет вызываться, а мне это не нужно. Это я в протеусе наблюдал.
Я предполагаю, что с низким уровнем этой проблемы нет - если он (низкий уровень) есть, значит и есть событие. ЭТО Я предполагаю, на самом деле не знаю как оно в реальности, в протеусе пока этот вариант не моделировал.
Низкий уровень будет отслеживаться на INT1.
Вот набросал код, ребята, взгляните пожалуйста. Что не так?

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

#define F_CPU 8000000UL
#include <iom8.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
//определяем биты регистров
#define ISC10 2 //Это будет второй бит в MCUCR
#define ISC11 3 //А это третий
#define INT1 7 // Это будет седьмой бит в GICR 
unsigned char int1 = 0;

ISR(INT1_vect) //обработка прерывания
{
cli(); // Запрещаем другие прерывания
PORTD = 0x01; //Включаем тревогу
_delay_ms(5000);   // Ждем 5 сек.
PORTD = 0x00;  /* устанавливаем "спокойствие" */
sei(); //устанавливаем бит глобального разрешения прерываний
        int1++;
}
//функция инициализация внешнего прерывания
void INTinit()
{
MCUCR = (0<<ISC10) | (0<<ISC11);//0b00000000  - Прерывание будет при появлении логического 0 на ИНТ1
GICR = (1<<INT1);//0b10000000
}
int main (void){
        INTinit();//вызываем функцию инициализации прерывания
        sei();//устанавливаем бит глобального разрешения прерываний
// И все. А что тут еще делать?
    }
    return 0;
}
Реклама
Аватара пользователя
Shapa
Встал на лапы
Сообщения: 127
Зарегистрирован: Пт июн 20, 2008 09:38:05
Откуда: Харьков
Контактная информация:

Re: Простая сигналка - помогите пожалуйста с кодом.Attiny23

Сообщение Shapa »

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

void INTinit()
{
MCUCR = (0<<ISC10) | (0<<ISC11);//0b00000000  - Прерывание будет при появлении логического 0 на ИНТ1
GICR = (1<<INT1);//0b10000000
}
откройте 60 страничку даташита на тини2313. Там пишут, чтоб чтоб включить что-то нужно 1 написать. Вы не верные значение в MCUCR пишете.

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

int main (void){
        INTinit();//вызываем функцию инициализации прерывания
        sei();//устанавливаем бит глобального разрешения прерываний
// И все. А что тут еще делать?
        return 0;
}
Честно гворя я сейчас задал сам себе вопрос, который н не чем проверить. Воткните перед возвратом while(1); Я правда не знаю, что произойдёт после после завершния мэйна
ArtemKolesnikov
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Вс фев 26, 2012 10:53:30

Re: Простая сигналка - помогите пожалуйста с кодом.Attiny23

Сообщение ArtemKolesnikov »

[quote="Shapa"][/quote]
Спасибо!
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»