AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
08.01.2014, 17:42
|
|
Временная регистрация
Регистрация: 21.02.2013
Сообщений: 87
Сказал спасибо: 70
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Как программно отследить появление логического нуля на входе /Reset?
ForcePoint, НУ ТОГДА мне придется делать прерывание по входу INT2 как на падение напряжения так и на появление напряжения на PINB2 ?
|
|
|
|
09.01.2014, 05:34
|
|
Временная регистрация
Регистрация: 21.02.2013
Сообщений: 87
Сказал спасибо: 70
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Как программно отследить появление логического нуля на входе /Reset?
ForcePoint, Вот так вот переписал по Вашему совету
Цитата:
|
uint8_t PIN = 0;
/*************************************/
ISR(INT2_vect)
{
cli();
_delay_ms(5);
switch(PIN)
{
case 1: PIN=0;PORTD=(~1‹‹PD0)|(~1‹‹PD1)|(~1‹‹PD2)|(~1‹‹PD4 );PORTB&=~(1‹‹PB0); break;
case 0: PIN=1;PORTD=((1‹‹PD0)|(1‹‹PD1)|(1‹‹PD2)|(1‹‹PD4)); PORTB|=(1‹‹PB0);break;
}
reti();
}
|
Последний раз редактировалось Fraktal; 09.01.2014 в 06:00.
|
|
|
|
09.01.2014, 06:59
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,907
Сказал спасибо: 2,543
Сказали Спасибо 11,818 раз(а) в 5,924 сообщении(ях)
|
Re: Как программно отследить появление логического нуля на входе /Reset?
Fraktal, я что-то пропустил... Какой IDE пользуетесь?
Вопрос к знатокам: чем отличается запись "PORTD=(~1‹‹PD0)|(~1‹‹PD1)|(~1‹‹PD2)|(~1‹‹PD4 );"
от "PORTD=0x17"?
Понял бы разницу, если бы была запись более осмысленная, например (это к другому месту):"KNOB=0" или "KNOB=SHORT".
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
09.01.2014, 07:57
|
|
Временная регистрация
Регистрация: 21.02.2013
Сообщений: 87
Сказал спасибо: 70
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Как программно отследить появление логического нуля на входе /Reset?
akegor, AVR STUDIO 5.
|
|
|
|
09.01.2014, 08:02
|
|
Временная регистрация
Регистрация: 21.02.2013
Сообщений: 87
Сказал спасибо: 70
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Как программно отследить появление логического нуля на входе /Reset?
akegor,
Сообщение от akegor
|
"PORTD=(~1‹‹PD0)|(~1‹‹PD1)|(~1‹‹PD2)|(~1‹‹PD4 );"
от "PORTD=0x17"?
|
отличается только записью значения в порт (более наглядно) а так эта запись значения эквивалентна значению = 0х17
|
|
|
|
09.01.2014, 09:30
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,907
Сказал спасибо: 2,543
Сказали Спасибо 11,818 раз(а) в 5,924 сообщении(ях)
|
Re: Как программно отследить появление логического нуля на входе /Reset?
Сообщение от Fraktal
|
отличается только записью
|
Да это-то понятно, непонятно зачем менять одну темную лошадку на другую, может лучше уж вместо, скажем, PD0 давать осмысленное имя? Иначе хрен с редькой не сладкий.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
09.01.2014, 10:15
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Как программно отследить появление логического нуля на входе /Reset?
А никого не смущает присутствие "~" ?
Вот это вот - PORTD=(~1‹‹PD0)|(~1‹‹PD1)|(~1‹‹PD2)|(~1‹‹PD4 ) :
никогда не равно "PORTD=0x17"
И применение такой конструкции PORTD=(~1‹‹PD0)|(~1‹‹PD1)|(~1‹‹PD2)|(~1‹‹PD4 ) вызывает большое сомнение. Так как устанавливает все биты "окромя" , указанных четырех.
Вот такая конструкция используется часто -
PORTD &= ( ~1 ‹‹ PD0 ) | ( ~1 ‹‹ PD1 ) | ( ~1 ‹‹ PD2 ) | ( ~1 ‹‹ PD4 )
так как служит для сброса группы бит в порту с последующей установкой по или части бит из этой группы.
|
|
|
Сказали "Спасибо" Boba_spb
|
|
|
09.01.2014, 10:37
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,918
Сказал спасибо: 2,981
Сказали Спасибо 3,161 раз(а) в 2,146 сообщении(ях)
|
Re: Как программно отследить появление логического нуля на входе /Reset?
Сообщение от Fraktal
|
ForcePoint, Вот так вот переписал по Вашему совету
|
Не радует. ![Стоп!](images/smilies/icon_stop.gif) Ибо использована ф-ция "_delay".
Давайте-ка кубики порисуем. Что желаете получить по изменениям на PB2?
Upd: Я имел в виду "алгоритм нарисуем". Как-то мне кисло разбирать алгоритм по исходнику https://kazus.ru/forums/showpost.php...4&postcount=60 (вероятно - содержащему ошибки).
Последний раз редактировалось ForcePoint; 09.01.2014 в 18:24.
|
|
|
|
09.01.2014, 11:10
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
|
Re: Как программно отследить появление логического нуля на входе /Reset?
Сообщение от Boba_spb
|
Вот такая конструкция используется часто -
PORTD &= ( ~1 ‹‹ PD0 ) | ( ~1 ‹‹ PD1 ) | ( ~1 ‹‹ PD2 ) | ( ~1 ‹‹ PD4 )
так как служит для сброса группы бит в порту с последующей установкой по или части бит из этой группы.
|
Тогда надо писать:
PHP код:
|
PORTD &= ~( (1‹‹PD0) | (1‹‹PD1) | (1‹‹PD2) | (1‹‹PD4) );
|
А у вас получается:
Код:
|
11111110
11111100
11111000
11100000
---------
11111110 |
|
|
|
Сказали "Спасибо" Godzilla82
|
|
|
09.01.2014, 16:13
|
|
Временная регистрация
Регистрация: 21.02.2013
Сообщений: 87
Сказал спасибо: 70
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Как программно отследить появление логического нуля на входе /Reset?
ForcePoint, отлавливаю нажатие кнопки
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();
_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();
}
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();
DDRB = 0xff;
GICR = (1‹‹INT2);
while(Pausa){MCUCSR= (1‹‹ISC2);}
MCUCSR = (0‹‹ISC2) ;
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);
dec_bin();
switch(i)
{
case 1:while(1){
PORTD =0XEF;
PORTC = s7_i[0];}
case 2: while(1){
PORTD =0XEF;
PORTC = s7_i[0];
_delay_ms(5);
PORTD= 0XFB;
PORTC = s7_i[1];
_delay_ms(5);}
case 3: while(1){
PORTD =0XEF;
PORTC = s7_i[0];
_delay_ms(5);
PORTD= 0XFB;
PORTC = s7_i[1];
_delay_ms(5);
PORTD=0XFD;
PORTC = s7_i[2];
_delay_ms(5);}
case 4: while(1){
PORTD =0XEF;
PORTC = s7_i[0];
_delay_ms(5);
PORTD= 0XFB;
PORTC = s7_i[1];
_delay_ms(5);
PORTD=0XFD;
PORTC = s7_i[2];
_delay_ms(5);
PORTD=0XFE;
PORTC= s7_i[3];
_delay_ms(5); }}
}
|
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:41.
|
|