Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

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

 
Опции темы
Непрочитано 09.01.2014, 16:55  
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
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.RU
 
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 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.RU
 
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
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.RU
 
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
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.RU
 
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 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, время: 20:23.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot