Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы

Как программно отследить появление логического нуля на входе /Reset?

Непрочитано 09.01.2014, 16:55  
Godzilla82
Почётный гражданин KAZUS.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Как программно отследить появление логического нуля на входе /Reset?

Я обычно делаю так:

PHP код:
 
begin:
if(PINA.0 == 0)  {
                 //действия или установка флагов для кнопки на PINA.2
                 delay_ms(50);
                 while(PINA.0 == 0);
                 }
delay_ms(50);
goto begin; 
Это всё в main().
Реклама:

Последний раз редактировалось Godzilla82; 09.01.2014 в 16:58.
Godzilla82 вне форума  
Сказали "Спасибо" Godzilla82
Fraktal (09.01.2014)
Непрочитано 09.01.2014, 21:05  
Fraktal
Временная регистрация
 
Регистрация: 21.02.2013
Сообщений: 87
Сказал спасибо: 70
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Fraktal на пути к лучшему
По умолчанию Re: Как программно отследить появление логического нуля на входе /Reset?

Сообщение от Boba_spb Посмотреть сообщение
И применение такой конструкции PORTD=(~1‹‹PD0)|(~1‹‹PD1)|(~1‹‹PD2)|(~1‹‹PD4 ) вызывает большое сомнение. Так как устанавливает все биты "окромя" , указанных четырех.
Мне так и нужно все биты установить, а эти четыре бита сбросить в ноль так как эти пины привязаны на общий катод 4-рех циферного 7-ми сегментного идикатора (индикатор тогда отображает информацию)
и да PORTD=(~1‹‹PD0)|(~1‹‹PD1)|(~1‹‹PD2)|(~1‹‹PD4 ) = E8

Последний раз редактировалось Fraktal; 09.01.2014 в 21:24.
Fraktal вне форума  
Непрочитано 09.01.2014, 21:48  
Fraktal
Временная регистрация
 
Регистрация: 21.02.2013
Сообщений: 87
Сказал спасибо: 70
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Fraktal на пути к лучшему
По умолчанию Re: Как программно отследить появление логического нуля на входе /Reset?

ForcePoint, я без кубиков начал писать, как - то недолюбливаю я их , хотя когда прижимает то обращаю свой взор на них для понятия общей картины структуры программы. Но и то только в том случае если я на 5% разбираюсь в синтаксисе языка на котором буду писать и 30% если разбираюсь в технологии выполняемой работы : что нужно сделать для получения требуемого результата. А мой опыт работы с микроконтроллерами включал в себя только написание программы для MS 51 МК которая выполняла арифметические действия с тремя переменными.
Что такое порты и прерывания , Hi-Z и PullUp, Pin , Port и DDR"X" - эта информация меня пугала как самолет аборигена. Вот поэтому эта программка родилась из нескольких этапов
1)моргнуть диодами
2)вывести число на 4-х разрядный индикатор
3)вывести число на 7-ми сегментный 4-х цифровой индикатор
4)Выводится каша на индикатор (нуна разобраться)
5)как синхронизировать вывод числа и подачу низкого уровня напряжения на нужный индикатор для катода а на все остальные катоды высокое напряжение
6)А как заставить кнопку вкл/выкл обработку программы

Так что с такими знаниями мне было в начале не до блок-схемы )))) . А когда уже разобрался со всеми пунктами выше приведенными уже сформировался костяк программы , конечно не для коммерческого использования . Ну а теперь на ближайшее будущее буду заполнять пробелы в знаниях про AVR и уже писать программы с заранее обдуманным алгоритмом.
Fraktal вне форума  
Непрочитано 09.01.2014, 21:56  
Boba_spb
Почётный гражданин KAZUS.RUN
 
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию Re: Как программно отследить появление логического нуля на входе /Reset?

Сообщение от Fraktal Посмотреть сообщение
Мне так и нужно все биты установить, а эти четыре бита сбросить в ноль так как эти пины привязаны на общий катод 4-рех циферного 7-ми сегментного идикатора (индикатор тогда отображает информацию)
и да PORTD=(~1‹‹PD0)|(~1‹‹PD1)|(~1‹‹PD2)|(~1‹‹PD4 ) = E8
Ну вот это, как бы не хотелось ,равно не 0xE8, а 0хFF;

что б получить 0хE8 надо бы написать либо, как поправили меня ранее,
PORTD=~ ( (1‹‹PD0) | (1‹‹PD1) | (1‹‹PD2) | (1‹‹PD4 ) );

или
PORTD=(~1‹‹PD0) & (~1‹‹PD1) & (~1‹‹PD2) & (~1‹‹PD4 ) ;
Boba_spb вне форума  
Сказали "Спасибо" Boba_spb
Fraktal (09.01.2014)
Непрочитано 09.01.2014, 22:07  
Fraktal
Временная регистрация
 
Регистрация: 21.02.2013
Сообщений: 87
Сказал спасибо: 70
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Fraktal на пути к лучшему
По умолчанию Re: Как программно отследить появление логического нуля на входе /Reset?

Boba_spb, извиняюсь не ту строку скопировал : PORTD=((1‹‹PD0)|(1‹‹PD1)|(1‹‹PD2)|(1‹‹PD4))= 0X17 а выражение
PORTD=(~1‹‹PD0)|(~1‹‹PD1)|(~1‹‹PD2)|(~1‹‹PD4 ) = E8
Уже глаз замылился
Fraktal вне форума  
Непрочитано 09.01.2014, 22:36  
Godzilla82
Почётный гражданин KAZUS.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Как программно отследить появление логического нуля на входе /Reset?

Сообщение от Fraktal Посмотреть сообщение
выражение
PORTD=(~1‹‹PD0)|(~1‹‹PD1)|(~1‹‹PD2)|(~1‹‹PD4 ) = E8
Для кого пишу... Не в коня корм...

Код:
11111110
11111100
11111000
11100000
---------
11111110
0b11111110 =254 = 0xFE (никак не 0xE8 )
Godzilla82 вне форума  
Сказали "Спасибо" Godzilla82
Fraktal (09.01.2014)
Непрочитано 09.01.2014, 22:48  
Fraktal
Временная регистрация
 
Регистрация: 21.02.2013
Сообщений: 87
Сказал спасибо: 70
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Fraktal на пути к лучшему
По умолчанию Re: Как программно отследить появление логического нуля на входе /Reset?

Godzilla82, а если так ? PORTD&=(~1‹‹PD0)|(~1‹‹PD1)|(~1‹‹PD2)|(~1‹‹PD4 )
то это получается
11111110
11111100
11111000
11100000
---------
11111110 = 0xFE
PORTD&0XFE = СМОТРЯ ЧТО бЫЛО в порту D ?


Все проверил : PORTD&0XFE = СМОТРЯ ЧТО бЫЛО в порту D!!!!
а именно будет в порту PORTD ЗНАЧЕНИЕ =0XFE после этой операции
PORTD&=(~1‹‹PD0)|(~1‹‹PD1)|(~1‹‹PD2)|(~1‹‹PD4 )

Последний раз редактировалось Fraktal; 09.01.2014 в 22:57.
Fraktal вне форума  
Непрочитано 09.01.2014, 22:53  
Fraktal
Временная регистрация
 
Регистрация: 21.02.2013
Сообщений: 87
Сказал спасибо: 70
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Fraktal на пути к лучшему
По умолчанию Re: Как программно отследить появление логического нуля на входе /Reset?

Godzilla82, теперь вкурил побитовые операции на СИ
Fraktal вне форума  
Непрочитано 09.01.2014, 23:05  
Godzilla82
Почётный гражданин KAZUS.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Как программно отследить появление логического нуля на входе /Reset?

Сообщение от Fraktal Посмотреть сообщение
Godzilla82, теперь вкурил побитовые операции на СИ
Для установки бита X порта Y обычно пишут:
PHP код:
PORTY |= (1‹‹X); 
Это равносильно записи:
PHP код:
PORTY = PORTY | (1‹‹X); 
Побитовая операция ИЛИ (|) - установит биты (в данном случае 1 бит) (1‹‹X)

пример:
X=2;
(1 ‹‹ 2 ) = ( 0b00000001 ‹‹ 2 ) = 0b00000100


Для сброса бита порта (установки этого бита в 0) обычно применяют:
PHP код:
PORTY &= ~(1‹‹X); 
Это равносильно записи:
PHP код:
PORTY = PORTY &  ( ~(1‹‹X) ); 
~ - операция побитового инвертирования
то есть, было
0b00000100
стало
0b11111011

Понятно, что побитовая операция И (&) с числом 0b11111011 сбросит второй бит (нумерация битов начинается с нуля).

Когда устанавливаются сразу несколько бит:

PHP код:
PORTY |= ( (1‹‹X1) | (1‹‹X2) | (1‹‹X3) ); 
где X1, X2, X3 - номера устанавливаемых бит.

Когда нужно сбросить - тут чуть похитрее.

Надо сначала инвертировать всю скобку ( (1‹‹X1) | (1‹‹X2) | (1‹‹X3) ), а потом уже применять побитовое И.

То есть:
PHP код:
PORTY &= ~( (1‹‹X1) | (1‹‹X2) | (1‹‹X3) ); 
Godzilla82 вне форума  
Сказали "Спасибо" Godzilla82
Fraktal (09.01.2014)
Непрочитано 09.01.2014, 23:45  
Boba_spb
Почётный гражданин KAZUS.RUN
 
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию Re: Как программно отследить появление логического нуля на входе /Reset?

Сообщение от Godzilla82 Посмотреть сообщение
то есть, было
0b00000100
стало
0b11111011
а что это такое такое в СИ ? ))
Boba_spb вне форума  
Сказали "Спасибо" Boba_spb
Fraktal (10.01.2014)
 
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Решено] Сборник перлов любителей кабельщины mikesmith Отвлекитесь, эмбеддеры! 135 14.08.2007 15:49
[Решено] Всем эмбеддерам посвящается... Decan Отвлекитесь, эмбеддеры! 0 24.10.2005 14:43


Часовой пояс GMT +4, время: 03:26.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.