AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
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 ![Озадачен](images/smilies/icon_confused.gif)
Что то не вяжется с Вашим ответом : 0b11111011
|
|
|
|
10.01.2014, 09:44
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
|
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.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,918
Сказал спасибо: 2,981
Сказали Спасибо 3,161 раз(а) в 2,146 сообщении(ях)
|
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.RU
Регистрация: 16.06.2005
Сообщений: 944
Сказал спасибо: 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.RU
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
|
Re: Как программно отследить появление логического нуля на входе /Reset?
Сообщение от Someone
|
PORTD ^= 0x17;
PORTB ^= 0x01;
и всё.
|
А про дребезг контактов все дружно зыбыли.
|
|
|
Сказали "Спасибо" Godzilla82
|
|
|
10.01.2014, 14:52
|
|
Почётный гражданин KAZUS.RU
Регистрация: 01.05.2009
Адрес: Коптево
Сообщений: 2,849
Сказал спасибо: 276
Сказали Спасибо 427 раз(а) в 274 сообщении(ях)
|
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
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,907
Сказал спасибо: 2,543
Сказали Спасибо 11,818 раз(а) в 5,924 сообщении(ях)
|
Re: Как программно отследить появление логического нуля на входе /Reset?
Сообщение от Fraktal
|
В итоге пришел к этому :
|
А что будет со стеком? Ведь он будет расти с каждым вызовом main();
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
11.01.2014, 02:36
|
|
Временная регистрация
Регистрация: 21.02.2013
Сообщений: 87
Сказал спасибо: 70
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Как программно отследить появление логического нуля на входе /Reset?
Вот это плохо и как же быть
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:46.
|
|