|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 1:17 am
PIC 16F84A не изпълнява прости команди
| Автор |
Съобщение |
|
lifenergy
Ранг: Минаващ
Регистриран на: Нед Юни 27, 2010 1:23 pm Мнения: 25
|
 PIC 16F84A не изпълнява прости команди
Здравейте,
опитвам се да подкарам една съвсем проста схема, в която с копчета за ON и OFF се управлява едно диодче. При симулации с Proteus всичко е точно, кода се изпълнява без проблем (дори да извиквам Loop с call и с goto ). Но когато програмирам контролера и свържа схемата на бредборда натискането на копчетата не довежда до никакви резултати. диода не се включва, не се изключва.
та в този ред на мисли искам да помоля за забележки, препоръки и предложения за евентуални проблеми. ето и кода :
;This is code testing program with two buttons and
;one diode. The first button turns it on, and the
;second turns it off.
;MCU: PIC16F84A Creator: N. Yanakiev Date: 28.6.2011
;Version v1.0
PROCESSOR 16F84A
#include "p16f84a.inc"
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;Declaring variables
Cblock 0x0C
WCYCLE
HiLo
PRESCwait
endc
;Setting values
org 0x00
goto Main
org 0x04
goto Main
#include "bank.inc"
#include "NA_PORTx.inc"
#include "tester.inc"
#include "WAIT.inc"
Main
BANK1
clrf TRISA
clrf TRISB
BANK0
clrf PORTA
clrf PORTB
BANK1
movlw 0x03
movwf TRISA
movlw 0x00
movwf TRISB
NA_PORTB 0x01
call Loop
Loop
TESTER 0,PORTA, 0, .50, ON
TESTER 0,PORTA, 1, .50, OFF
goto Loop
ON
NA_PORTB 0x21
return
OFF
NA_PORTB 0x01
return
END
========================
WAIT.INC
; ***** Declaring constants *****
CONSTANT PRESCstd = .1 ;standard prescaler value for TMR0
;***** MACROS *****
WAIT macro timeconst_1
movlw timeconst_1
call WAITstd
endm
WAITX macro timeconst_2, PRESCext
movlw timeconst_2
movwf WCYCLE ;set the delay time period
movlw PRESCext ;write specific prescaler value
call WAIT_x
endm
;***** Subprograms *****
WAITstd
movwf WCYCLE ;set the delay time period
movlw PRESCstd ;write specific prescaler value
WAIT_x
clrf TMR0
BANK1 ;need to include bank.inc
movwf OPTION_REG ;assign the prescaler to TMR0 timer
BANK0 ;need to include bank.inc
WAITa bcf INTCON,T0IF ;erase TMR0 overflow flag
WAITb btfss INTCON,T0IF ;check whether it is erased, skip if it isn't
goto WAITb ;Wait loop
decfsz WCYCLE,1 ;repeat the loop if dellay period
;has not run out
goto WAITa
RETURN
==============
TESTER.INC
TESTER macro HiLo, Port, Bit, Delay, Address
Local Exit ;Local labels
Local Loop
if HiLo == 0 ;Is the key pressed?
btfsc Port, Bit ;Is input line LOW?
else
btfss Port, Bit ;Is input line HIGH?
endif
goto Exit ;If key hasn't been pressed, exit the
;macro
WAIT Delay ;Delay for key debounce
Loop
if HiLo == 0
btfss Port, Bit ;Is the key released ?
else
btfsc Port, Bit
endif
goto Loop
WAIT Delay ;Delay for key debounce
call Address ;Call the service subprogram
Exit ;Exit the macro
endm ;End of macro
===============
NA_PORTx.INC
;this is macro for setting logical levels on PORTA and PORTB for PIC16F84A
NA_PORTA macro ARG1 ;ARG1 is desired hex number, which will
;be set on PORTA
bcf STATUS, RP0 ;set memory BANK0
movlw ARG1 ;get the value of ARG1
movwf PORTA ;set the value on PORTA register
endm ;end of the macro
NA_PORTB macro ARG2 ;ARG2 is desired hex number, which will
;be set on PORTB
bcf STATUS, RP0 ;set memory BANK0
movlw ARG2 ;get the value of ARG2
movwf PORTB ;set the value on PORTB register
endm ;end of the macro
_________________ Има ли желание има и начин !
|
| Нед Юли 03, 2011 2:46 pm |
|
 |
|
kiiid
Ранг: Почетен член
Регистриран на: Съб Сеп 24, 2005 2:00 pm Мнения: 787
|
Хм... Ако симулацията ти работи...
Това XT_OSC сигурен ли си за него? Какъв ти е кварца? Освен това гледам че инициализираш TRISA и TRISB като изходи. Няма да има бутони в тоя случай. Най-добре приложи схемата и тогава ще е по-ясно.

|
| Нед Юли 03, 2011 2:58 pm |
|
 |
|
lifenergy
Ранг: Минаващ
Регистриран на: Нед Юни 27, 2010 1:23 pm Мнения: 25
|
такаам ето схемичката. единия диод го включвам просто за да видя дали контролера изпълнява някакви команди. той трябва да работи постоянно (на RB0), до като другия трябва да се управлява чрез бутоните (на RB5)
XT_OSC означава задаваща честота от crystal, до колкото знам, и моя е 4 MHz. а за TRIS регистрите - задвам стойност TRISA = 0x03, за да са само RA0 и RA1 входове, пък TRISB ми е 0х00, за да са всичките RB-та изходи
_________________ Има ли желание има и начин !
|
| Нед Юли 03, 2011 4:21 pm |
|
 |
|
CarBeta
Ранг: Форумен бог
Регистриран на: Пет Май 01, 2009 4:01 pm Мнения: 1438
|
MCLR не трябва да е "висящ". Свържи го към 5v. и ще тръгне.
|
| Нед Юли 03, 2011 5:43 pm |
|
 |
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 4:11 pm Мнения: 3750 Местоположение: София
|
Няма да те питам къде видя, че е висящ.  Искам само да знам къде видя 5 волта ???
Аман от схеми на половина!!! Можеше поне една снимка да бредборда се има! Ти трябва да се досещаш какво още е свързал индивидът и какво е пропуснал.  И това дебъгване със симулации ми прилича като на секс в много интимна комания: ти и твоите фантазии ...
|
| Нед Юли 03, 2011 6:40 pm |
|
 |
|
Desert Leo
Ранг: Форумен бог
Регистриран на: Чет Фев 10, 2005 3:25 pm Мнения: 5677 Местоположение: София
|
lifenergy, един уточняващ въпрос. Това само хоби ли е или искаш да ти стане и професия?
|
| Нед Юли 03, 2011 7:38 pm |
|
 |
|
lifenergy
Ранг: Минаващ
Регистриран на: Нед Юни 27, 2010 1:23 pm Мнения: 25
|
@bateAz:
напълно логично начертаната схема е идентична по свързване с тази, която осъществявам с бредборда. MCLR не бях свързвал, но ще пробвам и с него
@DesertLeo:
харесва ми да правя разни неща да работят и да са полезни. в контролерите съм меко казано "прохождащ", но се надявам с помощ от вас и разни книжки един ден да говорим на един език. да, искам да се занимавам с това : )
за резултатите ще споделя при първа възможност : )
_________________ Има ли желание има и начин !
|
| Нед Юли 03, 2011 11:36 pm |
|
 |
|
Desert Leo
Ранг: Форумен бог
Регистриран на: Чет Фев 10, 2005 3:25 pm Мнения: 5677 Местоположение: София
|
Тогава, възможно най-скоро сменяй контролера с нещо читаво и започвай да пишеш на С. И забрави за симулациите докато осмислиш за какво трябва да се използват.
|
| Пон Юли 04, 2011 7:20 am |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
Че какво му има на 84-ката ? С този динозавър такива чудеса съм виждал направени ... 
|
| Пон Юли 04, 2011 8:53 am |
|
 |
|
MidNighT_SpiRiT
Ранг: Напреднал
Регистриран на: Нед Сеп 17, 2006 12:00 pm Мнения: 450 Местоположение: Plovdiv
|
Защо пък С? Най-добре е както е почнал с асемблера, така ще разбере как стават нещата. И контролерът си е супер.
|
| Пон Юли 04, 2011 9:09 am |
|
 |
|
Desert Leo
Ранг: Форумен бог
Регистриран на: Чет Фев 10, 2005 3:25 pm Мнения: 5677 Местоположение: София
|
Вие или не четете написаното, или въобще не сте в час.
Младежа сам ще избере какво да прави, аз само го съветвам.
Ако е за хоби - няма значение отнетото време и разходите. Там е важно да има удовлетворителен резултат.
Ако ще е занаят, нещата са съвсем други. А с опит само с 84 и само асемблер едва ли ще си намери работа.
|
| Пон Юли 04, 2011 10:00 am |
|
 |
|
CarBeta
Ранг: Форумен бог
Регистриран на: Пет Май 01, 2009 4:01 pm Мнения: 1438
|
16F84 нама вътрешен PullUp на MCLR т.е. има нужда от външен. Вижда се, че схемата е правена на протеус. Гаден недостатък на тоя симулатор е, че не показва захранващите изводи и по подразбиране процесора е захранен и ресетнат. Затова схемата изглежда недовършена, но всъщност на симулатора си работи. Симулатора си преценява, че няма как да не подадеш захранване, и затова тая част от схемата липсва. По същия начин стои въпросът и с MCLR. Дори без PullUp на MCLR в симулатора всичко ще работи. Това е голям проблем за начинаещ, който е решил, че за по-евтино може да мине само със симулатор.
@ lifenergy:
Ти хубаво обичаш да правиш полезни неща, които работят, но трябва да знаеш защо и как работят. Не случайно първо се учи теория. Симулатора може да е много полезен, но може и много да пречи. Все едно да се учиш да караш кола на симулатор. И като седнеш накрая в истинска кола да се получи: "Ама тя не пали...А гориво има ли? Ама аз на симулатора гориво не съм наливал"
|
| Пон Юли 04, 2011 10:03 am |
|
 |
|
lifenergy
Ранг: Минаващ
Регистриран на: Нед Юни 27, 2010 1:23 pm Мнения: 25
|
благодаря ви много, момци : ) получиха се нещата : ) сега ще започна да добавям разни усложнения по програмата ии като излезне пак някое нерешимо проблемче ще споделям : )
_________________ Има ли желание има и начин !
|
| Вто Юли 05, 2011 8:20 am |
|
 |
|
lifenergy
Ранг: Минаващ
Регистриран на: Нед Юни 27, 2010 1:23 pm Мнения: 25
|
Здравейте отново ...
Продължавам да пробвам различни схемички с контролера и пак имам малко затруднения.
Схемата, която ще ви покажа е със следното предназначение: в контролера е запаметено едно число - например 4 (0х04). чрез един бутон се инкрементира една променлива, която при съвпадение със запаметеното число командва включването на един диод. добавих и опция изтриване на тази променлива чрез друг бутон. до тук добре - свързах схемата и записах програмата, само че реакция няма. единственото, което се случва е светенето на белия диод на RA2(това означава готовност за работа в моя случай. Червения на RA0 e при несъвпадение между числата, а зеления диод на RA3 - съвпадение).
Явно логически програмата ми не работи, но не мога да разбеа къде греша. Ето я и нея заедно със схемата на свързване :
PROCESSOR 16F84A
#include "p16f84a.inc"
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;======== Declaring variables ========
Cblock 0x0C
WCYCLE
HiLo
PRESCwait
suggest
endc
;======== Setting values for the start of the memory ========
org 0x00
goto Main
org 0x04
goto Main
#include "BNWB.inc"
pcode equ 0x04
Main
BANK0
clrf PORTA
clrf PORTB
BANK1
clrf TRISA
clrf TRISB
clrf suggest
movlw 0xff
movwf TRISB
Loop
call Ready
goto Loop
;========Subprograms========
Ready
NA_PORTA 0x04 ;White Led is lighting. Ready
;for acception of a passcode suggestion
BUTTON 0, PORTB, 0, .100, B1Check
BUTTON 0, PORTB, 2, .100, B2Clear
BUTTON 0, PORTB, 4, .100, B3Increm
return
B1Check
if suggest == pcode
goto Right
else
goto Err
endif
return
B2Clear
clrf suggest
goto Ready
return
B3Increm
incf suggest, 1 ;Here the contents of register 'f'
goto Ready ;(suggest) is incremented with 1
return ;The '1' means that the
;result is placed back in 'suggest' and
;if it was 0 - the result would have
;be saved in W register
Right
NA_PORTA 0x08 ;Correct! This is the right passcode
goto Right ;suggestion
return
Err
NA_PORTA 0x01 ;Error! This is not the right suggestion!
WAIT .250 ;The Red Led lights for 1 second and the
WAIT .250 ;the program returns in Ready position
WAIT .250
WAIT .250
goto Ready
return
END
======BNWB.INC======= - съвкупност от други INCs
; This file contains four INC files with supporting macros for PIC16F84A
; In the beginning of a program is necessarily to declare the following variables via Cblock:
;
;Cblock 0x0C ;beginning of RAM
;WCYCLE
;PRESCwait
;
;endc
;
;====================================================
; BANK.INC - helps choosing memory banks (BANK0/BANK1)
;====================================================
BANK0 macro
bcf STATUS,RP0 ;Select memory bank 0
endm
BANK1 macro
bsf STATUS,RP0 ;Select memory bank 1
endm
;====================================================
; NA_PORTx.INC - helps setting logical levels on PORTA/PORTB
;====================================================
NA_PORTA macro ARG1 ;ARG1 is desired hex number, which will
;be set on PORTA
bcf STATUS, RP0 ;set memory BANK0
movlw ARG1 ;get the value of ARG1
movwf PORTA ;set the value on PORTA register
endm ;end of the macro
NA_PORTB macro ARG2 ;ARG2 is desired hex number, which will
;be set on PORTB
bcf STATUS, RP0 ;set memory BANK0
movlw ARG2 ;get the value of ARG2
movwf PORTB ;set the value on PORTB register
endm ;end of the macro
;====================================================
; WAIT.INC - helps making small time pauses
;====================================================
; ***** Declaring constants *****
CONSTANT PRESCstd = .1 ;standard prescaler value for TMR0
;***** MACROS *****
WAIT macro timeconst_1
movlw timeconst_1
call WAITstd
endm
WAITX macro timeconst_2, PRESCext
movlw timeconst_2
movwf WCYCLE ;set the delay time period
movlw PRESCext ;write specific prescaler value
call WAIT_x
endm
;***** Subprograms *****
WAITstd
movwf WCYCLE ;set the delay time period
movlw PRESCstd ;write specific prescaler value
WAIT_x
clrf TMR0
BANK1 ;need to include bank.inc
movwf OPTION_REG ;assign the prescaler to TMR0 timer
BANK0 ;need to include bank.inc
WAITa bcf INTCON,T0IF ;erase TMR0 overflow flag
WAITb btfss INTCON,T0IF ;check whether it is erased, skip if it isn't
goto WAITb ;Wait loop
decfsz WCYCLE,1 ;repeat the loop if dellay period
;has not run out
goto WAITa
RETURN
;====================================================
; BUTTON.INC - helps assigning of position and function of a buttons
;====================================================
BUTTON macro HiLo, Port, Bit, Delay, Address
Local Exit ;Local labels
Local Loop
if HiLo == 0 ;Is the key pressed?
btfsc Port, Bit ;Is input line LOW?
else
btfss Port, Bit ;Is input line HIGH?
endif
goto Exit ;If key hasn't been pressed, exit the
;macro
WAIT Delay ;Delay for key debounce
Loop
if HiLo == 0
btfss Port, Bit ;Is the key released ?
else
btfsc Port, Bit
endif
goto Loop
WAIT Delay ;Delay for key debounce
call Address ;Call the service subprogram
Exit ;Exit the macro
endm ;End of macro
_________________ Има ли желание има и начин !
|
| Пет Юли 08, 2011 9:59 pm |
|
 |
|
npelov
Ранг: Почетен член
Регистриран на: Пет Яну 22, 2010 5:46 pm Мнения: 680
|
Идеален е контролера. Аз като започнах се борих с една 12-ка с компаратори сума време докато прочета, че по дефолт са аналогови входовете и за да ги ползваш като цифрови IO трябва да изключиш компаратора ... или поне да го поставиш в подходящ режим, че да ти освободи някой пин.
Ако почне с някой контролер дето само константите за конфигурацията му са 10-20 ще мине доста време докато накара светодиод да мига.
Не знам кой ме светна за един друг pic16Fxxx ... вика ми "нали не си забравил, че точно този пин е отворен дрейн". А така. Не бях проверил. Тука не е същия случай ама да те предупредя: внимавай като ползваш РА4 - трябва да вържеш анода на светодиода на +5 волта (през резистор), а катода на пина, защото при 1 на този пин остава хвърчащ, а при нула се свързва с маса. И диода ще светва при 0.
Малко ти е нечетим кода. Пускай по една табулация пред инструкциите, а етикети, директиви оставяй в началото на реда.
Така като гледам ей това е безсмислено:
Не разбирам как се компилира това нещо. Имаш етикет "Exit". Той е в макрос. Макроса го викаш 2 пъти -> имаш 2 пъти етикет Exit -> логично е да получаваш съобщение за грешка "Address label duplicated". В макрос не скачай по абсолютен адрес и по възможност - не скачай изобщо. Още един проблем - ей тук си в банка 1, докато регистъра suggest май ти е в банка 0: BANK1 clrf TRISA clrf TRISB movlw 0xff movwf TRISB clrf suggest И още проблеми - if е compile time директива. Това означава че след като компилираш (така де асемблираш) кода само едната от двете части ще остане. В случая suggest ти е адрес ... мързи ме да смятам ама май е 15 (0х0F). pcode е 4. Т.е. suggest винаги ще е различен от 4 и този код: ще изглежда така на микроконтролера: Този if не се изпълнява на микроконтролера, а в асемблера ... и още - suggest не ти е променлива, с която можеш да си работиш, а адрес от РАМ-а. т.е. ако напишеш: е като: а това (пред иф трябва да има # ако трябва да сме стриктни): е като Ако ще правиш нещо просто - направи го първо просто и работещо, и след това оптимизирай, поставяй макроси и усложнявай с прекъсвания. Ето ти един прост wait: закъснение с таймер е правилния начин, но не и докато се учиш. пък и ти правиш едновременно няколко неща. Ето ти идея как да отчиташ кога бутона е натиснат:
след като проработи опитвай с прекъсвания - там логиката е почти същата
|
| Съб Юли 09, 2011 1:50 am |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 2 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|