Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

Re: Помогите опросить кнопку

Пн ноя 05, 2012 22:59:58

Ты читать умеешь? Чтобы у порта работала подтяжка, её нужно ГЛОБАЛЬНО разрешить, за это отвечает бит PUD в регистре SFIOR. Сейчас у тебя порт находится БЕЗ ПОДТЯЖКИ, как и прежде потому что она запрещена для всего контроллера.

Re: Помогите опросить кнопку

Пн ноя 05, 2012 23:12:22

Alexeyslav писал(а): и установить бит PUD в регистре SFIOR

Точнее, сбросить, т.е. записать 0. Это состояние по умолчанию ( initial value ) .

Так что не обязательно слушатся знакомого программиста

И незнакомого форумиста :)

Re: Помогите опросить кнопку

Пн ноя 05, 2012 23:16:25

Можно код плиз? Я уже 5 часов долбаюсь как разрешить глобальную подтяжку? Просто не знаю как это прописать в IARе?

Re: Помогите опросить кнопку

Пн ноя 05, 2012 23:26:51

#include <ioavr.h>
#include <intrinsics.h>

int main( void )
{
DDRC=255; //Все порты C как выход (для светодиода)
DDRA=255; //Все порты A как выход
PORTA|=(1<<4); //Сделали на порте A4 логическую 1, то есть включился подтягивающий резистор.

while (1) //Организовываем бесконечный цикл
{
if (PINA==(1<<4)) //если состояние 1 то светодиод горит
{
PORTC|=(1<<4);
}
if (PINA==(0<<4)) //если состояние 0 то светодиод тухнет
{
PORTC&=(~(1<<4));
}
}


}



DDRA=255; //было 0, исправил на 255, теперь вроде слушается) Есть замечания по коду?

Re: Помогите опросить кнопку

Пн ноя 05, 2012 23:33:42

nikityan писал(а):DDRA=255; //Все порты A как выход
PORTA|=(1<<4); //Сделали на порте A4 логическую 1, то есть включился подтягивающий резистор.
...
if (PINA==(0<<4)) //если состояние 0 то светодиод тухнет
...
}
теперь вроде слушается) Есть замечания по коду?

Весело тут у вас :))

Re: Помогите опросить кнопку

Пн ноя 05, 2012 23:42:57

Код:
#include <ioavr.h>
#include <intrinsics.h>

int main( void )
{
DDRC|=(1<<4);
DDRA=0x00;
PORTA|=(1<<4);

while (1)
{

if (PINA&(1<<4)) //если состояние 1 то светодиод горит
{
PORTC|=(1<<4);
}
else
{
PORTC&=~(1<<4);
}

}
}

Re: Помогите опросить кнопку

Пн ноя 05, 2012 23:50:27

Спасибо мужик! Всё стало хоть как то понятно! Благодарю! Работает!

Re: Помогите опросить кнопку

Вт ноя 06, 2012 01:21:54

Alexeyslav писал(а):В даташите черным по английски нарисована именно такая же табличка. Так что не обязательно слушатся знакомого программиста - иногда быстрее и точнее найти это в даташите.


Ну так это было тогда, когда я осваивал микроконтроллеры. Сейчас то я пдфы юзаю)

Re: Помогите опросить кнопку

Ср ноя 07, 2012 13:22:35

Goodefine писал(а):
nikityan писал(а):DDRA=255; //Все порты A как выход
PORTA|=(1<<4); //Сделали на порте A4 логическую 1, то есть включился подтягивающий резистор.
...
if (PINA==(0<<4)) //если состояние 0 то светодиод тухнет
...
}
теперь вроде слушается) Есть замечания по коду?

Весело тут у вас :))

надо писать не весело тут у вас, а КОШМАР бедный контроллер, подтяжку без резистора установили. Ноги не отгорели случайно?
Работать может только от того, что внутри кристалла происходит падение напряжения и на PINA от этого получается в логической единице.Но есть одно НО, зато какое!!!! Порт может испортиться либо весь контроллер выйдет из строя.

PS обсуждение про ШИМ это походит на оффтопик.

Re: Помогите опросить кнопку

Чт ноя 08, 2012 02:20:07

Перенёс все оффтопные посты в новую тему viewtopic.php?f=20&t=80250 .

Re: Вопросы по С/С++ (СИ)

Пт ноя 09, 2012 17:27:23

Доброго времени суток Уважаемые!
Вопрос покажиться глупым, но это факт!
Код:
#include <avr/interrupt.h>
#include <avr/io.h>
unsigned char button = 0;

ISR (TIMER0_OVF_vect) // Обработка прерывания таймера_0
{
         if ((PIND&0x80) == 0)
{ delay_ms(50); button++;}
if (button == 8)
{ button = 0;}
delay_ms(100);
}
/*** процедура задержки в микросекундах ***/
void delay_us(unsigned char time_us)
{ register unsigned char i;
for(i = 0; i < time_us; i++) // 4 цикла
{ asm (" PUSH R0 "); // 2 цикла
asm (" POP R0 "); // 2 цикла
// 8 циклов = 1 us для 8MHz
}
}
/*** процедура задержки в милисекундах ***/
void delay_ms(unsigned int time_ms)
{ register unsigned int i;
for(i = 0; i < time_ms; i++)
{ delay_us(250);
delay_us(250);
delay_us(250);
delay_us(250);
}
}
int main (void)
{
DDRD = 0x00; // Порт "D" - вход
PORTD = 0xFF; //Включены подтягивающие резисторы
DDRB = 0xFF; // Порт "B" - выход
TIMSK |= (1 << TOIE0); // Разрешение прерыванияя
TCCR0 |= (0 << CS02)|(0 << CS01)|(1 << CS00); // без пределителя
sei();    // глобальное разрешение прерываний

while(1)
{

if (button == 0) PORTB = 0x01;  // это просто сделал для проверки работоспособности
if (button == 1) PORTB = 0x02;
if (button == 2) PORTB = 0x04;
if (button == 3) PORTB = 0x08;
if (button == 4) PORTB = 0x10;
if (button == 5) PORTB = 0x20;
if (button == 6) PORTB = 0x40;
if (button == 7) PORTB = 0x80;

}

}

теоретически в функции обработке прерывания от таймера_0 должен проходить опрос кнопки! В AVR Studio когда включаю режим отладки, всё красиво, курсор проходит через эту функцию и проверяет кнопку, но вот в Proteuse работать не хотит эта прошивка! такое ощущение что переменная "button" либо не сохроняет новое значение, либо не записывается новое значение.
Уважаемые профессионалы, поясните мне пожалуйста, с чем это связано, и почему так выходит? перерыл уже весь инет, но во многих стотьях не однократно используют такой метод опроса кнопок!
Ни чего не понимаю что не так? Либо я дурак, лидо лыжи не едут
За ранее спасибо!

Re: Помогите опросить кнопку

Пт ноя 09, 2012 18:09:03

но во многих стотьях не однократно используют такой метод опроса кнопок!
Покажите, в каких стОтьях так кнопки опрашивают :)

Re: Помогите опросить кнопку

Пт ноя 09, 2012 20:12:19

Жестак... у тебя ОСНОВНАЯ программа практически не выполняется - ей не хватает времени!

Вот контроллер входит в обработчик прерывания от таймера... и ждет 150мс, при этом НЕ ОТДАЕТ УПРАВЛЕНИЕ, прерывание заканчивается выполняется одна инструкция из основной программы и тут БАЦ снова прерывание... в итоге у тебя основной код выполняется со скоростью 1 инструкция в 150мс и при этом каждую инструкцию идет инкремент твоей переменной. В результате в основной программы срабатывание ХОТЯБЫ ОДНОГО условия - очень маловероятное событие.

УБЕРИ с прерывания задержки! Любые задержки!

Re: Помогите опросить кнопку

Пт ноя 09, 2012 20:22:29

Видимо, на одном форуме мало нормальных ответов (?), надо ещё на нескольких запостить... http://forum.cxem.net/index.php?showtopic=116605

Re: Помогите опросить кнопку

Пт ноя 09, 2012 20:23:19

Аlex пожалуйста
http://avrlab.com/node/364
Аlex, вы меня конечно извените, но если вы с того форума, то очень жаль что вы меня там закляпали! я вам там очень многое хотел сказать! первое что хотел это то, что вы очень много критекуете, а помочь по делу видать не в вашей компитенции!


Alexeyslav
спасибо вам, кое что понял, ща попробую! Попробывал убрать все задержки в прерывании, и добавил в основную программу тупо PORTC++; ну что бы там хоть что то ещё выполнялось! но как то безрезультатно :cry:
Последний раз редактировалось RGB Пт ноя 09, 2012 21:04:56, всего редактировалось 3 раз(а).

Re: Помогите опросить кнопку

Пт ноя 09, 2012 20:28:44

RGB писал(а):Аlex пожалуйста
http://avrlab.com/node/364
:facepalm:

я вам там очень многое хотел сказать!
У Вас будет такая возможность через сутки, не переживайте :)

вы очень много критекуете
Т.е. получается, что Вы, придя на форум и задавая вопрос, мечтаете увидеть только то, что хотите увидеть ? Типа - я критики не хочу, и те кто критикует - флудят !
Нет уж, уважаемый, такого не будет. Будьте любезны ожидать даже того, что Вам неприятно. А если не хотите видеть подобного - не ходите по форумам, а сидите и курите буквари.

Re: Помогите опросить кнопку

Пт ноя 09, 2012 22:07:06

И какого результата нет? ПортC щелкает? как быстро?

Re: Помогите опросить кнопку

Пт ноя 09, 2012 22:33:27

Да вообще ни какого! Порт С щёлкает. Ну если верить протеусовскому осцилографу то на пине C.1 = 1 us а на пине C.5 = 2.5 us очень быстро

Аlex: я не спорю, критика нужна, но в меру! вы подскажите в каком направлении двигаться, а то (цитата с форума "паяльник" - Где это видано, что в обработчике таймера так опрашивались кнопки ? Извращение одним словом....) вы бы подсказали хоть статейку нормальную в таком случае, раз уж вы профессионал! К сожалению у меня небыло информатики, и приходиться всё изучать самому!

Минуточку! Добавил в основной цикл задержку, появились первые позывы :) Вроде как переключается, но уж слишком быстро инкрементируется переменная button. Уважаемый Alexeyslav как тогда бороться с этим? если в обработчик прерываний нельзя вносить задержки?
Последний раз редактировалось RGB Пт ноя 09, 2012 22:58:35, всего редактировалось 1 раз.

Re: Помогите опросить кнопку

Пт ноя 09, 2012 22:56:19

Настраивайте свой таймер так, что-бы получить такты для опроса входов, миллисек. на 20, примерно. Можно сделать по 1 мс. (они потом Вам пригодятся), и в обработчике создать счётчик до 20.
Далее, нужно ловить изменения и устанавливать флаги, которые будут обрабатываться основным циклом. Изменения ловятся просто - считываем значение входа в темповский флаг, сравниваем этот флаг с предыдущим значением (с прошлого такта) и сохраняем его для следующего опроса (он потом будет предыдущим). При сравнении смотрим изменение, если текущее значение - отжата и предыдущее - нажата, то считаем кнопку кликнутой, устанавливая глобальный флаг кликнутой кнопки.
В основном цикле просто проверяем этот флаг и , если он установлен, сбрасываем его и выполняем необходимые действия, связанные с нажатием этой кнопки.
Имеем быстрый (не зацикленный) обработчик; текущее состояние кнопки; можем ловить как отжатие, так и нажатие; добавив ещё один счётчик, привязанный к кнопке, имеем возможность обрабатывать нажатия любой длительности.
Ну вот как-то так....

Re: Помогите опросить кнопку

Пт ноя 09, 2012 23:23:15

Аlex А вот теперь от души вам огромное человеческое СПАСИБО!
Буду пробывать, но уже завтра.
Ответить