Я благодарен за помощь,но я так и не понял как можно сделать опрос
Я благодарен за помощь,но я так и не понял как можно сделать опрос
Код: Выделить всё
volatile char sw=0;
ISR(TIMER0_OVF_vect){
if( PINB & (1<<3) )sw++;
}Код: Выделить всё
#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 8000000
int main(void)
{
int sw=0;
int array[4]={0b00000001,0b00000100,0b00010000,0b01000000}; // мигание 1,3,5,7 светодиодами
int yarra[4]={0b01000000,0b00010000,0b00000100,0b00000001}; // мигание 7,5,3,1 светодиодами
DDRD &= ~(1<<PD3);
DDRA = 0b11111111;
PORTA = 0b00000000;
while(1)
{
if (PIND & (1 << PIND3))
{
_delay_ms(50);
while(PIND & (1 << PIND3));
sw++;
}
switch (sw)
{
case 0:
PORTA = 0b01010101;
break;
case 1:
for (int i = 0; i < 4; i++)
{
PORTA=array[i];
_delay_ms(250);
};
break;
case 2:
for (int i = 0; i < 4; i++)
{
PORTA=yarra[i];
_delay_ms(250);
};
break;
case 3:
PORTA = 0b00010100;
break;
case 4:
PORTA = 0b01000001;
break;
case 5:
PORTA = 0b00010001;
break;
case 6:
PORTA = 0b01010000;
break;
case 7:
PORTA = 0b00000101;
sw=0;
break;
}
}
}Код: Выделить всё
*
* AVRGCC2.c
*
* Created: 26.07.2016 23:40:50
* Author: ieroglif
*/
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h> // БИБЛИОТЕКА ПРЕРЫВАНИЙ
void programs();
void DDR_ALL_PORT();
int sw=0;
int array[4]={0b00000001,0b00000100,0b00010000,0b01000000}; // мигание 1,3,5,7 светодиодами
int yarra[4]={0b01000000,0b00010000,0b00000100,0b00000001}; // мигание 7,5,3,1 светодиодами
ISR (TIMER0_OVF_vect) //прерывание по переполнению
{
TCCR0 = (0 << WGM01) | (0 << WGM00); // ОСТАНОВКА ТАЙМЕРА
TCNT0 = 110; // НАЧАЛЬНЫЙ СЧЁТ ТАЙМЕРА
TIFR = (1 << TOV0); // УСТАНОВКА ПЕРЕПОЛНЕНИЯ СЧЁТНОГО РЕГИСТРА
TIMSK = (1 << TOIE0); // РАЗРЕШЕНИЕ НА ПРЕРЫВАНИЯ ПО ПЕРЕПОЛНЕНИЮ
TCCR0 = (1 << CS02) | (0 << CS01) | (1 << CS00); // УСТАНОВКА ПРЕДДЕЛИТЕЛЯ
if (PIND & (1 << PIND3))
{
sw++;
}
}
int main(void)
{
DDR_ALL_PORT();
TCCR0 = 0;
TCCR0 = (0 << WGM01) | (0 << WGM00); // ОСТАНОВКА ТАЙМЕРА
TCNT0 = 110; // НАЧАЛЬНЫЙ СЧЁТ ТАЙМЕРА
TIFR = (1 << TOV0); // УСТАНОВКА ПЕРЕПОЛНЕНИЯ СЧЁТНОГО РЕГИСТРА
TIMSK = (1 << TOIE0); // РАЗРЕШЕНИЕ НА ПРЕРЫВАНИЯ ПО ПЕРЕПОЛНЕНИЮ
TCCR0 = (1 << CS02) | (0 << CS01) | (1 << CS00); // УСТАНОВКА ПРЕДДЕЛИТЕЛЯ
sei();
while(1)
{
programs();
}
}
void programs()
{
switch (sw)
{
case 1:
for (int i = 0; i < 4; i++)
{
PORTA=array[i]; // можно также использовать побитовый сдвиг. PORTA = 0b00000000 << i;
_delay_ms(250);
};break;
case 2:
for (int i = 0; i < 4; i++)
{
PORTA=yarra[i];
_delay_ms(250);
};break;
case 3:
PORTA = 0b00000101;
_delay_ms(250);
PORTA = 0b01010000;
_delay_ms(250);break;
case 4:
PORTA = 0b01000001;
_delay_ms(250);break;
case 5:
PORTA = 0b00000101;
_delay_ms(250);break;
case 6:
PORTA = 0b01010000;
_delay_ms(250);break;
case 7:
PORTA = 0b01010101;
_delay_ms(250);break;
default:sw=0;break;
}
}
void DDR_ALL_PORT()
{
DDRA = 0b01010101;
DDRB = 0b00000000;
DDRC = 0b00000000;
DDRD = 0b00000000;
PORTA = 0b01010101;
PORTB = 0b00000000;
PORTC = 0b00000000;
PORTD = 0b00000000;
}
Так прерывания для того и нужны чтобы жить собственной жизнью. Когда происходит нужное событие выполнение основной программы прекращается и вызывается обработчик прерывания, основная программа даже не узнает об этом если вы туда не передадите инфу каким то образом. В этом вся прелесть, как угодно развлекайтесь в основном цикле - динамической индикацией, рисованием картинок на граф дисплее или еще чем долгим, но если нажалась кнопка - управление получит обработчик прям вот сразу.~=ieroglif=~ писал(а):вот только не пойму как он входит в обработчик прерываний,точнее когда ?Ведь в main нет "ссылки" или "перехода" на обработчик
Посоветуйте пожалуйста литературу.Z_h_e писал(а):Вам нужно почитать, что такое прерывание.
Спасибо за помощьMorroc писал(а):Так ведь уже советовали![]()