включите светодиоды в ATMEGA8515 - PullRequest
0 голосов
/ 30 апреля 2011

Я хочу прочитать переключатели рядом со светодиодами и циклически переключать светодиоды от 0 до того, какой из переключателей нажат, если ни один из них не нажат, циклически перебирать все из них с задержкой. Для этого я использовал timer0.Так как я работаю на atmega8515.Я использовал INT0.Вот моя реализация:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define BIT(n) (1 << n) 

volatile uint8_t led, k, switches, i , j = 1;
            /* uint8_t is the same as unsigned char */
int main(void)
{



    DDRB = 0xff;                /* use all pins on PortB for output */

    led = 1;                    /* init variable representing the LED state */
    PORTB = 0XFF;

    cli( );

    TCCR0|=(1<<CS02) |(1<<CS00);

 //Enable Overflow Interrupt Enable
   TIMSK|=(1<<TOIE0);

 //Initialize Counter
   TCNT0=0;


   GICR = BIT(INT0);
    MCUCR = BIT(ISC01) | BIT(ISC00);

   sei( );

    for ( ; ;);



}


ISR(TIMER0_OVF_vect)
{

  if(switches == 0xff)
  {
    PORTB = ~led;           /* invert the output since a zero means: LED on */
        led <<= 1;              /* move to next LED */
        if (!led)               /* overflow: start with Pin B0 again */
        {
            led = 1;
        }
  }     
  else
  {
    for (k = 0; k< 8;k++)
    {
        j =  switches & (1 << k);

        if(j == 0)
        {
           for(i=1;i<=(k +1);i++)
            {   
                j = 1;
                PORTB =  ~j;
                j = 1 << i;

                _delay_ms(100);     //without this delay it doesnt cycle the LEDS from to whichever switch is pressed
            }   

    }
}
}

Но использование циклов задержки в ISR - плохая практика программирования.Как использовать тот же таймер вместо задержки?

1 Ответ

1 голос
/ 02 июня 2011

Я думаю, что в ISR вы должны просто обновить состояние светодиода, а в основном цикле вы можете установить PORTB и прочитать значения переключателей.В вашем коде, кажется, это занимает так много времени в ISR.

...