Код: Выделить всё
#define led_1 PORTC.5
#define led_2 PORTC.4
#define led_3 PORTC.3Код: Выделить всё
#define led_1 PORTC.5
#define led_2 PORTC.4
#define led_3 PORTC.3
Код: Выделить всё
if... else...elseКод: Выделить всё
switch()...case...caseOUT PIN имеет смысл во всех новых AVR. «Новых» -- это где-то так от tiny13, tiny2313, mega48/88/168, ... с любыми буквами -- т.е. практически все, кроме старушки attiny26 да обновленных atmega8A, atmega64A, которые просто совместимы со старыми.pyzh_man писал(а):OUT PIN не имеет смысла.

Код: Выделить всё
SBI PINB, 2 ; инвертировать PB2
LDI R16, 0x88
OUT PINB, R16 ; инвертировать одновремённо PB3 и PB7switch(s) // s- переменная прерывателя
{
case '1': *делаем первую программу*; break;
case '2': *вторую*; break;
case '3': *третью*; break;
}
Код: Выделить всё
while(s== 1)
{
...
}Код: Выделить всё
/*****************************************************
Chip type : ATmega324
Clock frequency : 20,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 512
*****************************************************/
#include <mega324.h>
#include <delay.h>
// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
PORTD.2=~PORTD.2;
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Port D initialization
PORTD=0x00;
DDRD=0xff;
// Timer/Counter 1 initialization
TCCR1A=0x00;
TCCR1B=0b00000100;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x98;
OCR1AL=0x96;
OCR1BH=0x00;
OCR1BL=0x00;
TIMSK1=0x01;
#asm("sei")
while (1)
{
}
}
Код: Выделить всё
interrupt [EXT_INT0] void ext_int0_isr(void) //обработка прерываний INT0
{
delay_ms(100); // антидребезг <===
#asm("cli"); //запрещение прерываний на время обработки прерывания
s=s+1;
if (s==4) s=1;
#asm("sei"); //разрешение прерываний
}
Код: Выделить всё
#asm("cli"); //запрещение прерываний на время обработки прерывания
#asm("sei"); //разрешение прерываний
Хотя... почему? Вполне возможно. Ведь за 100 мс состояние кнопки успеет устаканиться. Другое дело, что на нажатие кнопки контролер будет реагировать дважды: первый раз на нажатие кнопки (появление дребезга) и второй при её отпуске (опять дребезг). да, именно это важно, а то, что сделано - бесполезно и, скорее всего, приведет к "задваиванию" нажатий и, опять же скорее всего, к реакции на отжатие. Ну и, само собой, к заметным тормозам - с такой-то зедержкой!DataLife писал(а):Просто для того, что бы его не было, после задержки нужно снова проверять состояние кнопки, в этом случае этого нет, если не ошибаюсь..
еще как имеют! особенно sei - может таких чудес наделать...IfoR писал(а):в прерывании не имеют смысла. Железо само заботится о разрешении прерываний здесь.
Код: Выделить всё
interrupt [EXT_INT0] void ext_int0_isr(void) //обработка прерываний INT0
{
delay_ms(100); // антидребезг <===
#asm("cli"); //запрещение прерываний на время обработки прерывания
s=s+1;
if (s==4) s=1;
#asm("sei"); //разрешение прерываний
}на самом деле все будет немного иначе:DataLife писал(а):1) кнопка нажата (пошёл некий дребезг)
2) сработало прерывание, но тут задержка, которая не даёт дребезгу несколько раз изменить значение переменной S
3) прошла задержка, дребезг устаканился, переменная увеличилась, как и должна
Просто если бы не задержка сразу увеличивались бы переменная и дребезг мог бы тут подпортить картинку...
Мастер Ломастер писал(а):в лучшем - получите задваивание показаний