13.11.2013, 22:44
|
|
Прохожий
Регистрация: 13.11.2013
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
"Шахматный" таймер на 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;
}
};
} |
|
|
|
|
14.11.2013, 03:28
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,439
Сказал спасибо: 97
Сказали Спасибо 314 раз(а) в 230 сообщении(ях)
|
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_COMPA] void timer1_compa_isr(void) { if(mode & 1) { s_blue++; if(s_blue›59) { s_blue=0; m_blue++; if(m_blue›59) { m_blue=0; h_blue++; } } PLED_BLUE ^= LED_BLUE; } if(mode & 2) { if(s_red›59) { s_red=0; m_red++; if(m_red›59) { 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; }
|
|
|
|
|
14.11.2013, 03:50
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Адрес: Полтава, UA
Сообщений: 2,450
Сказал спасибо: 376
Сказали Спасибо 1,060 раз(а) в 624 сообщении(ях)
|
Re: "Шахматный" таймер на ATmega 8515
Сообщение от Bahmut_aiirsoft
|
Есть две кнопки, одна запускает первый таймер и заставляет мигать светодиод. При нажатии на вторую: 1 таймер останавливается, запускается второй, начинает мигать другой диод, значения времени должны сохраняться.
|
Таймера достаточно одного а вот счетчика нужно два, программного счетчика.
Таймер по кнопкам делает инкремент либо первого, либо второго счетчика и все будет сохраняться.
Зачем только тут нужна мега8515 с четырьмя полными портами - не пойму.
__________________
Мелочи не решают главного. Они решают всё!
|
|
|
|
14.11.2013, 03:58
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: "Шахматный" таймер на ATmega 8515
Сообщение от gary2007
|
Таймера достаточно одного а вот счетчика нужно два, программного счетчика.
Таймер по кнопкам делает инкремент либо первого, либо второго счетчика и все будет сохраняться.
Зачем только тут нужна мега8515 с четырьмя полными портами - не пойму.
|
Танька 13 справится. Но 8515 выглядит намного внушительнее. Особенно, если реализовать бегающие огоньки по кругу на 60-ти СД.
Были бы выводы/порты. А уж каким ногодрыгом их занять - всегда придумать можно.
__________________
С уважением,
Vic / ut1wpr
Последний раз редактировалось ut1wpr; 14.11.2013 в 04:01.
|
|
|
|
14.11.2013, 23:20
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,439
Сказал спасибо: 97
Сказали Спасибо 314 раз(а) в 230 сообщении(ях)
|
Re: "Шахматный" таймер на ATmega 8515
Сообщение от ut1wpr
|
Танька 13 справится...
|
Ну повесьте на неё LCD двухстрочный - я посмотрю на это Советчики
|
|
|
|
15.11.2013, 00:04
|
|
Прохожий
Регистрация: 01.11.2007
Сообщений: 2
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: "Шахматный" таймер на ATmega 8515
Сообщение от Godzilla82
|
Ну повесьте на неё LCD двухстрочный - я посмотрю на это Советчики
|
Ладно, уболтал, ATtiny2313
|
|
|
|
15.11.2013, 23:43
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,300
Сказал спасибо: 461
Сказали Спасибо 526 раз(а) в 273 сообщении(ях)
|
Re: "Шахматный" таймер на ATmega 8515
|
|
|
|
16.11.2013, 02:51
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,439
Сказал спасибо: 97
Сказали Спасибо 314 раз(а) в 230 сообщении(ях)
|
Re: "Шахматный" таймер на ATmega 8515
Сообщение от IOPA4
|
...
|
Забыли ещё пару кнопок с парой светодиодов
|
|
|
|
16.11.2013, 11:08
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,300
Сказал спасибо: 461
Сказали Спасибо 526 раз(а) в 273 сообщении(ях)
|
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.
|
|
|
|
16.11.2013, 12:04
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,439
Сказал спасибо: 97
Сказали Спасибо 314 раз(а) в 230 сообщении(ях)
|
Re: "Шахматный" таймер на ATmega 8515
Сообщение от IOPA4
|
А вообще это извращение...
|
Вот и я об этом же.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 09:54.
|
|