Здесь, в программе, я прокручиваю светодиоды с использованием прерывания таймера &, если кто-то нажимает переключатель, он должен остановить первый прерыватель &, который должен зажечь второй, который должен загореться светодиодом в соответствии с переключателем нажат. Здесь я немного запутался, какое прерывание вызывает. Я упомянул несколько книг для прерывания смены контактов. & написал несколько строк для установки PCMSK2. Выходной сигнал am начинается: «Сначала все светодиоды циклически переключаются, когда нажат переключатель ... циклическое перемещение светодиодов & начинается снова (это означает, что программа считывает ввод, просто не вызывая второе прерывание). или пауза & не загорается последующим светодиодом. " Может ли кто-нибудь помочь, пожалуйста?Прерывание смены выводов - внешнее прерывание с внутренним прерыванием
#include <avr/io.h>
#include <avr/interrupt.h>
#define PINK_MASK \
((1<<PINK0)|(1<<PINK1)|(1<<PINK2)|(1<<PINK3)|(1<<PINK4)|(1<<PINK5)|(1<<PINK6)|(1<<PINK7))
volatile unsigned int intrs, i=1;
void enable_ports(void);
void delay(void);
extern void __vector_23 (void) __attribute__ ((interrupt));
extern void __vector_25 (void) __attribute__ ((signal));
void enable_ports()
{
DDRB = 0xff; //PORTB as output for leds
PORTB = 0xff;
DDRK = 0x00; //PORTK as input from switches
PORTK |= PINK_MASK;
PCMSK2 = PINK_MASK; //ENABLE PCMSK2, Setting interrupts
PCICR = 0x04;
PCIFR = 0x04;
TCCR0B = 0x03; //Setting TIMER
TIMSK0 = 0x01;
TCNT0 = 0x00;
intrs = 0;
}
void __vector_23 (void)
{
intrs++;
if(intrs > 60)
{
intrs = 0;
PORTB = (0xff<<i);
i++ ;
if(i == 10)
{
PORTB = 0xff;
i = 1 ;
}
}
}
void __vector_25 (void)
{
unsigned char switches;
switches = ((~PINK) & (PINK_MASK)); //Reading from switches
if(switches & (1<<PINK0))
PORTB = (PORTB<<PINK0);
else if (switches & (1<<PINK1))
PORTB = (PORTB<<PINK1);
else if (switches & (1<<PINK2))
PORTB = (PORTB<<PINK2);
else if (switches & (1<<PINK3))
PORTB = (PORTB<<PINK3);
else if (switches & (1<<PINK4))
PORTB = (PORTB<<PINK4);
else if (switches & (1<<PINK5))
PORTB = (PORTB<<PINK5);
else if (switches & (1<<PINK6))
PORTB = (PORTB<<PINK6);
else if (switches & (1<<PINK7))
PORTB = (PORTB<<PINK7);
}
int main(void)
{
enable_ports();
sei();
while(1)
{
}
}
Спасибо за вашу поддержку.
Кто-нибудь, пожалуйста, помогите! – sneezy
Извините, я не использую Atmel μCs. Но, может быть, вы могли бы спросить на http://embdev.net/ – AndreKR
Какое конкретное устройство вы планируете? – evilspacepirate