- •Силовая часть:
- •Логическая часть устройства управления (жесткий вариант).
- •1. Основная программа.
- •2. Подпрограмма обработки прерывания.
- •Формирование задержки на 5,6 сек с помощью таймера tmr1.
- •Формирование задержки на 3,9 сек с помощью таймера tmr1.
- •Текст программы.
- •Результат компиляции программы.
1. Основная программа.
2. Подпрограмма обработки прерывания.
H. Расчет времени задержек.
Формирование задержки на 5,6 сек с помощью таймера tmr1.
Счетчик таймера TMR1 16-разрядный, следовательно, максимальное время его срабатывания при тактовой частоте 4 МГц составляет 65 536 мксек, но в составе таймера TMR1 имеется предделитель с максимальным коэффициентом деления 1:8, поэтому время срабатывания таймера можно довести до 65536 х 8 = 524 288 мксек. Однако этого недостаточно для получения требуемой задержки и потребуется :
5600000 : 524288 = 10,68 циклов.
Принимаем 11 циклов. Тогда максимальная задержка составит:
524288 х 11 = 5767168 мксек и для получения требуемой задержки надо компенсировать 167168 мксек. Предделитель позволит уменьшить число до:
167168 : 8 = 20896 мксек. Поэтом в счетчик таймера перед его пуском необходимо записать число: 65536 – 20896 = 44640, или в шестнадцатиричной форме AE60. Окончательно получим: для получения задержки в 5,6 сек необходимо включить предделитель на максимальный коэффициент деления 1:8, в каждом цикле в счетчик таймера записывать число AE60 и отработать 11 циклов таймера.
Формирование задержки на 3,9 сек с помощью таймера tmr1.
Счетчик таймера TMR1 16-разрядный, следовательно, максимальное время его срабатывания при тактовой частоте 4 МГц составляет 65 536 мксек, но в составе таймера TMR1 имеется предделитель с максимальным коэффициентом деления 1:8, поэтому время срабатывания таймера можно довести до 65536 х 8 = 524 288 мксек. Однако этого недостаточно для получения требуемой задержки и потребуется :
3900000 : 524288 = 7,44 циклов.
Принимаем 8 циклов. Тогда максимальная задержка составит:
524288 х 8 = 4194304 мксек и для получения требуемой задержки надо компенсировать 294304 мксек. Предделитель позволит уменьшить число до:
294304 : 8 = 36788 мксек. Поэтом в счетчик таймера перед его пуском необходимо записать число: 65536 – 36788 = 28748, или в шестнадцатиричной форме 704C.
Окончательно получим: для получения задержки в 3,9 сек необходимо включить предделитель на максимальный коэффициент деления 1:8, в каждом цикле в счетчик таймера записывать число 704C и отработать 8 циклов таймера.
Текст программы.
1:
2: //
3: #define XTAL_FREQ 4MHZ
4: #define byte unsigned char
5: #define word unsigned int
6: #include <pic.h>
7: #include <stdio.h>
8: __CONFIG(HS & WDTDIS & PWRTEN & LVPDIS & DUNPROTECT & PWRTEN);
9: char schet; //число циклов переполнения таймеров TMR0, TMR1, TMR2
10: char perep1; //программный счетчик первого уровня
11: char perep2; //программный счетчик второго уровня
12: char perep3; //программный счетчик третьего уровня
13: interrupt isr (void); //подключение подпрограммы обслуживания прерывания.
14: main(){
15:
16: ANSEL= 0x00; //включение PORTA в цифровой режим
17: TRISA= 0xFD; //настройка PORTA (RA1 на вывод, остальные разряды - на ввод
18: ANSELH=0x00; //включение PORTB в цифровой режим
19: TRISB =0xFF; //настройка PORTB на ввод
20: TRISC =0x00; //настройка PORTC на вывод
21: TRISD =0x00; // настройка PORTD на ввод
22: OPTION = 0x07; //подключение подтягивающих резисторов
23: // предделитель включен перед таймером TMR0, коэфф. деления 1:256
24: PORTC=0x00; // сброс выходного порта С
25: INTE = 1 ; // разрешение прерывания от внешнего источника
26: GIE = 1; //глобальное разрешение прерывания.
27: for (;;){ //бесконечный цикл
28: for (;!RD0;){ }
29: RA3 = RD0&&!RD1; //включение индикатора начала работы программы.
30: for (!RC4){
31: RС4 = RD0&&RB2&&!RB5; //включение гидростанции Кг
32: }
33: RC2 = 1; //включение индикации задержки на 8 сек с помощью TMR0
34: for(schet=0;schet<0x7B;schet++){ // 7B – число циклов срабатывания таймера
35: T0IF=0; //сброс флага таймера TMR0
36: TMR0=0x12; //пуск таймера TMR0
37: for(;!TOIF;){} //ожидание срабатывания таймера TMR0
38: }
39: RC2=0; //отключение индикации задержки
40: for(!RC5;) {
41: RC5 = (RB3&&RB1&&RC4&&!RB5) || (RB3&&RC4&&!RB5); //включение электрогидроклапана
42:
43: }
44: RC0 =0; // предварительное отключение Кп и Кр
45: RC1=0;
46: for(;!RC0;){
47: RC0=(RD0&&!RD1&&RD4&&RC5&&RC4&&!RC1&&!RB4) || (RD0&&!RD6&&!RD3&&RC5&&RC4&&!RC1&&!RB4) || (RD0&&!RD1&&RD6&&RD7&&RC5&&RC4&&!RC1&&!RB4);
48: } // булево уравнение для Кп (RC0)
49: RC2=1; // включение индикации задержки на 5,6 сек с помощью таймера TMR1
50: T1CON = 0x30; //включен предделитель 1:8, тактовый сигнал – внутренний, Fosc /4
51:
52: for(schet=0;schet<0x11;schet++){ // 11– число циклов срабатывания таймера
53:
54: TMR1IF = 0; // сброс флага таймера
55: TMR1H = 0xAE; // установка старшего байта счетчика таймера
56: TMR1L = 0x60; //установка младшего байта счетчика таймера
57: TMR1ON = 1; //пуск таймера TMR1
58:
59: for(;!TMR1IF;){} //ожидание срабатывания таймера TMR1
60: }
61: RC2 = 0; //отключение индикации задержки
62:
63: RC0 = 0; // отключение Кп
64: RC2 = 0; //отключение индикации задержки
65:
66: for(;!RC1;){
67: RC1=(RD0&&!RD7&&RC4&&RC0&&RC5&&!RB4) || (RD0&&!RD7&&RD2&&!RD5&&RC4&&RC0&&RC5&&!RB4) || (RD0&&!RB1&&RC4&&RC0&&RC5&&!RB4);
68: } // условие включения Кр
69: RC2 =1; // включение индикации задержки на 3,9 сек с помощью таймера TMR1
70: T1CON = 0x30; //включен предделитель 1:8, тактовый сигнал – внутренний, Fosc /4
71:
72: for (schet = 0x00; schet < 0x08; shet ++ ) { // 08– число циклов срабатывания таймера
73:
74: TMR1IF = 0; // сброс флага таймера
75: TMR1H = 0x70; // установка старшего байта счетчика таймера
76: TMR1L = 0x4C; //установка младшего байта счетчика таймера
77: TMR1ON = 1; //пуск таймера TMR1
78: for(;!TMR1IF;){} //ожидание срабатывания таймера TMR1
79: }
80:
81: RC1=0; //отключение Кр
82: PORTC = 0x00; // отключение всех устройств и индикаторов.
83:
84: } //конец цикла
85: } // конец main
86:
87:
88: interrupt isr (void)
89: {
90: if(INTF)
91: {PORTC = 0x00;
92: RC2 = 1;
93: INTF = 0;
94: for (perep3 = 0x00; perep3 <0x68; perep3 ++ {
95: for (perep2 = 0x00; perep2 <0xFF; perep2 ++ {
96: for (perep1 = 0x00; perep1 <0xFF; perep1 ++ { }
97: }
98: }
99: RC2 = 0;
100: RA1=0;
101: GIE = 1;
102: } // выход из прерывания.
