Счетчик нажатий на кнопку

Обсуждаем контроллеры компании Atmel.
Ответить
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

Antifritz писал(а):Использовать внешние прерывания
.. уж лучше опрос по таймеру - жать сюда...
Реклама
Открыл глаза
Сообщения: 43
Зарегистрирован: Пт мар 29, 2013 13:07:03

Сообщение MAndrey90 »

Вот настроил порт инт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

Сообщение MAndrey90 »

Что неправильно в моем коде, где ошибка?
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский

Сообщение phanis »

Может ошибка в монтаже, схеме, как проверяете? Тип корпуса какой? Из кода понял только что мега8. Можете выложить схему и фото вашего устройства?
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Открыл глаза
Сообщения: 43
Зарегистрирован: Пт мар 29, 2013 13:07:03

Сообщение MAndrey90 »

Подключение я описывал на предыдущей странице,схема собрана в протеусе
Реклама
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский

Сообщение phanis »

А весь проект одним архивом выложить никак?
Контактная информация:
Реклама
Открыл глаза
Сообщения: 43
Зарегистрирован: Пт мар 29, 2013 13:07:03

Сообщение MAndrey90 »

бббб.jpg
(88.81 КБ) 657 скачиваний
Схема подключения
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский

Сообщение phanis »

Ну вот уже что то, согласно программе приведенной выше будет моргать светодиод подключенный к PB0, если хотите чтобы загорались все 8 светодиодов нужно в место PORTB.0 = 1; написать PORTB = 0xFF;
Контактная информация:
Открыл глаза
Сообщения: 43
Зарегистрирован: Пт мар 29, 2013 13:07:03

Сообщение MAndrey90 »

Уважаемый. вы походу не в курсе дела. Написать код для эффекта-не проблема. Вопрос заключается в другом. Повторюсь. У меня на порт ИНТ0 повешена кнопка. Мне нужно чтобы по нажатию этой кнопки эффекты переключались. Кнопка должна срабатывать на любом светодиоде,прерывать цикл и переключать наследующий. Я попытался настроить порт ИНТ0 на глобальные прерывания, только у меня перестали выполнять условия case0/1/2. Как это исправить?Как настроить порт правильно и что надо изменить?
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Сообщение a_skr »

MAndrey90 писал(а):Вот настроил порт инт0, только сейчас у меня не выполняются условия.

Код: Выделить всё

  MCUCR |= (0<<ISC01)|(1<<ISC00);
  GICR |= (1<<INT0);
        #asm("sei")
где Ваш обработчик прерывания?
Открыл глаза
Сообщения: 43
Зарегистрирован: Пт мар 29, 2013 13:07:03

Сообщение MAndrey90 »

Пробовал делать обработчик прерывания по вектору Инт0, так CodeVision матерно ругаться начинает.
"ISR(INT0_vect){}"
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Сообщение a_skr »

это же синтаксис WinAVR. зачем?
в 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

Сообщение MAndrey90 »

не могли бы вы подредактировать мой код как это все должно быть. Просто я пока не мало понимаю как это организовано должно быть. Спасибо.
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Сообщение a_skr »

не все столь очевидно. если Ваши эффекты - просто мигания с разной частотой, то сами мигания нужно реализовать по прерываниям таймера, а по INT0 - перестройку таймера на другую частоту. если эффекты какие-то другие - нужно думать для конкретной задачи - как реализовать. просто так никто свое время не будет тратить. Вам надо в "Базар-Есть работа". если стоит конкретная задача - сам готов помочь за разумное вознаграждение (прошу в личку). обучать и разжевывать с нуля вряд ли кто-то будет.
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский

Сообщение phanis »

Можно так попробовать, но как писал выше 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

Сообщение MAndrey90 »

Все заработало как надо!!!!
Всем спасибо за участие!!!
Открыл глаза
Сообщения: 43
Зарегистрирован: Пт мар 29, 2013 13:07:03

Сообщение MAndrey90 »

Возникла новая проблемка. Подключил 7-ми сегментный индикатор, кодом могу вывести любую цифру, кроме 1. ну никак она не загорается. Подскажите hex код для вывода этой цифры. Пробовал 0x06-выводится единица и горит заодно средний сегмент индикатора. Подскажите а.
ПЫ.СЫ. Индикатор с общим катодом.
ПЫ.ПЫ.СЫ.Использую динамическую индикацию.
Встал на лапы
Аватара пользователя
Сообщения: 131
Зарегистрирован: Пт апр 01, 2011 20:59:47
Откуда: Саратов

Сообщение Кефир »

Ярко светит ? может ее засвечивает ближайший сегмент (C) ?
Контактная информация:
Открыл глаза
Сообщения: 43
Зарегистрирован: Пт мар 29, 2013 13:07:03

Сообщение MAndrey90 »

нет,простогорит как и все сегменты. на другом индикаторе все ок.все сделано только в протеусе
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский

Сообщение phanis »

На код можно взглянуть?
Мой пример на иар на 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;

}
Контактная информация:
Ответить

Вернуться в «AVR»