| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| PIC 16F84A не изпълнява прости команди http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=8988 |
Страница 1 от 3 |
| Автор: | lifenergy [ Нед Юли 03, 2011 2:46 pm ] |
| Заглавие: | 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 |
|
| Автор: | kiiid [ Нед Юли 03, 2011 2:58 pm ] |
| Заглавие: | |
Хм... Ако симулацията ти работи... Това XT_OSC сигурен ли си за него? Какъв ти е кварца? Освен това гледам че инициализираш TRISA и TRISB като изходи. Няма да има бутони в тоя случай. Най-добре приложи схемата и тогава ще е по-ясно. |
|
| Автор: | CarBeta [ Нед Юли 03, 2011 5:43 pm ] |
| Заглавие: | |
MCLR не трябва да е "висящ". Свържи го към 5v. и ще тръгне. |
|
| Автор: | bateAz [ Нед Юли 03, 2011 6:40 pm ] | |||||||||
| Заглавие: | ||||||||||
Няма да те питам къде видя, че е висящ. Аман от схеми на половина!!! Можеше поне една снимка да бредборда се има! Ти трябва да се досещаш какво още е свързал индивидът и какво е пропуснал. |
||||||||||
| Автор: | Desert Leo [ Нед Юли 03, 2011 7:38 pm ] |
| Заглавие: | |
lifenergy, един уточняващ въпрос. Това само хоби ли е или искаш да ти стане и професия? |
|
| Автор: | lifenergy [ Нед Юли 03, 2011 11:36 pm ] | |||||||||
| Заглавие: | ||||||||||
@bateAz: напълно логично начертаната схема е идентична по свързване с тази, която осъществявам с бредборда. MCLR не бях свързвал, но ще пробвам и с него @DesertLeo: харесва ми да правя разни неща да работят и да са полезни. в контролерите съм меко казано "прохождащ", но се надявам с помощ от вас и разни книжки един ден да говорим на един език. да, искам да се занимавам с това : ) за резултатите ще споделя при първа възможност : ) |
||||||||||
| Автор: | Desert Leo [ Пон Юли 04, 2011 7:20 am ] |
| Заглавие: | |
Тогава, възможно най-скоро сменяй контролера с нещо читаво и започвай да пишеш на С. И забрави за симулациите докато осмислиш за какво трябва да се използват. |
|
| Автор: | Cekins [ Пон Юли 04, 2011 8:53 am ] |
| Заглавие: | |
Че какво му има на 84-ката ? С този динозавър такива чудеса съм виждал направени ... |
|
| Автор: | MidNighT_SpiRiT [ Пон Юли 04, 2011 9:09 am ] |
| Заглавие: | |
Защо пък С? Най-добре е както е почнал с асемблера, така ще разбере как стават нещата. И контролерът си е супер. |
|
| Автор: | Desert Leo [ Пон Юли 04, 2011 10:00 am ] |
| Заглавие: | |
Вие или не четете написаното, или въобще не сте в час. Младежа сам ще избере какво да прави, аз само го съветвам. Ако е за хоби - няма значение отнетото време и разходите. Там е важно да има удовлетворителен резултат. Ако ще е занаят, нещата са съвсем други. А с опит само с 84 и само асемблер едва ли ще си намери работа. |
|
| Автор: | CarBeta [ Пон Юли 04, 2011 10:03 am ] | |||||||||
| Заглавие: | ||||||||||
16F84 нама вътрешен PullUp на MCLR т.е. има нужда от външен. Вижда се, че схемата е правена на протеус. Гаден недостатък на тоя симулатор е, че не показва захранващите изводи и по подразбиране процесора е захранен и ресетнат. Затова схемата изглежда недовършена, но всъщност на симулатора си работи. Симулатора си преценява, че няма как да не подадеш захранване, и затова тая част от схемата липсва. По същия начин стои въпросът и с MCLR. Дори без PullUp на MCLR в симулатора всичко ще работи. Това е голям проблем за начинаещ, който е решил, че за по-евтино може да мине само със симулатор. @lifenergy: Ти хубаво обичаш да правиш полезни неща, които работят, но трябва да знаеш защо и как работят. Не случайно първо се учи теория. Симулатора може да е много полезен, но може и много да пречи. Все едно да се учиш да караш кола на симулатор. И като седнеш накрая в истинска кола да се получи: "Ама тя не пали...А гориво има ли? Ама аз на симулатора гориво не съм наливал" |
||||||||||
| Автор: | lifenergy [ Вто Юли 05, 2011 8:20 am ] |
| Заглавие: | |
благодаря ви много, момци : ) получиха се нещата : ) сега ще започна да добавям разни усложнения по програмата ии като излезне пак някое нерешимо проблемче ще споделям : ) |
|
| Автор: | lifenergy [ Пет Юли 08, 2011 9:59 pm ] | ||
| Заглавие: | |||
Здравейте отново ... Продължавам да пробвам различни схемички с контролера и пак имам малко затруднения. Схемата, която ще ви покажа е със следното предназначение: в контролера е запаметено едно число - например 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
|
|||
| Автор: | npelov [ Съб Юли 09, 2011 1:50 am ] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Заглавие: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Идеален е контролера. Аз като започнах се борих с една 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:
закъснение с таймер е правилния начин, но не и докато се учиш. пък и ти правиш едновременно няколко неща. Ето ти идея как да отчиташ кога бутона е натиснат:
след като проработи опитвай с прекъсвания - там логиката е почти същата |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Страница 1 от 3 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|