| Форум РадиоКот https://radiokot.ru/forum/ |
|
| Помогите чайнику с таймером на PIC16F84a https://radiokot.ru/forum/viewtopic.php?f=20&t=29257 |
Страница 1 из 2 |
| Автор: | VAZZIK [ Пт апр 23, 2010 08:38:28 ] |
| Заголовок сообщения: | Помогите чайнику с таймером на PIC16F84a |
Собрал я таймер на мк , работает замечательно. Но вот беда диапозон времени не тот что нужен. В данном таймере диапазон от 0-90 мин а мне нужно от 1- 12 часов. Как это сделать? Какие изменения нужно внести в программу? Прошу вашей помощи. __CONFIG _CP_OFF &_WDT_OFF &_PWRTE_ON &_XT_OSC ; ;********************** Константы******************************* ; M_O_INIT EQU 0xC3 ;b'11000011',Загрузка OPTION. Коэфф. дел.=16 M_TA_INIT EQU 0x08 ;b'00001000',Управление портом А-TRISA M_TB_INIT EQU 0x00 ;b'00000000',Управление портом В-TRISB M_I_INIT EQU 0xA0 ;b'10100000',Загрузка INTCON M_FLAG_INIT EQU 0xFF ;b'11111111',Загрузка регистра флагов X_Pause EQU 0xFE ;Данные для счетчика X Y_Pause EQU 0xFE ;Данные для счетчика Y Z_Pause EQU 0x05 ;Данные для счетчика Z Del_Range EQU 0x82 ;Константа задержки Cycle_1 EQU 0xA0 ;Частота зв. сигнала (1024 Гц) Cycle_2 EQU 0x02 ;Скважность имп. зв. сигнала (2) Cycle_3 EQU 0xFF ;Длительность зв. сигнала (500ms) Cycle_4 EQU 0x06 ;Время звучания (6s) ; ;******************** Описание портов ********************************** ; Ind_0 EQU 0x00 ;Вывод RA0, мл.разряд индикатора (1-вкл.), Out Ind_1 EQU 0x01 ;Вывод RA1, ст.разряд индикатора (1-вкл.) Out C1_Rel EQU 0x02 ;Вывод RA2, Зарядка\разрядка конденсатора (In/Out) TMR_On EQU 0x03 ;Вывод RA3, Пуск/Сброс таймера (0), In TMR_Run EQU 0x04 ;Вывод RA4, Выход зв. сигнала, Out Led_On EQU 0x07 ;Вывод RB7, Индикатор работы таймера (1), Out ; ;********************** Описание регистра Флагов ************************* ; Phase EQU 0x07 ;Режим работы: 0-таймер вкл., 1-установка ; ;************************** Переменные ************************************ ; Delay_Reg_1 EQU 0x0C ;Рабочие регистры подпрограмм Delay_Reg_2 EQU 0x0D ; задержки Flags EQU 0x0E ;Хранение регисра флагов W_copy EQU 0x0F ;Временное хранение w FSR_copy EQU 0x10 ;Временное хранение FSR STATUS_copy EQU 0x11 ;Временное хранение STATUS X_Count EQU 0x12 ;Cчетчик задержки X Y_Count EQU 0x13 ;Cчетчик задержки Y Z_Count EQU 0x14 ;Cчетчик задержки Z R_Bits EQU 0x15 ;Время (мин.), соотв. сопротивлению R1 N EQU 0x16 ;Рабочая ячейка подпр. One_Shot Digit_0 EQU 0x17 ;Мл.байт величины выдержки времени Digit_1 EQU 0x18 ;Ст.байт величины выдержки времени Int_Count_Low EQU 0x19 ;Мл.байт счетчика прерываний Int_Count_High EQU 0x1A ;Ст.байт счетчика прерываний Ind_Nom EQU 0x1B ;Хранение № индикатора Cell_1 EQU 0x1C ;Рабочие регистры подпрограммы Cell_2 EQU 0x1D ; генерации зв. сигнала Cell_3 EQU 0x1E Cell_4 EQU 0x1F ; ;***************** Основной код******************************* ; ORG 0 ;Программа начинается с метки 'Main' goto Main ORG 4 ;Вектор прерывания goto Int_Prog ; ;**************** Начальная инициализация ******************* ; Main clrf PORTA ;Очистить выходные защелки порта А clrf PORTB ; и порта В clrf TMR0 ;Очистить таймер bsf STATUS,RP0 ;Открыть доступ к банку 1 movlw M_O_INIT ;Загрузить исходные movwf OPTION_REG^80H ; данные в OPTION_REG movlw M_TA_INIT ;Настроить порт А movwf TRISA^80H ; movlw M_TB_INIT ;Настроить порт В movwf TRISB^80H ; bcf STATUS,RP0 ;Включить банк 0 movlw M_I_INIT ;Загрузить исходные movwf INTCON ; данные в INTCON movlw M_FLAG_INIT ;Загрузить исходные movwf Flags ; данные в ячейку Flags clrf R_Bits ;Очистить R_Bits Test bcf INTCON,7 ;Запрет прерываний movlw b'10000000' ;Вывод на LSB(HG1) индикатор цифры 8 movwf PORTB bsf PORTA,0 call Delay_1s ;Пауза 1сек bsf PORTA,1 ;Вывод на MSB индикатор(HG2) цифры 8 call Delay_1s ;Пауза 1сек clrf PORTA ;Порты в исходное состояние clrf PORTB clrf N ;Обнулить N bsf PORTA,TMR_Run First_Pass call One_Shot ;Пробное измерение, зарядка конденсатора call Delay_100ms ;Задержка 0,1сек ; ;****************** Установка времени выдержки таймера********************** ; Get_Time bsf Flags,Phase ;Признак режима установки bcf INTCON,7 ;Запрет прерываний call One_Shot ;Подсчет числа 'N' импульсов разрядки movlw 0x03 ;Запись ст. байта адреса таблицы movwf PCLATH ; преобразования в PCLATH movf N,w call Convert ;Таблица преобразования movwf R_Bits ;Хранение результата преобразования clrf PCLATH ;PCLATH в исходное состояние call Bin_to_BCD ;Перекодирование в BCD код bsf INTCON,7 ;Разрешить прерывания ; ;****************** Проверка состояния кнопки SB1 ************************** ; Check_SB1 btfsc PORTA,TMR_On ;Пока кнопка не нажата- goto Get_Time ; таймер в режиме установки call Delay_100ms bcf Flags,Phase ;Установить признак работы таймера на счет call Delay_1s ;Задержка, необходимая для отпускания SB1 ; ;******************** Таймер включен *************************************** ; Timer_On clrf Int_Count_Low ;Обнулить счетчики прерываний clrf Int_Count_High Time_Count bsf PORTA,TMR_Run ;Транзистор VT1 закрыт btfss PORTA,TMR_On ;Сброс таймера при повторном нажатии goto Reset_TMR ; на SB1 movfw Int_Count_High ;Сравнение счетчика прерываний с 15000 xorlw 0x3A ; (3A98hex),что соответствует 1мин. btfss STATUS,Z goto Time_Count movfw Int_Count_Low sublw 0x97 btfsc STATUS,C goto Time_Count ;Если 1мин не закончилась-продолжить счет decf R_Bits,f ;R_Bits=R_Bits-1. Если установленное btfsc STATUS,Z ; время закончилось (R_Bits=0), установить bsf Flags,Phase ; признак окончания работы таймера call Bin_to_BCD ;Преобразование R_Bits в BCD-код btfss Flags,Phase ;Если таймер в режиме счета- goto Timer_On ; идти на продолжение счета времени ; ;************************** Таймер остановлен **************************** ; Timer_Stop call Delay_1s call Beep bsf PORTA,TMR_Run ;Транзистор VT1 закрыт Reset_TMR call Delay_1s clrf R_Bits ;Обнулить счетчик времени clrf Int_Count_Low ; и прерываний clrf Int_Count_High bsf Flags,Phase ;Флаг режима установки=1 call Delay_100ms goto Get_Time ;Идти на установку ; ;******** Подпрограмма преобразования двоичного кода в BCD-код ********* ; Двоичный код в регистре R_Bits, после преобразования в Digit_0 ; - единицы, в Digit_1 - десятки. Bin_to_BCD clrf Digit_1 movfw R_Bits movwf Digit_0 G_Tens movlw d'10' subwf Digit_0,w btfss STATUS,C goto Over movwf Digit_0 incf Digit_1,f goto G_Tens Over movf Digit_1,w ;Гашение незначащих нулей andlw b'00001111' btfss STATUS,Z goto Finish movlw b'00010000' ;d'16'-указатель на 16 строку movwf Digit_1 ; таблицы (пустое место) Finish return ; ;****** Подпрограмма преобразования для 7-ми сегментного индикатора ******** ; "0" - соответствует горящему сегменту, т. к. индикатор с общим анодом Table addwf PCL,f retlw b'11000000' ;Цифра "0" retlw b'11111001' ;Цифра "1" retlw b'10100100' ;Цифра "2" retlw b'10110000' ;Цифра "3" retlw b'10011001' ;Цифра "4" retlw b'10010010' ;Цифра "5" retlw b'10000010' ;Цифра "6" retlw b'11111000' ;Цифра "7" retlw b'10000000' ;Цифра "8" retlw b'10010000' ;Цифра "9" retlw b'10001000' ;Цифра "А" retlw b'10000011' ;Цифра "B" retlw b'11000110' ;Цифра "C" retlw b'10100001' ;Цифра "D" retlw b'10000110' ;Цифра "E" retlw b'10001110' ;Цифра "F" retlw b'11111111' ;Пустое место (код 10h) ; ;********************* Обработка прерывания от TMR0 *********************** ; Int_Prog movwf W_copy ;Сохранение регистров movf STATUS,w movwf STATUS_copy movf FSR,w movwf FSR_copy bcf INTCON,T0IF ;Сбросить флаг прерывания movlw 0x06 ; Настраиваем таймер movwf TMR0 btfsc Flags,Phase ;Проверка текущего режима: goto Clear ;Если установка-обнулить счетчики movfw Int_Count_Low ; Прибавляем LSB счетчик прерываний xorlw H'FF' ;Если переполнен-перенос в ст. разряд BZ Add_H ; incf Int_Count_Low,f goto Indicate ;Индикация Add_H incf Int_Count_High,f ;Прибавляем MSB счетчик прерываний clrf Int_Count_Low movfw Int_Count_High xorlw H'FF' ;Если переполнен-обнулить счетчики BZ Clear goto Indicate ;Индикация Clear clrf Int_Count_Low clrf Int_Count_High Indicate bcf PORTA,Ind_0 ;Гашение индикаторов bcf PORTA,Ind_1 incf Ind_Nom,f ;Выбор индикатора (чет\нечет) btfss Ind_Nom,0 ; если чет-индикация мл.байта goto LSB_Ind ; если нечет-старшего goto MSB_Ind MSB_Ind movf Digit_1,w ;Загрузить MSB в w call Table ;Преобразование в 7-сегм. код andwf Flags,w ;Установить бит 7 порта В movwf PORTB ; и вывод bsf PORTA,Ind_1 ;Включить индикатор goto End_Int LSB_Ind movf Digit_0,w ;Загрузить MSB в w call Table ;Преобразование в 7-сегм. код andwf Flags,w ;Установить бит 7 порта В movwf PORTB ; и вывод bsf PORTA,Ind_0 ;Включить индикатор End_Int movf FSR_copy,w ;Восстановление регистров movwf FSR movf STATUS_copy,w movwf STATUS swapf W_copy,f swapf W_copy,w retfie ; ;****************** Подпрограмма "One Shot" ******************************** ; One_Shot clrf N bsf STATUS,RP0 bsf TRISA,2 bcf STATUS,RP0 Tst btfss PORTA,C1_Rel goto Ready incfsz N,f goto Tst Ready decf N,f movf N,w xorlw 0xFF btfsc STATUS,Z clrf N bsf STATUS,RP0 bcf TRISA,2 bcf STATUS,RP0 bsf PORTA,C1_Rel return ; ;************************** Подпрограмма задержки на 1s ***************** ; Delay_1s movlw Z_Pause movwf Z_Count Z_Loop movlw Y_Pause movwf Y_Count Y_Loop movlw X_Pause movwf X_Count X_Loop decfsz X_Count,f goto X_Loop decfsz Y_Count,f goto Y_Loop decfsz Z_Count,f goto Z_Loop return ; ;**************Подпрограмма задержки на 100 мс*************************** ; Delay_100ms movlw Del_Range movwf Delay_Reg_1 movlw h'FF' movwf Delay_Reg_2 Loop decfsz Delay_Reg_2,f goto Loop decfsz Delay_Reg_1,f goto Loop return ; ;********* Подпрограмма подачи звукового сигнала на RA4 ****************** ; Beep bcf INTCON,7 movlw Cycle_4 movwf Cell_4 Beep_500 movlw Cycle_3 movwf Cell_3 Double movlw Cycle_2 movwf Cell_2 H_Level bsf PORTA,4 movlw Cycle_1 movwf Cell_1 Ring_1 decfsz Cell_1,f goto Ring_1 L_Level bcf PORTA,4 movlw Cycle_1 movwf Cell_1 Ring_2 decfsz Cell_1,f goto Ring_2 decfsz Cell_2,f goto H_Level decfsz Cell_3,f goto Double goto Del_500 Del_500 movlw Cycle_3 movwf Cell_3 Doub movlw Cycle_2 movwf Cell_2 H_Lev bcf PORTA,4 movlw Cycle_1 movwf Cell_1 Rin_1 decfsz Cell_1,f goto Rin_1 L_Lev bcf PORTA,4 movlw Cycle_1 movwf Cell_1 Rin_2 decfsz Cell_1,f goto Rin_2 decfsz Cell_2,f goto H_Lev decfsz Cell_3,f goto Doub decfsz Cell_4,f goto Beep_500 bsf INTCON,7 return ; ;**** Подпрограмма табличной конвертации значения N ********* ; в длительность выдержки времени (мин.) ORG 0x300 Convert addwf PCL,f retlw .1 retlw .1 retlw .2 retlw .2 retlw .3 retlw .3 retlw .4 retlw .4 retlw .5 retlw .5 retlw .6 retlw .6 retlw .7 retlw .7 retlw .8 retlw .8 retlw .9 retlw .9 retlw .10 retlw .10 retlw .11 retlw .11 retlw .12 retlw .12 retlw .13 retlw .13 retlw .14 retlw .14 retlw .15 retlw .15 retlw .16 retlw .16 retlw .17 retlw .17 retlw .18 retlw .18 retlw .19 retlw .19 retlw .20 retlw .20 retlw .21 retlw .21 retlw .22 retlw .22 retlw .23 retlw .23 retlw .24 retlw .24 retlw .25 retlw .25 retlw .26 retlw .26 retlw .27 retlw .27 retlw .28 retlw .28 retlw .29 retlw .29 retlw .30 retlw .30 retlw .31 retlw .31 retlw .32 retlw .32 retlw .33 retlw .33 retlw .34 retlw .34 retlw .35 retlw .35 retlw .36 retlw .36 retlw .37 retlw .37 retlw .38 retlw .38 retlw .39 retlw .39 retlw .40 retlw .40 retlw .41 retlw .41 retlw .42 retlw .42 retlw .43 retlw .43 retlw .44 retlw .44 retlw .45 retlw .45 retlw .46 retlw .46 retlw .47 retlw .47 retlw .48 retlw .48 retlw .49 retlw .49 retlw .50 retlw .50 retlw .51 retlw .51 retlw .52 retlw .52 retlw .53 retlw .53 retlw .54 retlw .54 retlw .55 retlw .55 retlw .56 retlw .56 retlw .57 retlw .57 retlw .58 retlw .58 retlw .59 retlw .59 retlw .60 retlw .60 retlw .61 retlw .61 retlw .62 retlw .62 retlw .63 retlw .63 retlw .64 retlw .64 retlw .65 retlw .65 retlw .66 retlw .66 retlw .67 retlw .67 retlw .68 retlw .68 retlw .69 retlw .69 retlw .70 retlw .70 retlw .71 retlw .71 retlw .72 retlw .72 retlw .73 retlw .73 retlw .74 retlw .74 retlw .75 retlw .75 retlw .76 retlw .76 retlw .77 retlw .77 retlw .78 retlw .78 retlw .79 retlw .79 retlw .80 retlw .80 retlw .81 retlw .81 retlw .82 retlw .82 retlw .83 retlw .83 retlw .84 retlw .84 retlw .85 retlw .85 retlw .86 retlw .86 retlw .87 retlw .87 retlw .88 retlw .88 retlw .89 retlw .89 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 retlw .90 END ;Конец |
|
| Автор: | uldemir [ Пт апр 23, 2010 09:11:06 ] |
| Заголовок сообщения: | Re: Помагите чайнику с таймером на PIC16F84a |
Цитата: Прошу вашей помощи. А в чем должна выражаться помощь? Ну ладно, помогу. Слово "Помагите" правильно пишется "помогите". Если хотите получить от прерывания 250 мкс интервалы, то в прерывании лучше не присваивать значение 6 TMR0, а прибавлять (во-первых вы не можете гарантировать, что в прерывание вошли именно на переходе FF->00, а не позже, во-вторых, к моменту присвоения в прерывании уже выполнено по меньшей мере 8 команд). Кстати, прибавлять надо не 6. |
|
| Автор: | VAZZIK [ Пт апр 23, 2010 14:08:34 ] |
| Заголовок сообщения: | Re: Помогите чайнику с таймером на PIC16F84a |
Я в МК не юзер, я чайник. Если можно то поконкретнее. Мне он очень нужен |
|
| Автор: | uldemir [ Пт апр 23, 2010 15:16:42 ] |
| Заголовок сообщения: | Re: Помогите чайнику с таймером на PIC16F84a |
Я (и большинство других, наверняка) не телепат. Если можно, поконкретнее. У вас есть исходник, разберитесь в нем, и измените как вам надо. В чем проблема то? |
|
| Автор: | uldemir [ Пт апр 23, 2010 18:48:24 ] |
| Заголовок сообщения: | Re: Помогите чайнику с таймером на PIC16F84a |
Хоть бы схему привёл или исходник откуда содрана. Автор может увидит тут исходник без ссылки на него - обидится. Вообще мне видится два варианта изменения. Первый забить таблицу Convert числами от 1 до 12 (равномерно) и в Timer_On и в Int_prog сделать измерение интервала в один час. Тогда можно выставить число от 1 до 12 и получить желаемое. |
|
| Автор: | uldemir [ Пт апр 23, 2010 19:11:07 ] |
| Заголовок сообщения: | Re: Помогите чайнику с таймером на PIC16F84a |
Ладно, если уж начал вникать - вот лекарство. В процедуре Int_prog удлинил минуту в 60 раз. Насчет точности этой минуты меня гложут сомнения, но пусть это останентся на совести автора. Я ведь даже не знаю какой частоты кварц применен. Таблицу Convert можно не перебивать - будет крутой таймер с выдержкой от 1 до 90 часов. Код: btfsc Flags,Phase ;Проверка текущего режима: goto Clear ;Если установка-обнулить счетчики incf int_count_pre movlw 60 subwf int_count_pre, w btfss status, c goto Indicate movlw 60 movwf int_cout_pre movfw Int_Count_Low ; Прибавляем LSB счетчик прерываний xorlw H'FF' ;Если переполнен-перенос в ст. разряд BZ Add_H ; incf Int_Count_Low,f goto Indicate ;Индикация Add_H incf Int_Count_High,f ;Прибавляем MSB счетчик прерываний clrf Int_Count_Low movfw Int_Count_High xorlw H'FF' ;Если переполнен-обнулить счетчики BZ Clear goto Indicate ;Индикация Clear clrf int_count_pre clrf Int_Count_Low clrf Int_Count_High Незабудь в переменных дать адрес ячейки для переменной int_count_pre |
|
| Автор: | dosikus [ Пт апр 23, 2010 19:28:53 ] |
| Заголовок сообщения: | Re: Помогите чайнику с таймером на PIC16F84a |
Вызов подпрограммы , да еще табличной конвертации, в прерывании . .. Что то отвернуло даже анализировать далее сей "шедевр". |
|
| Автор: | uldemir [ Пт апр 23, 2010 20:07:49 ] |
| Заголовок сообщения: | Re: Помогите чайнику с таймером на PIC16F84a |
dosikus писал(а): Вызов подпрограммы , да еще табличной конвертации, в прерывании . .. А почему нет? Я, лично, так тоже делаю. Мне не жаль подарить один уровень стека из 8. И, кстати, человек делает динамическую индикацию в прерывании, а не так другие писатели шедевров с задержками в основном теле программы. Зато, он не вызывает эту конвертацию из других мест. Шедевр, если вникнуться, написан неплохо. Хотя и есть спорные моменты. Как я уже сразу написал, не нравится присвоение в прерывании от TMR0. Это место, где постоянно будет накапливаться ошибка. Но каждый пишет по-своему. Я так не пишу. Но это не значит, что другие не имеют права так писать.
Что то отвернуло даже анализировать далее сей "шедевр". |
|
| Автор: | dosikus [ Пт апр 23, 2010 22:18:49 ] |
| Заголовок сообщения: | Re: Помогите чайнику с таймером на PIC16F84a |
uldemir писал(а): И, кстати, человек делает динамическую индикацию в прерывании, а не так другие писатели шедевров с задержками в основном теле программы. А конвертировать нужно обязательно в прерывании ???? В прерывании нужен счетчик( секунд,минут , часов и т.д. ) , обработчик кнопок , вывод из буфера на индикацию со сканером разрядов. И все . И никаких пп. там на.. не нужно. Задержки вообще зло- тратить процессорное время впустую ... |
|
| Автор: | uldemir [ Пт апр 23, 2010 22:49:23 ] |
| Заголовок сообщения: | Re: Помогите чайнику с таймером на PIC16F84a |
dosikus писал(а): вывод из буфера на индикацию со сканером разрядов. Ну вот это там и делается. и ничего больше. Или предлагаешь в буфере держать полный имидж? Я дак еще в буфере бывает храню аттрибут что этот разряд должен моргать, и в этом же прерывании это моргание и обсчитывается. Так что этот приём считаю рациональным. |
|
| Автор: | dosikus [ Пт апр 23, 2010 22:59:44 ] |
| Заголовок сообщения: | Re: Помогите чайнику с таймером на PIC16F84a |
В основном цикле заполнять буфер уже сконвертированными данными . Буфер 2 байта . Bin2BCD конвертите же в главном цикле , почему в 7 сегментный код надо в прерывании ????????? Скажу по секрету эта ваша любимая BIN2BCD здесь вообще на.. не нужна . Под мигание и еще под кучку флагов можно и отдельные переменные завести . А вообще не плохо было бы перелопатить все это на посегментную индикацию , жрать будет меньше и не надо ключей. |
|
| Автор: | uldemir [ Сб апр 24, 2010 09:24:05 ] |
| Заголовок сообщения: | Re: Помогите чайнику с таймером на PIC16F84a |
Мы увидим новую прошивку? |
|
| Автор: | dosikus [ Сб апр 24, 2010 10:07:53 ] |
| Заголовок сообщения: | Re: Помогите чайнику с таймером на PIC16F84a |
uldemir писал(а): Мы увидим новую прошивку? На 84 ?! . Оно вам надо ? Редкий , дорогой чип . |
|
| Автор: | uldemir [ Сб апр 24, 2010 10:48:48 ] |
| Заголовок сообщения: | Re: Помогите чайнику с таймером на PIC16F84a |
dosikus писал(а): На 84 ?! . Оно вам надо ? Редкий , дорогой чип . Да нет, нафик не сдалось. Просто размышляю, почему автор так безобразно время меряет. В минуте автор отсчитывает 15000 прерываний. Значит прерывание предполагается раз в 4 миллисекунды. По регистру option указано, что коэффициент предделителя 16. получается что за 4000 микросекунд должно пройти 4000+8+3 импульсов. Короч, точность не ахти какая. Ошибка около 0,3% или я чегой-то не понимаю. Или там кварц на 4011 кГц (где такой взять?). Хотя для таймера на полтора часа такая ошибка была приемлима и что-либо особенное городить не было смысла. |
|
| Автор: | AndyWorld [ Сб апр 24, 2010 11:18:20 ] |
| Заголовок сообщения: | Re: Помогите чайнику с таймером на PIC16F84a |
Судя по описанию это Кухонный таймер из Журнала Радио. Номер, на вскидку, не скажу. Я такой собрал, полезная штука. Там переменником регулируется время от 0 до 90 мин. У меня не было нужного сопрота, я поставил другой и максимальное время у меня 70 мин. Если мне надо 1ч40 мин. я его включаю дважды. Вроде полезная штука. Особенно когда фоторезист засветить или мясо пожарить.)))) Кварц 4 Мгц. |
|
| Автор: | VAZZIK [ Вс апр 25, 2010 14:27:08 ] |
| Заголовок сообщения: | Re: Помогите чайнику с таймером на PIC16F84a |
Да, это действительно кухонный таймер. Вот что у меня получилось благодаря вашей помощи __CONFIG _CP_OFF &_WDT_OFF &_PWRTE_ON &_XT_OSC ; ;********************** Константы******************************* ; M_O_INIT EQU 0xC3 ;b'11000011',Загрузка OPTION. Коэфф. дел.=16 M_TA_INIT EQU 0x08 ;b'00001000',Управление портом А-TRISA M_TB_INIT EQU 0x00 ;b'00000000',Управление портом В-TRISB M_I_INIT EQU 0xA0 ;b'10100000',Загрузка INTCON M_FLAG_INIT EQU 0xFF ;b'11111111',Загрузка регистра флагов X_Pause EQU 0xFE ;Данные для счетчика X Y_Pause EQU 0xFE ;Данные для счетчика Y Z_Pause EQU 0x05 ;Данные для счетчика Z Del_Range EQU 0x82 ;Константа задержки Cycle_1 EQU 0xA0 ;Частота зв. сигнала (1024 Гц) Cycle_2 EQU 0x02 ;Скважность имп. зв. сигнала (2) Cycle_3 EQU 0xFF ;Длительность зв. сигнала (500ms) Cycle_4 EQU 0x06 ;Время звучания (6s) ; ;******************** Описание портов ********************************** ; Ind_0 EQU 0x00 ;Вывод RA0, мл.разряд индикатора (1-вкл.), Out Ind_1 EQU 0x01 ;Вывод RA1, ст.разряд индикатора (1-вкл.) Out C1_Rel EQU 0x02 ;Вывод RA2, Зарядка\разрядка конденсатора (In/Out) TMR_On EQU 0x03 ;Вывод RA3, Пуск/Сброс таймера (0), In TMR_Run EQU 0x04 ;Вывод RA4, Выход зв. сигнала, Out Led_On EQU 0x07 ;Вывод RB7, Индикатор работы таймера (1), Out ; ;********************** Описание регистра Флагов ************************* ; Phase EQU 0x07 ;Режим работы: 0-таймер вкл., 1-установка ; ;************************** Переменные ************************************ ; Delay_Reg_1 EQU 0x0C ;Рабочие регистры подпрограмм Delay_Reg_2 EQU 0x0D ; задержки Flags EQU 0x0E ;Хранение регисра флагов W_copy EQU 0x0F ;Временное хранение w FSR_copy EQU 0x10 ;Временное хранение FSR STATUS_copy EQU 0x11 ;Временное хранение STATUS X_Count EQU 0x12 ;Cчетчик задержки X Y_Count EQU 0x13 ;Cчетчик задержки Y Z_Count EQU 0x14 ;Cчетчик задержки Z R_Bits EQU 0x15 ;Время (мин.), соотв. сопротивлению R1 N EQU 0x16 ;Рабочая ячейка подпр. One_Shot Digit_0 EQU 0x17 ;Мл.байт величины выдержки времени Digit_1 EQU 0x18 ;Ст.байт величины выдержки времени Int_Count_Low EQU 0x19 ;Мл.байт счетчика прерываний Int_Count_High EQU 0x1A ;Ст.байт счетчика прерываний Ind_Nom EQU 0x1B ;Хранение № индикатора Cell_1 EQU 0x1C ;Рабочие регистры подпрограммы Cell_2 EQU 0x1D ; генерации зв. сигнала Cell_3 EQU 0x1E Cell_4 EQU 0x1F int_count_pre EQU ???????????? ; ;***************** Основной код******************************* ; ORG 0 ;Программа начинается с метки 'Main' goto Main ORG 4 ;Вектор прерывания goto Int_Prog ; ;**************** Начальная инициализация ******************* ; Main clrf PORTA ;Очистить выходные защелки порта А clrf PORTB ; и порта В clrf TMR0 ;Очистить таймер bsf STATUS,RP0 ;Открыть доступ к банку 1 movlw M_O_INIT ;Загрузить исходные movwf OPTION_REG^80H ; данные в OPTION_REG movlw M_TA_INIT ;Настроить порт А movwf TRISA^80H ; movlw M_TB_INIT ;Настроить порт В movwf TRISB^80H ; bcf STATUS,RP0 ;Включить банк 0 movlw M_I_INIT ;Загрузить исходные movwf INTCON ; данные в INTCON movlw M_FLAG_INIT ;Загрузить исходные movwf Flags ; данные в ячейку Flags clrf R_Bits ;Очистить R_Bits Test bcf INTCON,7 ;Запрет прерываний movlw b'10000000' ;Вывод на LSB(HG1) индикатор цифры 8 movwf PORTB bsf PORTA,0 call Delay_1s ;Пауза 1сек bsf PORTA,1 ;Вывод на MSB индикатор(HG2) цифры 8 call Delay_1s ;Пауза 1сек clrf PORTA ;Порты в исходное состояние clrf PORTB clrf N ;Обнулить N bsf PORTA,TMR_Run First_Pass call One_Shot ;Пробное измерение, зарядка конденсатора call Delay_100ms ;Задержка 0,1сек ; ;****************** Установка времени выдержки таймера********************** ; Get_Time bsf Flags,Phase ;Признак режима установки bcf INTCON,7 ;Запрет прерываний call One_Shot ;Подсчет числа 'N' импульсов разрядки movlw 0x03 ;Запись ст. байта адреса таблицы movwf PCLATH ; преобразования в PCLATH movf N,w call Convert ;Таблица преобразования movwf R_Bits ;Хранение результата преобразования clrf PCLATH ;PCLATH в исходное состояние call Bin_to_BCD ;Перекодирование в BCD код bsf INTCON,7 ;Разрешить прерывания ; ;****************** Проверка состояния кнопки SB1 ************************** ; Check_SB1 btfsc PORTA,TMR_On ;Пока кнопка не нажата- goto Get_Time ; таймер в режиме установки call Delay_100ms bcf Flags,Phase ;Установить признак работы таймера на счет call Delay_1s ;Задержка, необходимая для отпускания SB1 ; ;******************** Таймер включен *************************************** ; Timer_On clrf Int_Count_Low ;Обнулить счетчики прерываний clrf Int_Count_High Time_Count bsf PORTA,TMR_Run ;Транзистор VT1 закрыт btfss PORTA,TMR_On ;Сброс таймера при повторном нажатии goto Reset_TMR ; на SB1 movfw Int_Count_High ;Сравнение счетчика прерываний с 15000 xorlw 0x3A ; (3A98hex),что соответствует 1мин. btfss STATUS,Z goto Time_Count movfw Int_Count_Low sublw 0x97 btfsc STATUS,C goto Time_Count ;Если 1мин не закончилась-продолжить счет decf R_Bits,f ;R_Bits=R_Bits-1. Если установленное btfsc STATUS,Z ; время закончилось (R_Bits=0), установить bsf Flags,Phase ; признак окончания работы таймера call Bin_to_BCD ;Преобразование R_Bits в BCD-код btfss Flags,Phase ;Если таймер в режиме счета- goto Timer_On ; идти на продолжение счета времени ; ;************************** Таймер остановлен **************************** ; Timer_Stop call Delay_1s call Beep bsf PORTA,TMR_Run ;Транзистор VT1 закрыт Reset_TMR call Delay_1s clrf R_Bits ;Обнулить счетчик времени clrf Int_Count_Low ; и прерываний clrf Int_Count_High bsf Flags,Phase ;Флаг режима установки=1 call Delay_100ms goto Get_Time ;Идти на установку ; ;******** Подпрограмма преобразования двоичного кода в BCD-код ********* ; Двоичный код в регистре R_Bits, после преобразования в Digit_0 ; - единицы, в Digit_1 - десятки. Bin_to_BCD clrf Digit_1 movfw R_Bits movwf Digit_0 G_Tens movlw d'10' subwf Digit_0,w btfss STATUS,C goto Over movwf Digit_0 incf Digit_1,f goto G_Tens Over movf Digit_1,w ;Гашение незначащих нулей andlw b'00001111' btfss STATUS,Z goto Finish movlw b'00010000' ;d'16'-указатель на 16 строку movwf Digit_1 ; таблицы (пустое место) Finish return ; ;****** Подпрограмма преобразования для 7-ми сегментного индикатора ******** ; "0" - соответствует горящему сегменту, т. к. индикатор с общим анодом Table addwf PCL,f retlw b'11000000' ;Цифра "0" retlw b'11111001' ;Цифра "1" retlw b'10100100' ;Цифра "2" retlw b'10110000' ;Цифра "3" retlw b'10011001' ;Цифра "4" retlw b'10010010' ;Цифра "5" retlw b'10000010' ;Цифра "6" retlw b'11111000' ;Цифра "7" retlw b'10000000' ;Цифра "8" retlw b'10010000' ;Цифра "9" retlw b'10001000' ;Цифра "А" retlw b'10000011' ;Цифра "B" retlw b'11000110' ;Цифра "C" retlw b'10100001' ;Цифра "D" retlw b'10000110' ;Цифра "E" retlw b'10001110' ;Цифра "F" retlw b'11111111' ;Пустое место (код 10h) ; ;********************* Обработка прерывания от TMR0 *********************** ; Int_Prog movwf W_copy ;Сохранение регистров movf STATUS,w movwf STATUS_copy movf FSR,w movwf FSR_copy bcf INTCON,T0IF ;Сбросить флаг прерывания movlw 0x06 ; Настраиваем таймер movwf TMR0 btfsc Flags,Phase ;Проверка текущего режима: goto Clear ;Если установка-обнулить счетчики incf int_count_pre movlw 60 subwf int_count_pre, w btfss status, c goto Indicate movlw 60 movwf int_cout_pre movfw Int_Count_Low ; Прибавляем LSB счетчик прерываний xorlw H'FF' ;Если переполнен-перенос в ст. разряд BZ Add_H ; incf Int_Count_Low,f goto Indicate ;Индикация Add_H incf Int_Count_High,f ;Прибавляем MSB счетчик прерываний clrf Int_Count_Low movfw Int_Count_High xorlw H'FF' ;Если переполнен-обнулить счетчики BZ Clear goto Indicate ;Индикация Clear clrf Int_Count_Low clrf Int_Count_High Indicate bcf PORTA,Ind_0 ;Гашение индикаторов bcf PORTA,Ind_1 incf Ind_Nom,f ;Выбор индикатора (чет\нечет) btfss Ind_Nom,0 ; если чет-индикация мл.байта goto LSB_Ind ; если нечет-старшего goto MSB_Ind MSB_Ind movf Digit_1,w ;Загрузить MSB в w call Table ;Преобразование в 7-сегм. код andwf Flags,w ;Установить бит 7 порта В movwf PORTB ; и вывод bsf PORTA,Ind_1 ;Включить индикатор goto End_Int LSB_Ind movf Digit_0,w ;Загрузить MSB в w call Table ;Преобразование в 7-сегм. код andwf Flags,w ;Установить бит 7 порта В movwf PORTB ; и вывод bsf PORTA,Ind_0 ;Включить индикатор End_Int movf FSR_copy,w ;Восстановление регистров movwf FSR movf STATUS_copy,w movwf STATUS swapf W_copy,f swapf W_copy,w retfie ; ;****************** Подпрограмма "One Shot" ******************************** ; One_Shot clrf N bsf STATUS,RP0 bsf TRISA,2 bcf STATUS,RP0 Tst btfss PORTA,C1_Rel goto Ready incfsz N,f goto Tst Ready decf N,f movf N,w xorlw 0xFF btfsc STATUS,Z clrf N bsf STATUS,RP0 bcf TRISA,2 bcf STATUS,RP0 bsf PORTA,C1_Rel return ; ;************************** Подпрограмма задержки на 1s ***************** ; Delay_1s movlw Z_Pause movwf Z_Count Z_Loop movlw Y_Pause movwf Y_Count Y_Loop movlw X_Pause movwf X_Count X_Loop decfsz X_Count,f goto X_Loop decfsz Y_Count,f goto Y_Loop decfsz Z_Count,f goto Z_Loop return ; ;**************Подпрограмма задержки на 100 мс*************************** ; Delay_100ms movlw Del_Range movwf Delay_Reg_1 movlw h'FF' movwf Delay_Reg_2 Loop decfsz Delay_Reg_2,f goto Loop decfsz Delay_Reg_1,f goto Loop return ; ;********* Подпрограмма подачи звукового сигнала на RA4 ****************** ; Beep bcf INTCON,7 movlw Cycle_4 movwf Cell_4 Beep_500 movlw Cycle_3 movwf Cell_3 Double movlw Cycle_2 movwf Cell_2 H_Level bsf PORTA,4 movlw Cycle_1 movwf Cell_1 Ring_1 decfsz Cell_1,f goto Ring_1 L_Level bcf PORTA,4 movlw Cycle_1 movwf Cell_1 Ring_2 decfsz Cell_1,f goto Ring_2 decfsz Cell_2,f goto H_Level decfsz Cell_3,f goto Double goto Del_500 Del_500 movlw Cycle_3 movwf Cell_3 Doub movlw Cycle_2 movwf Cell_2 H_Lev bcf PORTA,4 movlw Cycle_1 movwf Cell_1 Rin_1 decfsz Cell_1,f goto Rin_1 L_Lev bcf PORTA,4 movlw Cycle_1 movwf Cell_1 Rin_2 decfsz Cell_1,f goto Rin_2 decfsz Cell_2,f goto H_Lev decfsz Cell_3,f goto Doub decfsz Cell_4,f goto Beep_500 bsf INTCON,7 return ; ;**** Подпрограмма табличной конвертации значения N ********* ; в длительность выдержки времени (мин.) ORG 0x300 Convert addwf PCL,f retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .1 retlw .2 retlw .2 retlw .2 retlw .2 retlw .2 retlw .2 retlw .2 retlw .2 retlw .2 retlw .2 retlw .2 retlw .2 retlw .2 retlw .2 retlw .2 retlw .2 retlw .2 retlw .2 retlw .2 retlw .2 retlw .3 retlw .3 retlw .3 retlw .3 retlw .3 retlw .3 retlw .3 retlw .3 retlw .3 retlw .3 retlw .3 retlw .3 retlw .3 retlw .3 retlw .3 retlw .3 retlw .3 retlw .3 retlw .3 retlw .3 retlw .4 retlw .4 retlw .4 retlw .4 retlw .4 retlw .4 retlw .4 retlw .4 retlw .4 retlw .4 retlw .4 retlw .4 retlw .4 retlw .4 retlw .4 retlw .4 retlw .4 retlw .4 retlw .4 retlw .4 retlw .5 retlw .5 retlw .5 retlw .5 retlw .5 retlw .5 retlw .5 retlw .5 retlw .5 retlw .5 retlw .5 retlw .5 retlw .5 retlw .5 retlw .5 retlw .5 retlw .5 retlw .5 retlw .5 retlw .5 retlw .6 retlw .6 retlw .6 retlw .6 retlw .6 retlw .6 retlw .6 retlw .6 retlw .6 retlw .6 retlw .6 retlw .6 retlw .6 retlw .6 retlw .6 retlw .6 retlw .6 retlw .6 retlw .6 retlw .6 retlw .7 retlw .7 retlw .7 retlw .7 retlw .7 retlw .7 retlw .7 retlw .7 retlw .7 retlw .7 retlw .7 retlw .7 retlw .7 retlw .7 retlw .7 retlw .7 retlw .7 retlw .7 retlw .7 retlw .7 retlw .8 retlw .8 retlw .8 retlw .8 retlw .8 retlw .8 retlw .8 retlw .8 retlw .8 retlw .8 retlw .8 retlw .8 retlw .8 retlw .8 retlw .8 retlw .8 retlw .8 retlw .8 retlw .8 retlw .8 retlw .9 retlw .9 retlw .9 retlw .9 retlw .9 retlw .9 retlw .9 retlw .9 retlw .9 retlw .9 retlw .9 retlw .9 retlw .9 retlw .9 retlw .9 retlw .9 retlw .9 retlw .9 retlw .9 retlw .9 retlw .9 retlw .10 retlw .10 retlw .10 retlw .10 retlw .10 retlw .10 retlw .10 retlw .10 retlw .10 retlw .10 retlw .10 retlw .10 retlw .10 retlw .10 retlw .10 retlw .10 retlw .10 retlw .10 retlw .10 retlw .11 retlw .11 retlw .11 retlw .11 retlw .11 retlw .11 retlw .11 retlw .11 retlw .11 retlw .11 retlw .11 retlw .11 retlw .11 retlw .11 retlw .11 retlw .11 retlw .11 retlw .11 retlw .11 retlw .11 retlw .12 retlw .12 retlw .12 retlw .12 retlw .12 retlw .12 retlw .12 retlw .12 retlw .12 retlw .12 retlw .12 retlw .12 retlw .12 retlw .12 retlw .12 retlw .12 retlw .12 END ;Конец А вот какой дать адрес ячейки для переменной int_count_pre? |
|
| Автор: | uldemir [ Вс апр 25, 2010 15:06:09 ] |
| Заголовок сообщения: | Re: Помогите чайнику с таймером на PIC16F84a |
Rrrrrrrrr. Не надо постить такие огромные листинги. тем более 3 раза, тем более в таком нечитабельном виде. кстати, я там бред написал. Начал писать инкрементирующий счетчик и закончил мыслью декрементирующего счетчика. в конце надо присваивать не 60, а ноль. Код: incf int_count_pre movlw 60 subwf int_count_pre, w btfss status, c goto Indicate clrf int_cout_pre А адрес любой свободный в нулевой странице. Наприме следующий свободный 0x20. |
|
| Автор: | Аlex [ Вс апр 25, 2010 16:16:25 ] |
| Заголовок сообщения: | Re: Помогите чайнику с таймером на PIC16F84a |
Вы хоть бы схему показали. Быстрее Вам написАть новую прогамму, чем помочь в этой разобраться. За "бутылку пива" напишу. |
|
| Автор: | uldemir [ Вс апр 25, 2010 16:54:34 ] |
| Заголовок сообщения: | Re: Помогите чайнику с таймером на PIC16F84a |
Вроде нашел. Радио 7/2006. http://www.radio.ru/archive/2006/07/a15.shtml |
|
| Автор: | Аlex [ Вс апр 25, 2010 18:34:08 ] |
| Заголовок сообщения: | Re: Помогите чайнику с таймером на PIC16F84a |
Схемы нет |
|
| Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


