.. уж лучше опрос по таймеру - жать сюда...Antifritz писал(а):Использовать внешние прерывания
Счетчик нажатий на кнопку
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
- Реклама
- Сообщения: 43
- Зарегистрирован: Пт мар 29, 2013 13:07:03
Вот настроил порт инт0, только сейчас у меня не выполняются условия.
Код: Выделить всё
void main( void )
{
int i=0;
DDRB=0xFF;
PORTB=0x00;
DDRD = 0x00;
PORTD = 0xFF;
MCUCR |= (0<<ISC01)|(1<<ISC00);
GICR |= (1<<INT0);
#asm("sei")
while(1){
if (PIND.2==0){
i=i+1;
delay_ms(50);
}
switch(i){
case 1:
{
break;
}
case 2:
{
break;
}
case 3:
{
break;
}
default:
i=1;
}
}
}
- Сообщения: 43
- Зарегистрирован: Пт мар 29, 2013 13:07:03
Может ошибка в монтаже, схеме, как проверяете? Тип корпуса какой? Из кода понял только что мега8. Можете выложить схему и фото вашего устройства?
- Сообщения: 43
- Зарегистрирован: Пт мар 29, 2013 13:07:03
Подключение я описывал на предыдущей странице,схема собрана в протеусе
- Реклама
А весь проект одним архивом выложить никак?
- Сообщения: 43
- Зарегистрирован: Пт мар 29, 2013 13:07:03
Ну вот уже что то, согласно программе приведенной выше будет моргать светодиод подключенный к PB0, если хотите чтобы загорались все 8 светодиодов нужно в место PORTB.0 = 1; написать PORTB = 0xFF;
- Сообщения: 43
- Зарегистрирован: Пт мар 29, 2013 13:07:03
Уважаемый. вы походу не в курсе дела. Написать код для эффекта-не проблема. Вопрос заключается в другом. Повторюсь. У меня на порт ИНТ0 повешена кнопка. Мне нужно чтобы по нажатию этой кнопки эффекты переключались. Кнопка должна срабатывать на любом светодиоде,прерывать цикл и переключать наследующий. Я попытался настроить порт ИНТ0 на глобальные прерывания, только у меня перестали выполнять условия case0/1/2. Как это исправить?Как настроить порт правильно и что надо изменить?
где Ваш обработчик прерывания?MAndrey90 писал(а):Вот настроил порт инт0, только сейчас у меня не выполняются условия.Код: Выделить всё
MCUCR |= (0<<ISC01)|(1<<ISC00); GICR |= (1<<INT0); #asm("sei")
- Сообщения: 43
- Зарегистрирован: Пт мар 29, 2013 13:07:03
Пробовал делать обработчик прерывания по вектору Инт0, так CodeVision матерно ругаться начинает.
"ISR(INT0_vect){}"
"ISR(INT0_vect){}"
это же синтаксис WinAVR. зачем?
в CVAVR мастер (визард) сам предлагает шаблон, когда поставите галочку использования прерывания по INT0:
в CVAVR мастер (визард) сам предлагает шаблон, когда поставите галочку использования прерывания по INT0:
Код: Выделить всё
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
}- Сообщения: 43
- Зарегистрирован: Пт мар 29, 2013 13:07:03
не могли бы вы подредактировать мой код как это все должно быть. Просто я пока не мало понимаю как это организовано должно быть. Спасибо.
не все столь очевидно. если Ваши эффекты - просто мигания с разной частотой, то сами мигания нужно реализовать по прерываниям таймера, а по INT0 - перестройку таймера на другую частоту. если эффекты какие-то другие - нужно думать для конкретной задачи - как реализовать. просто так никто свое время не будет тратить. Вам надо в "Базар-Есть работа". если стоит конкретная задача - сам готов помочь за разумное вознаграждение (прошу в личку). обучать и разжевывать с нуля вряд ли кто-то будет.
Можно так попробовать, но как писал выше a_skr по прерыванию таймера самое оно.
Код: Выделить всё
volatile char i=0;
void main( void )
{
DDRB = 0xFF;
PORTB = 0x00;
DDRD = 0x00;
PORTD = 0xFF;
MCUCR |= (1<<ISC01)|(0<<ISC00);// по спаду
GICR |= (1<<INT0);
#asm("sei")
while(1){
switch(i){
case 1: break;
case 2: break;
case 3: break;
default: i=0;
};
}
}
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
i++;
} - Сообщения: 43
- Зарегистрирован: Пт мар 29, 2013 13:07:03
- Сообщения: 43
- Зарегистрирован: Пт мар 29, 2013 13:07:03
Возникла новая проблемка. Подключил 7-ми сегментный индикатор, кодом могу вывести любую цифру, кроме 1. ну никак она не загорается. Подскажите hex код для вывода этой цифры. Пробовал 0x06-выводится единица и горит заодно средний сегмент индикатора. Подскажите а.
ПЫ.СЫ. Индикатор с общим катодом.
ПЫ.ПЫ.СЫ.Использую динамическую индикацию.
ПЫ.СЫ. Индикатор с общим катодом.
ПЫ.ПЫ.СЫ.Использую динамическую индикацию.
Ярко светит ? может ее засвечивает ближайший сегмент (C) ?
- Сообщения: 43
- Зарегистрирован: Пт мар 29, 2013 13:07:03
нет,простогорит как и все сегменты. на другом индикаторе все ок.все сделано только в протеусе
На код можно взглянуть?
Мой пример на иар на 8 сегментов
Мой пример на иар на 8 сегментов
Спойлер
Код: Выделить всё
#define MAX_DIGIT 8
unsigned char LED_RAM[MAX_DIGIT];
unsigned char LED_BUFF[MAX_DIGIT];
#define seg_A PORTB_Bit3
#define seg_B PORTB_Bit6
#define seg_C PORTC_Bit1
#define seg_D PORTD_Bit7
#define seg_E PORTB_Bit1
#define seg_F PORTD_Bit1
#define seg_G PORTD_Bit5
#define seg_DP PORTB_Bit5
#define seg_1 PORTC_Bit0
#define seg_2 PORTB_Bit4
#define seg_3 PORTB_Bit2
#define seg_4 PORTB_Bit0
#define seg_5 PORTD_Bit6
#define seg_6 PORTB_Bit7
#define seg_7 PORTD_Bit2
#define seg_8 PORTD_Bit0
#define seg_out_A DDRB_Bit3
#define seg_out_B DDRB_Bit6
#define seg_out_C DDRC_Bit1
#define seg_out_D DDRD_Bit7
#define seg_out_E DDRB_Bit1
#define seg_out_F DDRD_Bit1
#define seg_out_G DDRD_Bit5
#define seg_out_DP DDRB_Bit5
#define seg_out_1 DDRC_Bit0
#define seg_out_2 DDRB_Bit4
#define seg_out_3 DDRB_Bit2
#define seg_out_4 DDRB_Bit0
#define seg_out_5 DDRD_Bit6
#define seg_out_6 DDRB_Bit7
#define seg_out_7 DDRD_Bit2
#define seg_out_8 DDRD_Bit0
#define segpins(a,b,c,d,e,f,g) ((a<<0)|(b<<1)|(c<<2)|(d<<3)|(e<<4)|(f<<5)|(g<<6))
const unsigned char __flash SEG_CODE [20] =
{
segpins(1,1,1,1,1,1,0),//0
segpins(0,1,1,0,0,0,0),//1
segpins(1,1,0,1,1,0,1),//2
segpins(1,1,1,1,0,0,1),//3
segpins(0,1,1,0,0,1,1),//4
segpins(1,0,1,1,0,1,1),//5
segpins(1,0,1,1,1,1,1),//6
segpins(1,1,1,0,0,0,0),//7
segpins(1,1,1,1,1,1,1),//8
segpins(1,1,1,1,0,1,1),//9
segpins(1,1,1,0,1,1,1),//A
segpins(0,0,1,1,1,1,0),//b
segpins(1,0,0,1,1,1,0),//C
segpins(0,1,1,1,0,1,1),//d
segpins(1,0,0,1,1,1,1),//E
segpins(1,0,0,0,1,1,1),//F
segpins(0,0,0,0,0,0,1), //- 16
segpins(0,0,1,0,1,0,1), //- n 17
segpins(0,0,0,0,0,0,0), //- 18
};
void LED_DRIVER(unsigned char num,unsigned char data);
void INIT_LED_PORT(unsigned char num,unsigned char data);
void LED_UPDATE(void);
void main(void)
{ unsigned char key;
INIT_LED_PORT(0xFF,0xFF);
TCCR2 = (0<< FOC2)|(1<< WGM20)|(0<< COM21)|(0<< COM20)|(0<< WGM21)|(0<< CS22)|(1<< CS21)|(0<< CS20);
TIMSK = (1<<OCIE2)|(0<< TOIE2)|(0<< TICIE1)|(0<< OCIE1A)|(0<< OCIE1B)|(0<< TOIE1)|(0<< TOIE0);
asm("sei");
while(1)
{
LED_BUFF[0] = 0;
LED_BUFF[1] = 1;
LED_BUFF[2] = 2;
LED_BUFF[3] = 3;
LED_BUFF[4] = 4;
LED_BUFF[5] = 5;
LED_BUFF[6] = 6;
LED_BUFF[7] = 7;
LED_UPDATE();
};
}
void LED_UPDATE()
{
unsigned char i = MAX_DIGIT;
while(i--) LED_RAM[i] = SEG_CODE [LED_BUFF[i]];
}
#pragma vector = TIMER2_COMP_vect
__interrupt void TIMER2_COMP (void)
{unsigned char temp_numseg,tempseg;
temp_numseg = numseg;
tempseg = LED_RAM[temp_numseg];
LED_DRIVER((1<<temp_numseg),tempseg);
if (temp_numseg++ >= MAX_DIGIT) temp_numseg=0;
numseg = temp_numseg;
}
void LED_DRIVER(unsigned char num,unsigned char data)
{
seg_A = 0;
seg_B = 0;
seg_C = 0;
seg_D = 0;
seg_E = 0;
seg_F = 0;
seg_G = 0;
seg_DP = 0;
num ^= 0xFF;
seg_1 = num;
num>>=1;
seg_2 = num;
num>>=1;
seg_3 = num;
num>>=1;
seg_4 = num;
num>>=1;
seg_5 = num;
num>>=1;
seg_6 = num;
num>>=1;
seg_7 = num;
num>>=1;
seg_8 = num;
seg_A = data;
data>>=1;
seg_B = data;
data>>=1;
seg_C = data;
data>>=1;
seg_D = data;
data>>=1;
seg_E = data;
data>>=1;
seg_F= data;
data>>=1;
seg_G = data;
data>>=1;
seg_DP = data;
}
void INIT_LED_PORT(unsigned char num,unsigned char data)
{
seg_out_1 = num ;
num>>=1;
seg_out_2 = num ;
num>>=1;
seg_out_3 = num ;
num>>=1;
seg_out_4 = num ;
num>>=1;
seg_out_5 = num ;
num>>=1;
seg_out_6 = num ;
num>>=1;
seg_out_7 = num ;
num>>=1;
seg_out_8 = num ;
seg_out_A = data;
data>>=1;
seg_out_B = data;
data>>=1;
seg_out_C = data;
data>>=1;
seg_out_D = data;
data>>=1;
seg_out_E = data;
data>>=1;
seg_out_F= data;
data>>=1;
seg_out_G = data;
data>>=1;
seg_out_DP = data;
}


