Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Пн ноя 05, 2012 22:59:58
Ты читать умеешь? Чтобы у порта работала подтяжка, её нужно ГЛОБАЛЬНО разрешить, за это отвечает бит PUD в регистре SFIOR. Сейчас у тебя порт находится БЕЗ ПОДТЯЖКИ, как и прежде потому что она запрещена для всего контроллера.
Пн ноя 05, 2012 23:12:22
Alexeyslav писал(а): и установить бит PUD в регистре SFIOR
Точнее, сбросить, т.е. записать 0. Это состояние по умолчанию ( initial value ) .
Так что не обязательно слушатся знакомого программиста
И незнакомого форумиста
Пн ноя 05, 2012 23:16:25
Можно код плиз? Я уже 5 часов долбаюсь как разрешить глобальную подтяжку? Просто не знаю как это прописать в IARе?
Пн ноя 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, теперь вроде слушается) Есть замечания по коду?
Пн ноя 05, 2012 23:33:42
nikityan писал(а):DDRA=255; //Все порты A как выход
PORTA|=(1<<4); //Сделали на порте A4 логическую 1, то есть включился подтягивающий резистор.
...
if (PINA==(0<<4)) //если состояние 0 то светодиод тухнет
...
}
теперь вроде слушается) Есть замечания по коду?
Весело тут у вас
Пн ноя 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);
}
}
}
Пн ноя 05, 2012 23:50:27
Спасибо мужик! Всё стало хоть как то понятно! Благодарю! Работает!
Вт ноя 06, 2012 01:21:54
Alexeyslav писал(а):В даташите черным по английски нарисована именно такая же табличка. Так что не обязательно слушатся знакомого программиста - иногда быстрее и точнее найти это в даташите.
Ну так это было тогда, когда я осваивал микроконтроллеры. Сейчас то я пдфы юзаю)
Ср ноя 07, 2012 13:22:35
Goodefine писал(а):nikityan писал(а):DDRA=255; //Все порты A как выход
PORTA|=(1<<4); //Сделали на порте A4 логическую 1, то есть включился подтягивающий резистор.
...
if (PINA==(0<<4)) //если состояние 0 то светодиод тухнет
...
}
теперь вроде слушается) Есть замечания по коду?
Весело тут у вас
надо писать не весело тут у вас, а КОШМАР бедный контроллер, подтяжку без резистора установили. Ноги не отгорели случайно?
Работать может только от того, что внутри кристалла происходит падение напряжения и на PINA от этого получается в логической единице.Но есть одно НО, зато какое!!!! Порт может испортиться либо весь контроллер выйдет из строя.
PS обсуждение про ШИМ это походит на оффтопик.
Чт ноя 08, 2012 02:20:07
Перенёс все оффтопные посты в новую тему
viewtopic.php?f=20&t=80250 .
Пт ноя 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" либо не сохроняет новое значение, либо не записывается новое значение.
Уважаемые профессионалы, поясните мне пожалуйста, с чем это связано, и почему так выходит? перерыл уже весь инет, но во многих стотьях не однократно используют такой метод опроса кнопок!
Ни чего не понимаю что не так? Либо я дурак, лидо лыжи не едут
За ранее спасибо!
Пт ноя 09, 2012 18:09:03
но во многих стотьях не однократно используют такой метод опроса кнопок!
Покажите, в каких ст
Отьях так кнопки опрашивают
Пт ноя 09, 2012 20:12:19
Жестак... у тебя ОСНОВНАЯ программа практически не выполняется - ей не хватает времени!
Вот контроллер входит в обработчик прерывания от таймера... и ждет 150мс, при этом НЕ ОТДАЕТ УПРАВЛЕНИЕ, прерывание заканчивается выполняется одна инструкция из основной программы и тут БАЦ снова прерывание... в итоге у тебя основной код выполняется со скоростью 1 инструкция в 150мс и при этом каждую инструкцию идет инкремент твоей переменной. В результате в основной программы срабатывание ХОТЯБЫ ОДНОГО условия - очень маловероятное событие.
УБЕРИ с прерывания задержки! Любые задержки!
Пт ноя 09, 2012 20:22:29
Видимо, на одном форуме мало нормальных ответов (?), надо ещё на нескольких запостить...
http://forum.cxem.net/index.php?showtopic=116605
Пт ноя 09, 2012 20:23:19
Аlex пожалуйста
http://avrlab.com/node/364Аlex, вы меня конечно извените, но если вы с того форума, то очень жаль что вы меня там закляпали! я вам там очень многое хотел сказать! первое что хотел это то, что вы очень много критекуете, а помочь по делу видать не в вашей компитенции!
Alexeyslavспасибо вам, кое что понял, ща попробую! Попробывал убрать все задержки в прерывании, и добавил в основную программу тупо PORTC++; ну что бы там хоть что то ещё выполнялось! но как то безрезультатно
Последний раз редактировалось
RGB Пт ноя 09, 2012 21:04:56, всего редактировалось 3 раз(а).
Пт ноя 09, 2012 20:28:44
я вам там очень многое хотел сказать!
У Вас будет такая возможность через сутки, не переживайте
вы очень много критекуете
Т.е. получается, что Вы, придя на форум и задавая вопрос, мечтаете увидеть только то, что хотите увидеть ? Типа - я критики не хочу, и те кто критикует - флудят !
Нет уж, уважаемый, такого не будет. Будьте любезны ожидать даже того, что Вам неприятно. А если не хотите видеть подобного - не ходите по форумам, а сидите и курите буквари.
Пт ноя 09, 2012 22:07:06
И какого результата нет? ПортC щелкает? как быстро?
Пт ноя 09, 2012 22:33:27
Да вообще ни какого! Порт С щёлкает. Ну если верить протеусовскому осцилографу то на пине C.1 = 1 us а на пине C.5 = 2.5 us очень быстро
Аlex: я не спорю, критика нужна, но в меру! вы подскажите в каком направлении двигаться, а то (цитата с форума "паяльник" - Где это видано, что в обработчике таймера так опрашивались кнопки ? Извращение одним словом....) вы бы подсказали хоть статейку нормальную в таком случае, раз уж вы профессионал! К сожалению у меня небыло информатики, и приходиться всё изучать самому!
Минуточку! Добавил в основной цикл задержку, появились первые позывы
Вроде как переключается, но уж слишком быстро инкрементируется переменная button. Уважаемый
Alexeyslav как тогда бороться с этим? если в обработчик прерываний нельзя вносить задержки?
Последний раз редактировалось
RGB Пт ноя 09, 2012 22:58:35, всего редактировалось 1 раз.
Пт ноя 09, 2012 22:56:19
Настраивайте свой таймер так, что-бы получить такты для опроса входов, миллисек. на 20, примерно. Можно сделать по 1 мс. (они потом Вам пригодятся), и в обработчике создать счётчик до 20.
Далее, нужно ловить изменения и устанавливать флаги, которые будут обрабатываться основным циклом. Изменения ловятся просто - считываем значение входа в темповский флаг, сравниваем этот флаг с предыдущим значением (с прошлого такта) и сохраняем его для следующего опроса (он потом будет предыдущим). При сравнении смотрим изменение, если текущее значение - отжата и предыдущее - нажата, то считаем кнопку кликнутой, устанавливая глобальный флаг кликнутой кнопки.
В основном цикле просто проверяем этот флаг и , если он установлен, сбрасываем его и выполняем необходимые действия, связанные с нажатием этой кнопки.
Имеем быстрый (не зацикленный) обработчик; текущее состояние кнопки; можем ловить как отжатие, так и нажатие; добавив ещё один счётчик, привязанный к кнопке, имеем возможность обрабатывать нажатия любой длительности.
Ну вот как-то так....
Пт ноя 09, 2012 23:23:15
Аlex А вот теперь от души вам огромное человеческое СПАСИБО!
Буду пробывать, но уже завтра.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.