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

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

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

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

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

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

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

 
Опции темы

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

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

Godzilla82, интересно
PHP код:
PORTY &= ~(1‹‹X); 
допустим PORTY=00000001
1)применяю операцию сдвига (1‹‹x) где x=2 тогда получаю :00000100
2)применяю инверсию к полученному результату ~(00000100)=11111011
3)логическое умножение с PORTY : 00000001&11111011=00000001
Получается в порту PORTY будет значение = 00000001
Что то не вяжется с Вашим ответом : 0b11111011
Реклама:
Fraktal вне форума  
Непрочитано 10.01.2014, 09:44  
Godzilla82
Почётный гражданин KAZUS.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Как программно отследить появление логического нуля на входе /Reset?

Сообщение от Fraktal Посмотреть сообщение
Что то не вяжется с Вашим ответом : 0b11111011
С каким моим ответом?
Я всего лишь написал, что после инвертирования получится
0b11111011
к чему вы сами пришли:
Сообщение от Fraktal Посмотреть сообщение
~(00000100)=11111011
А побитовая операция И c любым значением порта сбросит в этом любом значении второй бит.

Что видно:
Сообщение от Fraktal Посмотреть сообщение
00000001&11111011=00000001
второй бит сброшен (хотя он и не был установлен).

Последний раз редактировалось Godzilla82; 10.01.2014 в 10:01.
Godzilla82 вне форума  
Сказали "Спасибо" Godzilla82
Fraktal (11.01.2014)
Непрочитано 10.01.2014, 09:50  
ForcePoint
Почётный гражданин KAZUS.RUN
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,458
Сказал спасибо: 3,227
Сказали Спасибо 3,511 раз(а) в 2,392 сообщении(ях)
ForcePoint на пути к лучшему
По умолчанию Re: Как программно отследить появление логического нуля на входе /Reset?

Сообщение от Fraktal Посмотреть сообщение
ForcePoint, я без кубиков начал писать, как - то недолюбливаю я их , хотя когда прижимает то обращаю свой взор на них для понятия общей картины структуры программы. Но и то только в том случае если я на 5% разбираюсь в синтаксисе языка на котором буду писать и 30% если разбираюсь в технологии выполняемой работы : что нужно сделать для получения требуемого результата.
Тут дело в том, что объяснить другому человеку проще именно в кубиках, а не в виде программы. Особенно, если сейчас этап изучения.

Кстати, к чему вызов main в обработчике?
Код:
ISR(INT2_vect)      
     { 
         cli(); 
        _delay_ms(5); 
         switch(Pausa) 
        { 
        case 1:    Pausa=0;PORTD=(~1‹‹PD0)|(~1‹‹PD1)|(~1‹‹PD2)|(~1‹‹PD4);PORTB&=~(1‹‹PB0); break;         
        case 0: Pausa=1;PORTD=((1‹‹PD0)|(1‹‹PD1)|(1‹‹PD2)|(1‹‹PD4));PORTB|=(1‹‹PB0);break;     
        }                                 
                                 
        main();                 
     }
ForcePoint вне форума  
Сказали "Спасибо" ForcePoint
Fraktal (11.01.2014)
Непрочитано 10.01.2014, 12:59  
Someone
Гражданин KAZUS.RUN
 
Регистрация: 16.06.2005
Сообщений: 942
Сказал спасибо: 25
Сказали Спасибо 174 раз(а) в 123 сообщении(ях)
Someone на пути к лучшему
По умолчанию Re: Как программно отследить появление логического нуля на входе /Reset?

Сообщение от Fraktal Посмотреть сообщение
НУ ТОГДА мне придется делать прерывание по входу INT2 как на падение напряжения так и на появление напряжения на PINB2 ?
Ну да, "Any logical change on INTn generates an interrupt request". И тогда тело (в том варианте, что приведён) прерывания будет выглядеть

PORTD ^= 0x17;
PORTB ^= 0x01;

и всё. И конечно, никаких delay в прерывании. Как и cli - прерывания аппаратно запрещаются при входе в прерывание.

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

Сообщение от Someone Посмотреть сообщение
PORTD ^= 0x17;
PORTB ^= 0x01;
и всё.
А про дребезг контактов все дружно зыбыли.
Godzilla82 вне форума  
Сказали "Спасибо" Godzilla82
Fraktal (11.01.2014)
Непрочитано 10.01.2014, 14:52  
KBH-I
Почётный гражданин KAZUS.RUN
 
Аватар для KBH-I
 
Регистрация: 01.05.2009
Адрес: Коптево
Сообщений: 2,753
Сказал спасибо: 268
Сказали Спасибо 398 раз(а) в 247 сообщении(ях)
KBH-I на пути к лучшему
По умолчанию Re: Как программно отследить появление логического нуля на входе /Reset?

Сообщение от akegor Посмотреть сообщение
Нужен МК с блоками ясновидения и телепатии.
Сообщение от akegor Посмотреть сообщение
Что сказал профессор Преображенский насчет советских газет?
Сообщение от Fraktal Посмотреть сообщение
Не в курсе.
Сообщение от Fraktal Посмотреть сообщение
как тут цикл создать
Сообщение от _Артём_ Посмотреть сообщение
Я ведь не компилировал - сайт не позволяет
Сообщение от ForcePoint Посмотреть сообщение
А за использование _delay и/или циклов в обработчике прерывания я приговаривал-бы к пожизненному эциху с горячими паяльниками или принудительной переквалификации в джамшута.
Сообщение от Fraktal Посмотреть сообщение
как заставить кнопку вкл/выкл обработку программы
Сообщение от Godzilla82 Посмотреть сообщение
А про дребезг контактов все дружно зыбыли.
Спасибо всем, поржал. Может, в "Анекдоты" перенести?
)))


Fraktal, не дрейфь - прорвёшься: не ты первый, не ты последний.
KBH-I вне форума  
Сказали "Спасибо" KBH-I
Fraktal (11.01.2014)
Непрочитано 11.01.2014, 02:18  
Fraktal
Временная регистрация
 
Регистрация: 21.02.2013
Сообщений: 87
Сказал спасибо: 70
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Fraktal на пути к лучшему
По умолчанию Re: Как программно отследить появление логического нуля на входе /Reset?

ForcePoint, Для того чтоб из прерывания программа вернулась в самое начало функции main(), пробовал через reti - выходит на следующую строку кода который должен был выполнится до прерывания перед прерыванием , а мне нужно было в начале функции перезаписать условие по прерыванию. В итоге пришел к этому :
PHP код:
/*
 * KursStudi.c
 *
 * Created: 23.12.2013 23:13:58
 *  Author: Sirius
 */ 
#define  F_CPU 1000000ul
#include ‹avr/io.h›
#include ‹avr/interrupt.h›
#include ‹avr/signal.h›
#include ‹util/delay.h›
#include ‹inttypes.h›
#include ‹stdlib.h›
uint8_t s7_i[4];
int i;
uint8_t Pausa = 0;



/*************************************/     
 
     
     ISR(INT2_vect)     
     {
         cli();
         switch(Pausa)
        {
        case 1:    Pausa=0;PORTB&=~(1‹‹PB0);break;//пины порта в минус для катода - индикатор горит        
        case 0: Pausa=1;PORTD=((1‹‹PD0)|(1‹‹PD1)|(1‹‹PD2)|(1‹‹PD4));PORTB=(1‹‹PB0)|(1‹‹PB2);break;    //пины порта в плюс для катода индикатор не горит
        }                                
                            
        main();                
     }
     
               
     uint16_t massiv (void)
 {
     uint8_t min=255;
     uint32_t  sum=0;
     uint8_t  Array[700];
     for (int i=0;i‹sizeof(Array);++i)
     {Array[i]=255;
         if ( min › Array[i]) min = Array[i];  
     sum +=Array[i];    }                       
     return (sum/sizeof(Array))*3+min;}
     
  
  
        void dec_bin ()
{    
    uint16_t summa = massiv();
    uint16_t count_cifr = summa;    
    for ( i=0;count_cifr›0;++i) {count_cifr/=10;} 
    switch(i)    
    {
        case 1: s7_i[0]=summa;break;
        case 2: s7_i[0]=summa%10;s7_i[1]=summa/10;break; 
        case 3: s7_i[0]=summa%10;summa/=10;s7_i[1]=summa%10;s7_i[2]=summa/10;break;
        case 4: s7_i[0]=summa%10;summa/=10;s7_i[1]=summa%10;summa/=10;s7_i[2]=summa%10;s7_i[3]=summa/=10;break;
    }                                                
        for (uint8_t n=0;n‹i;++n)
    {        
        switch(s7_i[n])
           {
            case 0:s7_i[n] = 0x3F;break;case 5:s7_i[n] = 0X6D;break;
            case 1:s7_i[n] = 0X06;break;case 6:s7_i[n] = 0X7D;break;
            case 2:s7_i[n] = 0X5B;break;case 7:s7_i[n] = 0X07;break;
            case 3:s7_i[n] = 0X4F;break;case 8:s7_i[n] = 0X7F;break;
            case 4:s7_i[n] = 0X66;break;case 9:s7_i[n] = 0X6F;break;                                                        
           }
    }
}  
   
   
   
    main ()  
  { 
    sei();
    _delay_ms(10);
    MCUCSR = (0‹‹ISC2);
    while(Pausa){MCUCSR= (1‹‹ISC2);_delay_ms(10);}          
    DDRB = 0xff;    
    GICR = (1‹‹INT2);        
    PORTB = (1‹‹PB2);    
    DDRC = (1‹‹PC0)|(1‹‹PC1)|(1‹‹PC2)|(1‹‹PC3)|(1‹‹PC4)|(1‹‹PC5)|(1‹‹PC6)|(1‹‹PC7); 
    DDRD = (1‹‹PD0)|(1‹‹PD1)|(1‹‹PD2)|(1‹‹PD3)|(1‹‹PD4)|(1‹‹PD5)|(1‹‹PD6)|(1‹‹PD7);    
    DDRA = ~((1‹‹PA0)|(1‹‹PA1)|(1‹‹PA2)|(1‹‹PA3)|(1‹‹PA4)|(1‹‹PA5)|(1‹‹PA6)|(1‹‹PA7));
    PORTA =    (1‹‹PA0)|(1‹‹PA1)|(1‹‹PA2)|(1‹‹PA3)|(1‹‹PA4)|(1‹‹PA5)|(1‹‹PA6)|(1‹‹PA7);
    //;PORTD = 255;//удалить после строку
    //PORTB=2;//удалить после строку
    dec_bin();
    
    
      switch(i)
      {
        case 1:while(1){
                         PORTD =~(1‹‹PD4); //0XEF;
                      PORTC = s7_i[0];}
                
        case 2: while(1){
                         PORTD =~(1‹‹PD4);//0XEF;
                      PORTC = s7_i[0];
                      _delay_ms(5);
                      PORTD= ~(1‹‹PD2);//0XFB;
                      PORTC = s7_i[1];
                      _delay_ms(5);}        
                
        case 3:  while(1){
                         PORTD =~(1‹‹PD4);//0XEF;
                      PORTC = s7_i[0];
                      _delay_ms(5);
                      PORTD=~(1‹‹PD2); //0XFB;
                      PORTC = s7_i[1];
                      _delay_ms(5);
                      PORTD=~(1‹‹PD1); //0XFD;
                      PORTC = s7_i[2];
                      _delay_ms(5);} 
                
        case 4:    while(1){      
                      PORTD =~(1‹‹PD4);  //0XEF;
                      PORTC = s7_i[0];
                      _delay_ms(5);
                      PORTD=~(1‹‹PD2);  //0XFB;
                      PORTC = s7_i[1];
                      _delay_ms(5);
                      PORTD=~(1‹‹PD1); //0XFD;
                      PORTC = s7_i[2];
                      _delay_ms(5);
                      PORTD=~(1‹‹PD0); //0XFE;
                      PORTC= s7_i[3];
                      _delay_ms(5);    }}    
                                                                  
          } 
Fraktal вне форума  
Непрочитано 11.01.2014, 02:21  
Fraktal
Временная регистрация
 
Регистрация: 21.02.2013
Сообщений: 87
Сказал спасибо: 70
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Fraktal на пути к лучшему
По умолчанию Re: Как программно отследить появление логического нуля на входе /Reset?

KBH-I, Благадарю , смотрю смело в МИКРОПРОЦЕССОРНОЕ БУДУЩЕЕ
Fraktal вне форума  
Непрочитано 11.01.2014, 02:30  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: Как программно отследить появление логического нуля на входе /Reset?

Сообщение от Fraktal Посмотреть сообщение
В итоге пришел к этому :
А что будет со стеком? Ведь он будет расти с каждым вызовом main();
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor вне форума  
Сказали "Спасибо" akegor
Fraktal (11.01.2014)
Непрочитано 11.01.2014, 02:36  
Fraktal
Временная регистрация
 
Регистрация: 21.02.2013
Сообщений: 87
Сказал спасибо: 70
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Fraktal на пути к лучшему
По умолчанию Re: Как программно отследить появление логического нуля на входе /Reset?

Вот это плохо и как же быть
Fraktal вне форума  
 
Опции темы

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

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

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

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


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


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