| AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
Как программно отследить появление логического нуля на входе /Reset?
09.01.2014, 23:59
|
|
|
Временная регистрация
Регистрация: 21.02.2013
Сообщений: 87
Сказал спасибо: 70
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
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
|
|
|
|
10.01.2014, 09:44
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
|
Re: Как программно отследить появление логического нуля на входе /Reset?
Сообщение от Fraktal
|
|
Что то не вяжется с Вашим ответом : 0b11111011
|
С каким моим ответом?
Я всего лишь написал, что после инвертирования получится
0b11111011
к чему вы сами пришли:
Сообщение от Fraktal
|
|
~(00000100)=11111011
|
А побитовая операция И c любым значением порта сбросит в этом любом значении второй бит.
Что видно:
Сообщение от Fraktal
|
|
00000001&11111011=00000001
|
второй бит сброшен (хотя он и не был установлен).
Последний раз редактировалось Godzilla82; 10.01.2014 в 10:01.
|
|
|
|
Сказали "Спасибо" Godzilla82
|
|
|
10.01.2014, 09:50
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,458
Сказал спасибо: 3,227
Сказали Спасибо 3,511 раз(а) в 2,392 сообщении(ях)
|
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
|
|
|
10.01.2014, 12:59
|
|
|
Гражданин KAZUS.RUN
Регистрация: 16.06.2005
Сообщений: 942
Сказал спасибо: 25
Сказали Спасибо 174 раз(а) в 123 сообщении(ях)
|
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
|
|
|
10.01.2014, 13:47
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
|
Re: Как программно отследить появление логического нуля на входе /Reset?
Сообщение от Someone
|
PORTD ^= 0x17;
PORTB ^= 0x01;
и всё.
|
А про дребезг контактов все дружно зыбыли.
|
|
|
|
Сказали "Спасибо" Godzilla82
|
|
|
10.01.2014, 14:52
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 01.05.2009
Адрес: Коптево
Сообщений: 2,753
Сказал спасибо: 268
Сказали Спасибо 398 раз(а) в 247 сообщении(ях)
|
Re: Как программно отследить появление логического нуля на входе /Reset?
|
|
|
|
11.01.2014, 02:18
|
|
|
Временная регистрация
Регистрация: 21.02.2013
Сообщений: 87
Сказал спасибо: 70
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
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); }}
}
|
|
|
|
|
11.01.2014, 02:21
|
|
|
Временная регистрация
Регистрация: 21.02.2013
Сообщений: 87
Сказал спасибо: 70
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Как программно отследить появление логического нуля на входе /Reset?
KBH-I, Благадарю , смотрю смело в МИКРОПРОЦЕССОРНОЕ БУДУЩЕЕ
|
|
|
|
11.01.2014, 02:30
|
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
|
Re: Как программно отследить появление логического нуля на входе /Reset?
Сообщение от Fraktal
|
|
В итоге пришел к этому :
|
А что будет со стеком? Ведь он будет расти с каждым вызовом main();
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
11.01.2014, 02:36
|
|
|
Временная регистрация
Регистрация: 21.02.2013
Сообщений: 87
Сказал спасибо: 70
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Как программно отследить появление логического нуля на входе /Reset?
Вот это плохо и как же быть
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:02.
|
|