Отговори на тема  [ 34 мнения ]  Отиди на страница 1, 2, 3  Следваща
PIC 16F84A не изпълнява прости команди 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Юни 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
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Сеп 24, 2005 2:00 pm
Мнения: 787
Мнение 
Хм... Ако симулацията ти работи...
Това XT_OSC сигурен ли си за него? Какъв ти е кварца? Освен това гледам че инициализираш TRISA и TRISB като изходи. Няма да има бутони в тоя случай. Най-добре приложи схемата и тогава ще е по-ясно.
:)


Нед Юли 03, 2011 2:58 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Юни 27, 2010 1:23 pm
Мнения: 25
Мнение 
kiiid написа:
Хм... Ако симулацията ти работи...
Това XT_OSC сигурен ли си за него? Какъв ти е кварца? Освен това гледам че инициализираш TRISA и TRISB като изходи. Няма да има бутони в тоя случай. Най-добре приложи схемата и тогава ще е по-ясно.
:)


такаам ето схемичката. единия диод го включвам просто за да видя дали контролера изпълнява някакви команди. той трябва да работи постоянно (на RB0), до като другия трябва да се управлява чрез бутоните (на RB5)
XT_OSC означава задаваща честота от crystal, до колкото знам, и моя е 4 MHz. а за TRIS регистрите - задвам стойност TRISA = 0x03, за да са само RA0 и RA1 входове, пък TRISB ми е 0х00, за да са всичките RB-та изходи


Прикачени файлове:
scheme.jpg
scheme.jpg [ 178.28 KiB | Прегледано 2310 пъти ]

_________________
Има ли желание има и начин !
Нед Юли 03, 2011 4:21 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Май 01, 2009 4:01 pm
Мнения: 1438
Мнение 
MCLR не трябва да е "висящ". Свържи го към 5v. и ще тръгне.


Нед Юли 03, 2011 5:43 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
CarBeta написа:
MCLR не трябва да е "висящ". Свържи го към 5v. и ще тръгне.


Няма да те питам къде видя, че е висящ. :D Искам само да знам къде видя 5 волта ???
Аман от схеми на половина!!! Можеше поне една снимка да бредборда се има! Ти трябва да се досещаш какво още е свързал индивидът и какво е пропуснал. :twisted: И това дебъгване със симулации ми прилича като на секс в много интимна комания: ти и твоите фантазии ...


Нед Юли 03, 2011 6:40 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 10, 2005 3:25 pm
Мнения: 5677
Местоположение: София
Мнение 
lifenergy, един уточняващ въпрос. Това само хоби ли е или искаш да ти стане и професия?


Нед Юли 03, 2011 7:38 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Юни 27, 2010 1:23 pm
Мнения: 25
Мнение 
Desert Leo написа:
lifenergy, един уточняващ въпрос. Това само хоби ли е или искаш да ти стане и професия?


@bateAz:
напълно логично начертаната схема е идентична по свързване с тази, която осъществявам с бредборда. MCLR не бях свързвал, но ще пробвам и с него

@DesertLeo:
харесва ми да правя разни неща да работят и да са полезни. в контролерите съм меко казано "прохождащ", но се надявам с помощ от вас и разни книжки един ден да говорим на един език. да, искам да се занимавам с това : )

за резултатите ще споделя при първа възможност : )

_________________
Има ли желание има и начин !


Нед Юли 03, 2011 11:36 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 10, 2005 3:25 pm
Мнения: 5677
Местоположение: София
Мнение 
Тогава, възможно най-скоро сменяй контролера с нещо читаво и започвай да пишеш на С. И забрави за симулациите докато осмислиш за какво трябва да се използват.


Пон Юли 04, 2011 7:20 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение 
Че какво му има на 84-ката ? С този динозавър такива чудеса съм виждал направени ... :P


Пон Юли 04, 2011 8:53 am
Профил ICQ
Ранг: Напреднал
Ранг: Напреднал
Аватар

Регистриран на: Нед Сеп 17, 2006 12:00 pm
Мнения: 450
Местоположение: Plovdiv
Мнение 
Защо пък С? Най-добре е както е почнал с асемблера, така ще разбере как стават нещата. И контролерът си е супер.


Пон Юли 04, 2011 9:09 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 10, 2005 3:25 pm
Мнения: 5677
Местоположение: София
Мнение 
Вие или не четете написаното, или въобще не сте в час.
Младежа сам ще избере какво да прави, аз само го съветвам.
Ако е за хоби - няма значение отнетото време и разходите. Там е важно да има удовлетворителен резултат.

Ако ще е занаят, нещата са съвсем други. А с опит само с 84 и само асемблер едва ли ще си намери работа.


Пон Юли 04, 2011 10:00 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Май 01, 2009 4:01 pm
Мнения: 1438
Мнение 
bateAz написа:
Няма да те питам къде видя, че е висящ. :D Искам само да знам къде видя 5 волта ???
...


16F84 нама вътрешен PullUp на MCLR т.е. има нужда от външен. Вижда се, че схемата е правена на протеус. Гаден недостатък на тоя симулатор е, че не показва захранващите изводи и по подразбиране процесора е захранен и ресетнат. Затова схемата изглежда недовършена, но всъщност на симулатора си работи. Симулатора си преценява, че няма как да не подадеш захранване, и затова тая част от схемата липсва. По същия начин стои въпросът и с MCLR. Дори без PullUp на MCLR в симулатора всичко ще работи. Това е голям проблем за начинаещ, който е решил, че за по-евтино може да мине само със симулатор.

@lifenergy:
Ти хубаво обичаш да правиш полезни неща, които работят, но трябва да знаеш защо и как работят. Не случайно първо се учи теория. Симулатора може да е много полезен, но може и много да пречи. Все едно да се учиш да караш кола на симулатор. И като седнеш накрая в истинска кола да се получи: "Ама тя не пали...А гориво има ли? Ама аз на симулатора гориво не съм наливал"


Пон Юли 04, 2011 10:03 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Юни 27, 2010 1:23 pm
Мнения: 25
Мнение 
благодаря ви много, момци : ) получиха се нещата : ) сега ще започна да добавям разни усложнения по програмата ии като излезне пак някое нерешимо проблемче ще споделям : )

_________________
Има ли желание има и начин !


Вто Юли 05, 2011 8:20 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Юни 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


Прикачени файлове:
pascode scheme.jpg
pascode scheme.jpg [ 251.73 KiB | Прегледано 2281 пъти ]

_________________
Има ли желание има и начин !
Пет Юли 08, 2011 9:59 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Пет Яну 22, 2010 5:46 pm
Мнения: 680
Мнение 
Desert Leo написа:
Тогава, възможно най-скоро сменяй контролера с нещо читаво и започвай да пишеш на С. И забрави за симулациите докато осмислиш за какво трябва да се използват.


Идеален е контролера. Аз като започнах се борих с една 12-ка с компаратори сума време докато прочета, че по дефолт са аналогови входовете и за да ги ползваш като цифрови IO трябва да изключиш компаратора ... или поне да го поставиш в подходящ режим, че да ти освободи някой пин.
Ако почне с някой контролер дето само константите за конфигурацията му са 10-20 ще мине доста време докато накара светодиод да мига.

Не знам кой ме светна за един друг pic16Fxxx ... вика ми "нали не си забравил, че точно този пин е отворен дрейн". А така. Не бях проверил. Тука не е същия случай ама да те предупредя: внимавай като ползваш РА4 - трябва да вържеш анода на светодиода на +5 волта (през резистор), а катода на пина, защото при 1 на този пин остава хвърчащ, а при нула се свързва с маса. И диода ще светва при 0.

Малко ти е нечетим кода. Пускай по една табулация пред инструкциите, а етикети, директиви оставяй в началото на реда.
Така като гледам ей това е безсмислено:
Код:
call   Loop


Не разбирам как се компилира това нещо. Имаш етикет "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 и този код:
Код:
B1Check
if suggest == pcode
goto    Right
else
goto    Err
endif
return

ще изглежда така на микроконтролера:
Код:
B1Check
goto    Err
return


Този if не се изпълнява на микроконтролера, а в асемблера

... и още - suggest не ти е променлива, с която можеш да си работиш, а адрес от РАМ-а. т.е. ако напишеш:
Код:
clrf  suggest

е като:
Код:
clrf   0x0F

а това (пред иф трябва да има # ако трябва да сме стриктни):
Код:
#if suggest == 0x04

е като
Код:
#if 0x0F == 0x04


Ако ще правиш нещо просто - направи го първо просто и работещо, и след това оптимизирай, поставяй макроси и усложнявай с прекъсвания. Ето ти един прост wait:

Код:
Cblock    0x0C
    delay1
    delay2
endc
callw macro addr, wregvalue
  movlw  wregvalue
  call      addr
  endm

wait
  movwf delay1
waitloop1

  movlw  .100 ; натъкми това така че да е горе долу така както го искаш
  movwf delay2
waitloop2
  nop
  decfsz delay2
  goto waitloop2

  decfsz delay1
  goto waitloop1

  return

......

; вика се така:
callw  wait, .250
; или
movlw .250
call wait


закъснение с таймер е правилния начин, но не и докато се учиш. пък и ти правиш едновременно няколко неща. Ето ти идея как да отчиташ кога бутона е натиснат:

Код:
Cblock    0x0C
    oldPortB
    port
    temp
    PortBChanges
endc

main:
  movf PORTB, w
  mowf oldPortB
....
MainLoop:
  movf   PORTB, w ; зареждаш портб
  movwf temp
  xorwf  oldPortB, w ; 1-ца има там където е променено състоянието
  movwf PortBChanges ; запазваме промените
  movf   temp, w
  movwf oldPortB ; запазваме текущото съдържание на портБ за следващото сравнение
 
  andwf  portBChanges, f  ; това ще остави само промените от 0 към 1 (отпускане на бутона)

; и проверките
  btfsz  portBChanges, RB0
  call  ButtonEnterPressed
  btfsz  portBChanges, RB2
  call  ButtonClearPressed
  btfsz  portBChanges, RB4
  call  ButtonCheckPressed
...
  goto   MainLoop



след като проработи опитвай с прекъсвания - там логиката е почти същата

_________________
PIC SPBRG values calculator


Съб Юли 09, 2011 1:50 am
Профил WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 34 мнения ]  Отиди на страница 1, 2, 3  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни