Примеры CodeVisionAVR - Таймер & часы, ЖКИ.

Автор: Internet. Опубліковано в Початківцям з CV AVR

Зміст статті

Таймер обратного отсчёта ,  интервал времени в диапазоне от 1 секунды до 24 часов.

Простая схема, источник   http://cxema.at.ua Author : Katran

 
Code

Chip type : ATmega8
Program type : Application
AVR Core Clock frequency: 4,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega8.h>
#asm
.equ __lcd_port=0x12 ;PORTD
#endasm
#include <lcd.h>
#include <delay.h>
unsigned char a=0, b=0, c=0, d=0, e=0, f=0, help=0; // ab : cd : ef
char hours, minuts, seconds;
#define SIGNAL PORTD.3
#define ON 1
#define OFF 0
#define MPLUS PINB.2
#define MMINUS PINB.3
#define SPLUS PINB.4
#define SMINUS PINB.5
#define PUSK PINC.0
#define STOP PINC.2
// ФУНКЦИЯ ОТОБРАЖЕНИЯ ВРЕМЕНИ
void time(void) // Подготовка регистров для заполнения данными
{
a = 0;
b = 0;
c = 0;
d = 0;
e = 0;
f = 0;
//=============================================================================
help = hours; // Разложение значения ЧАСов по разрядам ab : __ : __
while (help > 9)
{
help -= 10;
a++;
};
b = help;
//=============================================================================
help = minuts; // Разложение значения МИНут по разрядам __ : cd : __
while (help > 9)
{
help -= 10;
c++;
};
d = help;
//=============================================================================
help = seconds; // Разложение значения СЕКунд по разрядам __ : __ : ef
while (help > 9)
{
help -= 10;
e++;
};
f = help;
//=============================================================================
// ОТОБРАЖЕНИЕ НА ДИСПЛЕЕ ВРЕМЕНИ В СООТВЕТСТВИИ с местрположением
// ab : cd : ef
// Alrm gh : ij
lcd_gotoxy(0,0);
lcd_putchar(a+0x30);
lcd_putchar(b+0x30);
lcd_putsf(":");
lcd_putchar(c+0x30);
lcd_putchar(d+0x30);
lcd_putsf(":");
lcd_putchar(e+0x30);
lcd_putchar(f+0x30);
lcd_gotoxy(0,1);
lcd_putsf("<<<<>>>>");
};
// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Reinitialize Timer 1 value
TCNT1H=0xBDC >> 8;
TCNT1L=0xBDC & 0xff;
// Place your code here
seconds--; // Инкремент таймера +1СЕК
if (seconds > 59) // условия при которых таймер ведет себя как часы
{
seconds = 59;
minuts--;
if (minuts > 59)
{
minuts = 59;
hours--;
if (hours > 23)
{
hours = 23;
};
};
};
// В данные часы включена функция включения нагрузки с 8 до 23,

//поэтому проверяем условие и делаем вывод
time(); // обновление дисплея
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here

PORTB=0b00111111;
DDRB=0b00000000; //
PORTC=0b11111111; // «WzAVR «Port C initialization
DDRC=0b00000000; //
PORTD=0b00000000; // «WzAVR «Port D initialization
DDRD=0b00001000;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x03;
TCNT1H=0x0B;
TCNT1L=0xDC;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
TIMSK=0x04;
ACSR=0x80;
SFIOR=0x00;
// LCD module initialization
lcd_init(16);
// НАЧАЛЬНАЯ ИНИЦИАЛИЗАЦИЯ
timing:
while (PUSK == 1)
{
if (MPLUS == 0)
{
minuts++;
if (minuts > 59)
{
minuts = 0;
hours++;
if (hours > 23)
{
hours = 0;
};
};
}
if (MMINUS == 0)
{
minuts--;
if (minuts > 59)
{
minuts = 59;
hours--;
if (hours > 23)
{
hours = 23;
};
};
};
if (SPLUS == 0)
{
seconds++;
if (seconds > 59) seconds = 0;
};
if (SMINUS == 0)
{
seconds--;
if (seconds > 59) seconds = 59;
};
delay_ms(100);
time();
};
// Global enable interrupts
#asm("sei")
while (1)
{
// проводим сравнение для включения нагрузки
if (STOP == 0)
{
#asm("cli")
SIGNAL = OFF;
goto timing;
};
if (hours == 0)
{
if (minuts == 0)
{
if (seconds == 0)
{
#asm("cli")
SIGNAL = ON;
}
}
}

};
}

Скачать архив проекта; исходный код, прошивка,  proteus.

Секундомер  на МК ATtiny2313 6 знаков. 

Code
/*****************************************************
This program was produced by the
CodeWizardAVR V2.04.4a Advanced
Automatic Program Generator
© Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l.
c2.at.ua
 Chip type : ATtiny2313
AVR Core Clock frequency: 8,000000 MHz
Memory model : Tiny
External RAM size : 0
Data Stack size : 32
*****************************************************/
#include <tiny2313.h>
#include <delay.h>
unsigned char razrad=0b00100000; 
bit start=0; 
unsigned char cloc[6]={0,0,0,0,0,0};
unsigned char tik=0;
unsigned char des_tik=0;
unsigned char sec=0;
unsigned char des_sec=0;
unsigned char min=0; 
unsigned char des_min=0;
unsigned char x=0;
unsigned char znak [10] = {0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110, 0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111};//знакогенератор OA.
//unsigned char znak [10] = {0b11000000, 0b11111001, 0b10100100, 0b10110000, 0b10011001, 0b10010010, 0b10000010, 0b11111000, 0b10000000, 0b10010000};//знакогенератор OK.
//****************************** динамическая индикация ************************************
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
PORTD = razrad^0xFF ;
// PORTD = razrad; 
PORTB = znak [cloc[x]];
if ((x==2) | | (x==4)) {PORTB.7 =1;} else PORTB.7 =0;
razrad>>= 1; x++; 
if (x==6) {x=0; razrad=0b00100000;} 
// if (x==4) {x=0; razrad=0b0001000;} 
}
//******************************** отсчет времени ************************************
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
if (start==0) goto m1;
tik++;
if (tik==10) {tik=0; des_tik++;}
if (des_tik==10) {des_tik=0; sec++;}
if (sec==10) {sec=0; des_sec++;}
if (des_sec==6) {des_sec=0; min++;}
if (min==10) {min=0; des_min++;}
if (des_min==10) {des_min=0;}
cloc[0] = tik;
cloc[1] = des_tik;
cloc[2] = sec;
cloc[3] = des_sec;
cloc[4] = min; 
cloc[5] = des_min; 

m1:
}
void main(void)
{
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
PORTA=0x00;DDRA=0x00;
PORTB=0x00;DDRB=0xFF;
PORTD=0x40;DDRD=0x3F;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x03;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: CTC top=OCR1A
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x0B;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x04;
OCR1AL=0xE2;
OCR1BH=0x00;
OCR1BL=0x00;
TIMSK=0x42;
ACSR=0x80;
#asm("sei")
while (1)
{
while (PIND.6!=0) {};
start++; delay_ms(200);
while (PIND.6!=1) {};
};
}

Скачать архив проекта секудомера; исходный код  , прошивка,  proteus.