Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

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

Отправлено BATCOH 08 марта 2007 г. 12:58
В ответ на: Программный сделай. отправлено Vit 08 марта 2007 г. 12:50

недавно таймер делал: http://ungood.narod.ru/images/timer_03.jpg


/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.2 Evaluation
Automatic Program Generator
© Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 10.02.2007
Author : Freeware, for evaluation and non-commercial use only
Company :
Comments:


Chip type : ATmega8
Program type : Application
Clock frequency : 1,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/
#include
#include
#define TMI 50

// Declare your global variables here
unsigned char SW3_state; //status SWITCH button
unsigned char ctr;// 1/10 of sec counter
unsigned char buz_state=0; // status buzzer button switch
unsigned char buz_on=1;//buz on/off status
unsigned char wh=0; //for
unsigned char ind[2]={0,0}; //for digit
unsigned char i; //for cycle
unsigned char a; //for cycle
unsigned char t_in=60; //time interval
unsigned char b=0; //time interval
unsigned char tim_state=0; //time switcher
unsigned char c=0; //for count

//////////Prototypes of functions///////////

void buzzer (char buz_ms)
{
//BUZZER sound cycle
if (buz_on==1)
{
PORTB.0 = 1;
delay_ms(buz_ms);
PORTB.0 = 0;
}
}
void sevoff(void)
{
//*****************************
// LEVIY INDIKATOR
//****************************
PORTB.1 = 0; //verhniy
PORTB.2 = 0; //p.verh
PORTB.6 = 0; //p.niz
PORTB.7 = 0; //niz
PORTC.0 = 0; //l.niz
PORTC.1 = 0; //l.verh
PORTC.2 = 0; //sered
//****************************
// PRAVIY INDIKATOR
//****************************
PORTD.7 = 0; //verhniy
PORTD.6 = 0; //p.verh
PORTD.5 = 0; //p.niz
PORTD.4 = 0; //niz
PORTD.3 = 0; //l.niz
PORTD.2 = 0; //l.verh
PORTD.1 = 0; //sered
//****************************
}

void segment(unsigned char num/*,char seg*/) //num = digit, ser = firs/second indicaror
{
i=0;
for(i=0;i<=1;i++)
{
ind[i]=num%10;
num/=10;
}

switch(ind[0])
{
case 0: (PORTD = 0xFD); break;
case 1: (PORTD = 0x61); break;
case 2: (PORTD = 0xDB); break;
case 3: (PORTD = 0xF3); break;
case 4: (PORTD = 0x67); break;
case 5: (PORTD = 0xB7); break;
case 6: (PORTD = 0xBF); break;
case 7: (PORTD = 0xE1); break;
case 8: (PORTD = 0xFF); break;
case 9: (PORTD = 0xF7); break;
}
switch(ind[1])
{
case 0: (PORTB.1 = 1, //verhniy
PORTB.2 = 1, //p.verh
PORTB.6 = 1, //p.niz
PORTB.7 = 1, //niz
PORTC.0 = 1, //l.niz
PORTC.1 = 1, //l.verh
PORTC.2 = 0 //sered
); break;
case 1: (PORTB.1 = 0, //verhniy
PORTB.2 = 1, //p.verh
PORTB.6 = 1, //p.niz
PORTB.7 = 0, //niz
PORTC.0 = 0, //l.niz
PORTC.1 = 0, //l.verh
PORTC.2 = 0 //sered
); break;
case 2: (PORTB.1 = 1, //verhniy
PORTB.2 = 1, //p.verh
PORTB.6 = 0, //p.niz
PORTB.7 = 1, //niz
PORTC.0 = 1, //l.niz
PORTC.1 = 0, //l.verh
PORTC.2 = 1 //sered
); break;
case 3: (PORTB.1 = 1, //verhniy
PORTB.2 = 1, //p.verh
PORTB.6 = 1, //p.niz
PORTB.7 = 1, //niz
PORTC.0 = 0, //l.niz
PORTC.1 = 0, //l.verh
PORTC.2 = 1 //sered
); break;
case 4: (PORTB.1 = 0, //verhniy
PORTB.2 = 1, //p.verh
PORTB.6 = 1, //p.niz
PORTB.7 = 0, //niz
PORTC.0 = 0, //l.niz
PORTC.1 = 1, //l.verh
PORTC.2 = 1 //sered
); break;
case 5: (PORTB.1 = 1, //verhniy
PORTB.2 = 0, //p.verh
PORTB.6 = 1, //p.niz
PORTB.7 = 1, //niz
PORTC.0 = 0, //l.niz
PORTC.1 = 1, //l.verh
PORTC.2 = 1 //sered
); break;
case 6: (PORTB.1 = 1, //verhniy
PORTB.2 = 0, //p.verh
PORTB.6 = 1, //p.niz
PORTB.7 = 1, //niz
PORTC.0 = 1, //l.niz
PORTC.1 = 1, //l.verh
PORTC.2 = 1 //sered
); break;
case 7: (PORTB.1 = 1, //verhniy
PORTB.2 = 1, //p.verh
PORTB.6 = 1, //p.niz
PORTB.7 = 0, //niz
PORTC.0 = 0, //l.niz
PORTC.1 = 0, //l.verh
PORTC.2 = 0 //sered
); break;
case 8: (PORTB.1 = 1, //verhniy
PORTB.2 = 1, //p.verh
PORTB.6 = 1, //p.niz
PORTB.7 = 1, //niz
PORTC.0 = 1, //l.niz
PORTC.1 = 1, //l.verh
PORTC.2 = 1 //sered
); break;
case 9: (PORTB.1 = 1, //verhniy
PORTB.2 = 1, //p.verh
PORTB.6 = 1, //p.niz
PORTB.7 = 1, //niz
PORTC.0 = 0, //l.niz
PORTC.1 = 1, //l.verh
PORTC.2 = 1 //sered
); break;
}

}

unsigned char timer1 (unsigned char sec)
{
unsigned char t=0;
for(a=sec;a>0;a--)
{
segment(a);
delay_ms(1000);
if((PINC.4 ==0)&&(b==0))
{
t++;
if(t==3)
{
b=0;
t=0;
buzzer(400);
//*****************************
// LEVIY INDIKATOR
//****************************
PORTB.1 = 1; //verhniy
PORTB.2 = 1; //p.verh
PORTB.6 = 1; //p.niz
PORTB.7 = 1; //niz
PORTC.0 = 0; //l.niz
PORTC.1 = 0; //l.verh
PORTC.2 = 0; //sered
//****************************
// PRAVIY INDIKATOR
//****************************
PORTD.7 = 1; //verhniy
PORTD.6 = 0; //p.verh
PORTD.5 = 0; //p.niz
PORTD.4 = 1; //niz
PORTD.3 = 1; //l.niz
PORTD.2 = 1; //l.verh
PORTD.1 = 0; //sered
//****************************
return t;
}
}
else t=0;
}
segment(0);//for "00" on indicator
delay_ms(500);
buzzer(500);
delay_ms(100);
sevoff();
buzzer(500);
}

void sv_show (void)
{
sevoff();
while(ctr!=6)
{
ctr++;
while(wh!=2){

PORTC.0 ^= 1; //l.niz
PORTD.5 ^= 1; //p.niz
wh++;
delay_ms(TMI);
}
wh=0;
while(wh!=2){

PORTC.1 ^= 1; //l.verh
PORTD.6 ^= 1; //p.verh
wh++;
delay_ms(TMI);
}
wh=0;
while(wh!=2){

PORTB.1 ^= 1; //verhniy
PORTD.7 ^= 1; //verhniy
wh++;
delay_ms(TMI);
}
wh=0;
while(wh!=2){

PORTB.2 ^= 1; //p.verh
PORTD.2 ^= 1; //l.verh
wh++;
delay_ms(TMI);
}
wh=0;
while(wh!=2){

PORTB.6 ^= 1; //p.niz
PORTD.3 ^= 1; //l.niz
wh++;
delay_ms(TMI);
}
wh=0;
while(wh!=2){

PORTB.7 ^= 1; //niz
PORTD.4 ^= 1; //niz
wh++;
delay_ms(TMI);
}
wh=0;
}
ctr=0;
while(ctr!=10)
{
ctr++;

delay_ms(50);
segment(88);
delay_ms(50);
sevoff();
}
ctr=0;
}

//*********MAIN FUNCTION************
void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// !Func7=Out !Func6=In Func5=In Func4=In Func3=Out !Func2=Out !Func1=Out Func0=Out
// State7=1 State6=1 State5=1 State4=1 State3=1 State2=1 State1=1 State0=1
PORTB=0x8F;
DDRB=0xFF;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In !Func2=out !Func1=out !Func0=out
// State6=P State5=1 State4=P State3=1 State2=1 State1=1 State0=1
PORTC=0x78;
DDRC=0x2F;

// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=1 State6=1 State5=1 State4=1 State3=1 State2=1 State1=1 State0=1
PORTD=0xFF;
DDRD=0xFF;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
PORTB.0 = 0;//BUZZER status OFF!!!
// Program starts here
// ==============================================

sv_show();
mark: //metka

sevoff();
SW3_state = PINC.4; //recieve switch button status for star timing
ctr = 0;
buz_state = PINC.3; //recieve switch button status for buzzer
tim_state = PINC.5;
while (PINC.4 == SW3_state) {

if(PINC.5 !=tim_state)
{
c++;
switch(c)
{
case 1: (t_in=30,
segment(t_in),
delay_ms(100),
sevoff() ); break;
case 2: (t_in=60,
segment(t_in),
delay_ms(100),
sevoff() ); break;
case 3: (t_in=90,
segment(t_in),
delay_ms(100),
sevoff(),
c=0 ); break;

}
PORTB.0 = 1;
delay_ms(40);
PORTB.0 = 0;
delay_ms(300);
}
if(PINC.3 !=buz_state)
{
buz_on ^=1;
delay_ms(300);
if(buz_on == 0) //buzzer sound off/on
{
PORTB.1 = 1; //verhniy
PORTD.4 = 1; //niz

delay_ms(100);
PORTB.1 = 0; //verhniy
PORTD.4 = 0; //niz

}
if(buz_on == 1)
{
PORTC.2 = 1; //sered
PORTD.1 = 1; //sered
PORTB.0 = 1;
delay_ms(100);
PORTC.2 = 0; //sered
PORTD.1 = 0; //sered
PORTB.0 = 0;
}
}

delay_ms(20);
ctr++; /* count 1 interval with 20ms */

// every 500ms...
if (ctr == 25){
/* if passed 25 times for 20 ms */
ctr = 0;
PORTD.0 ^= 1; // switch LED
};
}
buzzer(100);
PORTD.0 = 1; // LED=OFF
//!!!!!!!!!!!!!!START TIMING!!!!!!!!!!!!!!!!!!!!!!!
timer1(t_in);

delay_ms(1000);
goto mark;


}

Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
вычтите из двух единицу:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru