Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 13.11.2013, 22:44  
Bahmut_aiirsoft
Прохожий
 
Регистрация: 13.11.2013
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Bahmut_aiirsoft на пути к лучшему
По умолчанию "Шахматный" таймер на ATmega 8515

Привет ребята, помогите написать программу. Использоваться будет в таймере по типу шахматного.
Есть две кнопки, одна запускает первый таймер и заставляет мигать светодиод. При нажатии на вторую: 1 таймер останавливается, запускается второй, начинает мигать другой диод, значения времени должны сохраняться.
Все данные выводятся на LCD.
Не пойму как описать таймер.

Код:
#include ‹mega8515.h›
 
#asm
   .equ __lcd_port=0b00011000 ;PORTB
#endasm
#include ‹lcd.h›
#include ‹delay.h›
#define blue_LED PORTA.7  // вместо PORTA.7 возможна запись blue_LED
#define red_LED PORTA.0   // вместо PORTA.0 возможна запись red_LED

int BUTTON ; // Описал кнопку
volatile int sb = 0 ; //
volatile int mb = 0; //
volatile int chb = 0 ;// Обнуление таймеров
volatile int sr = 0 ; //
volatile int mr = 0 ; //
volatile int chr = 0 ;//

interrupt [TIM1_COMPA] void timer1_compa_isr(void) //Обработка прерывания таймера
 {
  TCNT1H=0;
  TCNT1L=0;
 }

interrupt[2] void BUTTON_RED(void) //Обработчик прерываний на INT0.
  {
     BUTTON = 1;   
  }      

interrupt[3] void BUTTON_BLUE(void) //Обработчик прерываний на INT1.
  {
     BUTTON = 2;
  } 
      
void red ( int sr, int mr, int chr)
  {
       red_LED = 1; delay_ms(500); 
       red_LED = 0; delay_ms(3000);  
       sr++; // увеличиваем переменную каждую секунду
        if(sr›59)  // обнуляем секунды после 59
          { 
            mr++; 
            sr=0;
            if(mr›59)
              {
                chr++;
                mr=0;
         
                if(chr›23)
                  {
                    chr=0;
                  }
              }  
         
         }
      
        lcd_gotoxy(8,0); 
        lcd_putchar(chb/10+0x30);
        lcd_putchar(chb%10+0x30);
        lcd_putchar(0x3A); 
        lcd_putchar(mb/10+0x30);
        lcd_putchar(mb%10+0x30);
        lcd_putchar(0x3A); 
        lcd_putchar(sb/10+0x30);
        lcd_putchar(sb%10+0x30);
        //return (sr, mr, chr);
  }      
  
      
void blue ( int sb, int mb, int chb) 
  {  
    blue_LED = 1; delay_ms(500); 
       blue_LED = 0; delay_ms(3000);  
       sb++; // увеличиваем переменную каждую секунду
        if(sb›59)  // обнуляем секунды после 59
          { 
            mb++; 
            sb=0;
            if(mb›59)
              {
                chb++;
                mb=0;
         
                if(chb›23)
                  {
                    chb=0;
                  }
              }  
         
         }
         
        lcd_gotoxy(8,1); 
        lcd_putchar(chr/10+0x30);
        lcd_putchar(chr%10+0x30);
        lcd_putchar(0x3A); 
        lcd_putchar(mr/10+0x30);
        lcd_putchar(mr%10+0x30);
        lcd_putchar(0x3A); 
        lcd_putchar(sr/10+0x30);
        lcd_putchar(sr%10+0x30);
        //return (sb, mb, chb);
  } 
void main(void)
  {
    DDRA=0b11111111;        // Все выводы порта А - выходы.
    PORTA=0b00000000;       // На всех выводах порта А лог.0.
    DDRD=0b00000000;        // Все выводы порта D - входы. 
    PORTD=0b11111111;       // Ко всем выводам порта D подтянем питание, т.е. на всех выводах - лог.1.  
    GICR=0b11000000;        // Разрешим внешние прерывания по INT0 и INT1.  
    MCUCR=0b00000101;       // Прерывание срабатывает по любому изменению уровня на выводах INT0 и INT1.
 
    TCCR1A=0b00000000;      // OC1A/OC1B - отключены.
    TCCR1B=0b00000101;      // Предделитель установлен 1/1024.
    TCNT1H=0b00000000;      // ???
    TCNT1L=0b00000000;      // ???
    ICR1H=0b00000000;       // ???
    ICR1L=0b00000000;       // ???
    OCR1AH=0b00011110;      // ???
    OCR1AL=0b10000101;      // ???
 
    TIMSK=0b00010000;       //
    #asm("sei") ; 
    
    
    lcd_init(16);            // Инициализация LCD
    lcd_gotoxy(0,0);
    lcd_putsf("Blue");
    lcd_gotoxy(0,1);
    lcd_putsf("Red");
   
                       
    BUTTON = 0;
  
   while (1)
   {  
     switch (BUTTON)
     {
       case 1: red ( sb, mb, chb ); break;  
       case 2: blue ( sr, mr, chr ); break;
     }      
   };        
  }
Реклама:
Bahmut_aiirsoft вне форума  
Непрочитано 14.11.2013, 03:28  
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,448
Сказал спасибо: 96
Сказали Спасибо 319 раз(а) в 233 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: "Шахматный" таймер на ATmega 8515

Набросал, как бы сделал я.
Кнопки должны замыкать вывод порта на землю.
Должна быть включена внутренняя подтяжка портов на кнопках.

Инициализацию портов не делал - сами сделаете.
Остановка таймера - повторное нажатие на работающий таймер.

Опрос кнопок - программный с антидребезгом.
PHP код:
 
#include ‹mega8515.h›
#include ‹stdio.h›
#include ‹delay.h›
#include ‹alcd.h›

#define PLED_BLUE       PORTA
#define PLED_RED        PORTA
#define PBUTTON_BLUE    PINB
#define PBUTTON_RED     PINB

#define LED_BLUE        0b00000001
#define LED_RED         0b00000010
#define BUTTON_BLUE     0b00000010
#define BUTTON_RED      0b00000010

#define _ALTERNATE_PUTCHAR_

register unsigned char mode     0;                            // 0 bit - timer_blue; 1 bit - timer_red.

unsigned char h_red             0;
unsigned char m_red             0;
unsigned char s_red             0;

unsigned char h_blue            0;
unsigned char m_blue            0;
unsigned char s_blue            0;


void putchar(unsigned char c)
{
lcd_putchar(c);
}


// Timer1 output compare A interrupt service routine
interrupt [TIM1_COMPAvoid timer1_compa_isr(void)
{
if(
mode 1)    {
                
s_blue++;
                if(
s_blue59)   {
                                
s_blue=0;
                                
m_blue++;
                                if(
m_blue59)   {
                                                
m_blue=0;
                                                
h_blue++;
                                                }
                                }
                
PLED_BLUE ^= LED_BLUE;
                }
if(
mode 2)    {
                if(
s_red59)    {
                                
s_red=0;
                                
m_red++;
                                if(
m_red59)    {
                                                
m_red=0;
                                                
h_red++;
                                                }
                                }
                
PLED_RED ^= LED_RED;
                }
lcd_gotoxy(0,0);
printf("%2u:%02u:%02u",h_blue,m_blue,s_blue);
lcd_gotoxy(1,0);
printf("%2u:%02u:%02u:",h_red,m_red,s_red);
}


void init(void)
{
PORTA   =0x00;
DDRA    =0x00;
PORTB   =0x00;
DDRB    =0x00;
PORTC   =0x00;
DDRC    =0x00;
PORTD   =0x00;
DDRD    =0x00;
PORTE   =0x00;
DDRE    =0x00;

MCUCR   0x00;
EMCUCR  0x00;
UCSRB   0x00;
ACSR    0x80;
SPCR    0x00;

// Clock value: Timer 0 Stopped
TCCR0   =0x00;
TCNT0   =0x00;
OCR0    =0x00;

// Clock value: 31,250 kHz
// Mode: CTC top=OCR1A
TCCR1A  0x00;
TCCR1B  0x0C;
TCNT1H  0x00;
TCNT1L  0x00;
ICR1H   0x00;
ICR1L   0x00;
OCR1AH  0x7A;
OCR1AL  0x11;
OCR1BH  0x00;
OCR1BL  0x00;

TIMSK   0x40;
}


void main(void)
{
init();
lcd_init(16);

#asm("sei")

begin:
if((
PBUTTON_BLUE BUTTON_BLUE) == 0)   {
                                        if(
mode == 1)   {
                                                        
mode 0;
                                                        
PLED_BLUE &=  ~LED_BLUE;
                                                        }
                                        else            
mode 1;
                                        
PLED_RED &=  ~LED_RED;
                                        while((
PBUTTON_BLUE BUTTON_BLUE)==0);
                                        }
if((
PBUTTON_RED BUTTON_RED) == 0)     {
                                        if(
mode == 2)   {
                                                        
mode 0;
                                                        
PLED_RED &=  ~LED_RED;
                                                        }
                                        else            
mode 2;
                                        
PLED_BLUE &=  ~LED_BLUE;
                                        while((
PBUTTON_RED BUTTON_RED)==0);
                                        }
delay_ms(100);                                     
goto 
begin;

Godzilla82 вне форума  
Непрочитано 14.11.2013, 03:50  
gary2007
Почётный гражданин KAZUS.RU
 
Аватар для gary2007
 
Регистрация: 24.09.2007
Адрес: Полтава, UA
Сообщений: 2,450
Сказал спасибо: 376
Сказали Спасибо 1,060 раз(а) в 624 сообщении(ях)
gary2007 на пути к лучшему
По умолчанию Re: "Шахматный" таймер на ATmega 8515

Сообщение от Bahmut_aiirsoft Посмотреть сообщение
Есть две кнопки, одна запускает первый таймер и заставляет мигать светодиод. При нажатии на вторую: 1 таймер останавливается, запускается второй, начинает мигать другой диод, значения времени должны сохраняться.
Таймера достаточно одного а вот счетчика нужно два, программного счетчика.
Таймер по кнопкам делает инкремент либо первого, либо второго счетчика и все будет сохраняться.
Зачем только тут нужна мега8515 с четырьмя полными портами - не пойму.
__________________
Мелочи не решают главного. Они решают всё!
gary2007 вне форума  
Непрочитано 14.11.2013, 03:58  
ut1wpr
Почётный гражданин KAZUS.RU
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: "Шахматный" таймер на ATmega 8515

Сообщение от gary2007 Посмотреть сообщение
Таймера достаточно одного а вот счетчика нужно два, программного счетчика.
Таймер по кнопкам делает инкремент либо первого, либо второго счетчика и все будет сохраняться.
Зачем только тут нужна мега8515 с четырьмя полными портами - не пойму.
Танька 13 справится. Но 8515 выглядит намного внушительнее. Особенно, если реализовать бегающие огоньки по кругу на 60-ти СД.
Были бы выводы/порты. А уж каким ногодрыгом их занять - всегда придумать можно.
__________________
С уважением,
Vic / ut1wpr

Последний раз редактировалось ut1wpr; 14.11.2013 в 04:01.
ut1wpr вне форума  
Непрочитано 14.11.2013, 23:20  
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,448
Сказал спасибо: 96
Сказали Спасибо 319 раз(а) в 233 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: "Шахматный" таймер на ATmega 8515

Сообщение от ut1wpr Посмотреть сообщение
Танька 13 справится...
Ну повесьте на неё LCD двухстрочный - я посмотрю на это Советчики
Godzilla82 вне форума  
Непрочитано 15.11.2013, 00:04  
SergSPio
Прохожий
 
Регистрация: 01.11.2007
Сообщений: 2
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
SergSPio на пути к лучшему
По умолчанию Re: "Шахматный" таймер на ATmega 8515

Сообщение от Godzilla82 Посмотреть сообщение
Ну повесьте на неё LCD двухстрочный - я посмотрю на это Советчики
Ладно, уболтал, ATtiny2313
SergSPio вне форума  
Непрочитано 15.11.2013, 23:43  
IOPA4
Почётный гражданин KAZUS.RU
 
Аватар для IOPA4
 
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,300
Сказал спасибо: 461
Сказали Спасибо 526 раз(а) в 273 сообщении(ях)
IOPA4 на пути к лучшему
По умолчанию Re: "Шахматный" таймер на ATmega 8515

IOPA4 вне форума  
Непрочитано 16.11.2013, 02:51  
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,448
Сказал спасибо: 96
Сказали Спасибо 319 раз(а) в 233 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: "Шахматный" таймер на ATmega 8515

Сообщение от IOPA4 Посмотреть сообщение
...
Забыли ещё пару кнопок с парой светодиодов
Godzilla82 вне форума  
Непрочитано 16.11.2013, 11:08  
IOPA4
Почётный гражданин KAZUS.RU
 
Аватар для IOPA4
 
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,300
Сказал спасибо: 461
Сказали Спасибо 526 раз(а) в 273 сообщении(ях)
IOPA4 на пути к лучшему
По умолчанию Re: "Шахматный" таймер на ATmega 8515

Сообщение от Godzilla82 Посмотреть сообщение
Забыли ещё пару кнопок с парой светодиодов
Это не мое схемное решение, но рабочее. Как видно по схеме, используется два АЦП, так вот на АЦП и вешают кнопки через делители. А вообще это извращение. Берите Атмегу8, кварц 32768 кГц, используйте прерывания второго таймера:
Код:
// Timer/Counter 2 initialization
// Clock source: TOSC1 pin
// Clock value: PCK2/128
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x08;
TCCR2=0x05;
TCNT2=0x00;
OCR2=0x00;
Две глобальные переменные для счета времени (для первого и второго игрока).
Код:
// Timer2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
 if (igrok1==1)
{
  .....
}
if (igrok2==1)
{
...
}

}

Последний раз редактировалось IOPA4; 16.11.2013 в 11:25.
IOPA4 вне форума  
Непрочитано 16.11.2013, 12:04  
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,448
Сказал спасибо: 96
Сказали Спасибо 319 раз(а) в 233 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: "Шахматный" таймер на ATmega 8515

Сообщение от IOPA4 Посмотреть сообщение
А вообще это извращение...
Вот и я об этом же.
Godzilla82 вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сторожевой таймер в ATtiny25/45/85 mike124 Proteus 11 30.10.2012 11:19
Помогите настроить таймер в Atmega Dimitrij Микроконтроллеры, АЦП, память и т.д 8 31.12.2011 13:11
ATmega 128 . Пытаюсь запустить таймер Т2... home2010 Микроконтроллеры, АЦП, память и т.д 7 31.03.2010 07:47
Неровность фронтов на выходе порта Atmega 8515 Sereg Микроконтроллеры, АЦП, память и т.д 32 06.02.2009 18:21
Работа с внешней памятью ATMega 8515 oksman Микроконтроллеры, АЦП, память и т.д 0 28.11.2008 22:36


Часовой пояс GMT +4, время: 11:38.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot