Ты читать умеешь? Чтобы у порта работала подтяжка, её нужно ГЛОБАЛЬНО разрешить, за это отвечает бит PUD в регистре SFIOR. Сейчас у тебя порт находится БЕЗ ПОДТЯЖКИ, как и прежде потому что она запрещена для всего контроллера.
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, теперь вроде слушается) Есть замечания по коду?
DDRA=255; //Все порты A как выход PORTA|=(1<<4); //Сделали на порте A4 логическую 1, то есть включился подтягивающий резистор. ... if (PINA==(0<<4)) //если состояние 0 то светодиод тухнет ... } теперь вроде слушается) Есть замечания по коду?
Весело тут у вас
_________________ Любой, заслуживающий внимания, опыт приобретается себе в убыток...
В даташите черным по английски нарисована именно такая же табличка. Так что не обязательно слушатся знакомого программиста - иногда быстрее и точнее найти это в даташите.
Ну так это было тогда, когда я осваивал микроконтроллеры. Сейчас то я пдфы юзаю)
DDRA=255; //Все порты A как выход PORTA|=(1<<4); //Сделали на порте A4 логическую 1, то есть включился подтягивающий резистор. ... if (PINA==(0<<4)) //если состояние 0 то светодиод тухнет ... } теперь вроде слушается) Есть замечания по коду?
Весело тут у вас
надо писать не весело тут у вас, а КОШМАР бедный контроллер, подтяжку без резистора установили. Ноги не отгорели случайно? Работать может только от того, что внутри кристалла происходит падение напряжения и на PINA от этого получается в логической единице.Но есть одно НО, зато какое!!!! Порт может испортиться либо весь контроллер выйдет из строя.
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" либо не сохроняет новое значение, либо не записывается новое значение. Уважаемые профессионалы, поясните мне пожалуйста, с чем это связано, и почему так выходит? перерыл уже весь инет, но во многих стотьях не однократно используют такой метод опроса кнопок! Ни чего не понимаю что не так? Либо я дурак, лидо лыжи не едут За ранее спасибо!
Жестак... у тебя ОСНОВНАЯ программа практически не выполняется - ей не хватает времени!
Вот контроллер входит в обработчик прерывания от таймера... и ждет 150мс, при этом НЕ ОТДАЕТ УПРАВЛЕНИЕ, прерывание заканчивается выполняется одна инструкция из основной программы и тут БАЦ снова прерывание... в итоге у тебя основной код выполняется со скоростью 1 инструкция в 150мс и при этом каждую инструкцию идет инкремент твоей переменной. В результате в основной программы срабатывание ХОТЯБЫ ОДНОГО условия - очень маловероятное событие.
Аlex пожалуйста http://avrlab.com/node/364 Аlex, вы меня конечно извените, но если вы с того форума, то очень жаль что вы меня там закляпали! я вам там очень многое хотел сказать! первое что хотел это то, что вы очень много критекуете, а помочь по делу видать не в вашей компитенции!
Alexeyslav спасибо вам, кое что понял, ща попробую! Попробывал убрать все задержки в прерывании, и добавил в основную программу тупо PORTC++; ну что бы там хоть что то ещё выполнялось! но как то безрезультатно
Последний раз редактировалось RGB Пт ноя 09, 2012 21:04:56, всего редактировалось 3 раз(а).
У Вас будет такая возможность через сутки, не переживайте
Цитата:
вы очень много критекуете
Т.е. получается, что Вы, придя на форум и задавая вопрос, мечтаете увидеть только то, что хотите увидеть ? Типа - я критики не хочу, и те кто критикует - флудят ! Нет уж, уважаемый, такого не будет. Будьте любезны ожидать даже того, что Вам неприятно. А если не хотите видеть подобного - не ходите по форумам, а сидите и курите буквари.
Да вообще ни какого! Порт С щёлкает. Ну если верить протеусовскому осцилографу то на пине C.1 = 1 us а на пине C.5 = 2.5 us очень быстро
Аlex: я не спорю, критика нужна, но в меру! вы подскажите в каком направлении двигаться, а то (цитата с форума "паяльник" - Где это видано, что в обработчике таймера так опрашивались кнопки ? Извращение одним словом....) вы бы подсказали хоть статейку нормальную в таком случае, раз уж вы профессионал! К сожалению у меня небыло информатики, и приходиться всё изучать самому!
Минуточку! Добавил в основной цикл задержку, появились первые позывы Вроде как переключается, но уж слишком быстро инкрементируется переменная button. Уважаемый Alexeyslav как тогда бороться с этим? если в обработчик прерываний нельзя вносить задержки?
Последний раз редактировалось RGB Пт ноя 09, 2012 22:58:35, всего редактировалось 1 раз.
Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4570 Откуда: Планета Земля
Рейтинг сообщения:5 Медали: 1
Настраивайте свой таймер так, что-бы получить такты для опроса входов, миллисек. на 20, примерно. Можно сделать по 1 мс. (они потом Вам пригодятся), и в обработчике создать счётчик до 20. Далее, нужно ловить изменения и устанавливать флаги, которые будут обрабатываться основным циклом. Изменения ловятся просто - считываем значение входа в темповский флаг, сравниваем этот флаг с предыдущим значением (с прошлого такта) и сохраняем его для следующего опроса (он потом будет предыдущим). При сравнении смотрим изменение, если текущее значение - отжата и предыдущее - нажата, то считаем кнопку кликнутой, устанавливая глобальный флаг кликнутой кнопки. В основном цикле просто проверяем этот флаг и , если он установлен, сбрасываем его и выполняем необходимые действия, связанные с нажатием этой кнопки. Имеем быстрый (не зацикленный) обработчик; текущее состояние кнопки; можем ловить как отжатие, так и нажатие; добавив ещё один счётчик, привязанный к кнопке, имеем возможность обрабатывать нажатия любой длительности. Ну вот как-то так....
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения