 |
Форум за електроника Български форум за електроника, ремонти, схеми, документация
|
| Предишната тема :: Следващата тема |
| Автор |
Съобщение |
Maverikkk Нов потребител

Регистриран на: 18 Апр 2011 Мнения: 4 Местожителство: sof
|
Пуснато на: Нед Май 01, 2011 12:54 Заглавие: Реле с времезакъснение с PIC16F84A |
|
|
Здравейте, начинаещ съм за това ще помоля за помощ.
Задание: на база PIC16F84A искам да изградя реле с времезакъснение, тоест на даден извод от PIC-a да имам високо ниво за 5 мин. след което 5 часа да е в покой и отново 5 мин. високо ниво и 5 часа с покой. Ще съм благодарен на всеки който ми помогне с писането на програмата. Пращам бира с куриер  |
|
| Върнете се в началото |
|
 |
Ichko Опитен потребител

Регистриран на: 13 Мар 2004 Мнения: 308
|
Пуснато на: Нед Май 01, 2011 13:50 Заглавие: |
|
|
За реализиране на заданието може да се използва по-прост (и евтин) микроконтролер, напр. от серията 12C или 12F. За 16F84A виж в книгата "PIC микроконтролери" - част I. Ако все пак има сериозни затруднения мога да помогна, стига да не се отметнеш за бирата  _________________ Интелектът на Земята е константа, а населението непрекъснато расте! |
|
| Върнете се в началото |
|
 |
Maverikkk Нов потребител

Регистриран на: 18 Апр 2011 Мнения: 4 Местожителство: sof
|
Пуснато на: Нед Май 01, 2011 14:23 Заглавие: |
|
|
Здрасти, имам я книгата, но докато прочета обстойно нещата ще ми изсъхне тревата на вилата.
list p=16f84a ;Задава типа на процесора
#include <p16f84a.inc> ;Дефиниции на SFR регистрите
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;************** Дефиниране на контрасти и променливи *************
w EQU 0
f EQU 1
Counter EQU H'0C'
;*****************************************************************
; Потребителска програма
;*****************************************************************
ORG H'0000' ; Вектор на НУ
goto start ; Преход към началото на програмата
;*****************************************************************
; Начало на програмата
;*****************************************************************
start bsf STATUS, RP0 ; Избор на Банка 1
movlw B'11010111' ; 11010111b ->W
movwf OPTION_REG ; (W) -> OPTION_REG
bcf STATUS,RP0 ; Избор на Банка 0
clrf PORTB ; 00h -> PORTB
bsf STATUS,RP0 ; Избор на Банка 1
movlw B'11111110' ; 11111110b -> W
movwf TRISB ; RB7-RB1 - Входове, RB0-Изход
bcf STATUS,RP0 ; Избор на Банка 0
goto main
;******************************************************************
; Използвани подпрограми
;******************************************************************
;------ Подпрограма 'Wait', формираща времезадръжката от 460ms-----
wait movlw D'255' ; 7 -> W
movwf Counter ; (W) -> Counter
clrf TMR0 ; 00h -> TMR0
again bcf INTCON,T0IF ; Нулирай бит T0IF
loop btfss INTCON,T0IF ; Бит T0IF=1?
goto loop ; Не, провери отново
decfsz Counter,f ; Да, Counter=(counter)-1,Counter=0?
goto again ; Не, изпълни цикъла отново
return ; Връщане към главната програма
;********************************************************************
; Главна програма
;********************************************************************
main bsf PORTB,0 ; RB0=1 (Светодиодът светва)
call wait ; Изчакай 460ms
bcf PORTB,0 ; RB0=0 (Светодиодът изгасва)
call wait ; Изчакай 460ms
goto main ; Повтори цикъла отново
END ; Директива за край на програмата
това е кога за мигащ диод, но не ми е ясно препълването на таймер 0 TMR0 и OPTION_REG.
Не ми е ясно и това "При използване на още един цикъл, максималната продължителност на времеинтервала ще бъде 255х255х255х65,5мс.
Дай някакви насоки. Имам PIC16F84A, взех го за да се обучавам, като целта ми е да ми отваря и затваря кран за вода да полива тревата на вилата. Може бирата да я пием там - прекрасно място!
П.С. Бирата е в хладилника  |
|
| Върнете се в началото |
|
 |
lenko71 Опитен потребител

Регистриран на: 29 Май 2009 Мнения: 302 Местожителство: Бургас
|
Пуснато на: Нед Май 01, 2011 15:33 Заглавие: |
|
|
Таймера (TMR0) увеличава стойността си на всеки n-ти цикъл (един цикъл е четири такта на осцилатора), като това "n", се задава в младшите три бита на OPTION регистъра. В случая те са "111", т. е. коефициента на делене е 1:256 или на всеки 256-ти цикъл таймера увеличава стойността си с единица.
При препълване на таймера, т. е. при прехода му от 11111111 в 00000000, бит 2 (или бит TOIF) на INTCON регистъра се установява в "1" което всъщност ти казва че брояча е препълнен. След това този бит се нулира (от програмата!) за да започне наново "пълнене" на брояча.
Относно времето, по моите сметки и при това задание:
...
movlw D'255'
movwf Counter
...
цикъла "wait" излиза около 16 секунди ( при честота 4MHz).
За да се получат времена от няколко часа ще трябва да се вложат още няколко цикъла (съответно и няколко променливи) |
|
| Върнете се в началото |
|
 |
Maverikkk Нов потребител

Регистриран на: 18 Апр 2011 Мнения: 4 Местожителство: sof
|
Пуснато на: Нед Май 01, 2011 15:52 Заглавие: |
|
|
| Благодаря за инфото, доста по разбираемо го обясни отколкото в книгата, би ли ми обяснил как да вложа тези още няколко цикъла, че наистина не съм в час. Благодаря. |
|
| Върнете се в началото |
|
 |
lenko71 Опитен потребител

Регистриран на: 29 Май 2009 Мнения: 302 Местожителство: Бургас
|
Пуснато на: Нед Май 01, 2011 16:54 Заглавие: |
|
|
Ами например така:
wait:
movlw D'255'
movwf Counter_2
movlw D'255'
movwf Counter_3
movlw D'255'
movwf Counter
clrf TMR0
again:
bcf INTCON,T0IF
loop:
btfss INTCON,T0IF
goto loop
decfsz Counter,f
goto again
decfsz Counter_2,f
goto again
decfsz Counter_3,f
goto again
return
като преди това трябва да се декларират и новите променливи (след Counter):
Counter EQU H'0C'
Counter_2 EQU H'0D'
Counter_3 EQU H'0E'
ПП: Числата '255' са само примерни |
|
| Върнете се в началото |
|
 |
Maverikkk Нов потребител

Регистриран на: 18 Апр 2011 Мнения: 4 Местожителство: sof
|
Пуснато на: Нед Май 01, 2011 17:09 Заглавие: |
|
|
| lenko71 написа: | Ами например така:
wait:
movlw D'255'
movwf Counter_2
movlw D'255'
movwf Counter_3
movlw D'255'
movwf Counter
clrf TMR0
again:
bcf INTCON,T0IF
loop:
btfss INTCON,T0IF
goto loop
decfsz Counter,f
goto again
decfsz Counter_2,f
goto again
decfsz Counter_3,f
goto again
return
като преди това трябва да се декларират и новите променливи (след Counter):
Counter EQU H'0C'
Counter_2 EQU H'0D'
Counter_3 EQU H'0E'
ПП: Числата '255' са само примерни |
Много ти благодаря за съветите, ще пробвам, само ми кажи на кой адрес да ти пратя бирата, че гледам си чак в Бургас  |
|
| Върнете се в началото |
|
 |
RC Опитен потребител

Регистриран на: 22 Фев 2003 Мнения: 13214
|
Пуснато на: Нед Май 01, 2011 17:12 Заглавие: |
|
|
Maverikkk да ти прави впечатление, че постовете ти се променят
Как пък не разбра с кой бутон се отговаря.
Edit: А това изпратено на лични е повече от излишно, но нека да е за сведение за любезният ти начин на общуване.
| Maverikkk написа: | | Такъв тон може да държиш НА МАЙКА ТИ! - ГОМНАР! |
_________________ RemoteControls |
|
| Върнете се в началото |
|
 |
|
|
Не Можете да пускате нови теми Не Можете да отговаряте на темите Не Можете да променяте съобщенията си Не Можете да изтривате съобщенията си Не Можете да гласувате в анкети
|
|