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

Регистриран на: 13 Апр 2009 Мнения: 3
|
Пуснато на: Пон Апр 13, 2009 18:03 Заглавие: програма за събуждане на микроконтролер от режим Slee |
|
|
програма за събуждане на микроконтролер от режим Sleep при натискане на бутон.
Искам да направя програма на асемблер но ми показва 51 грешки. може ли да ми помогнете.
Ето кода дето правих
| Код: | list p=16F84A ; Задава типа на процесора
#include <p16F8A.inc> ; Дефиниции за SFR регистрите
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;***********Дефиниране на константи и променливи ********
W EQU 0
f EQU 1
Counter EQU H'0C'
Temp EQU H'0D'
Key_number EQU H'0E'
;----------Дефиниране на входно-изходните изводи-------------
#define Out PORTA.4
; *****************************************************
; Потребителска програма
;******************************************************
ORG H'0000' ; вектор на НУ
goto start ; Преход към началото на програмата
ORG H'0004' ; Вектор на прекъсване
goto Int_Service ; Преход към ISR
;*******************************************************
; Начало на програмата
;*******************************************************
start bsf STATUS,RB0 ; избор на Банка 1
movlw B'00010100' ; 0000100b ?w
movwf OPTION_REG ; (w)? OPTION_REG
bcf STATUS RB0 ; избор на Банка 0
clrf PORTB ; 00h? PORTB
bsf STATUS,RP0 ; избор на Банка 1
movlw B'11110000' ;11110000b?w
movwf TRISB ; RB7-RB4-входове, RB3-RB0-изходи
bcf TRISA,4 ; RA4-вход
bcf STATUS,RB0 ; Избор на Банка 0
movf PORTB ; четене на PORTB
movlw B'10001000' ; 10001000b?w
movwf INTCON ; (w) ? INTCON
bsf Oat ; RA4=1 (Изгасен светодиод VD5)
goto main ;
; ************************************************************
; Използвани подпрограми
; ************************************************************
;------ Програма за обслужване на прекъсванията (ISR) -------------
Int_Service
btfss INTCON, RBIF ; Бит RBIF=1? (Прекъсване на PORTB ? )
goto end_int ; Не, връщане от ISR
PORTB_int
call wait ; Изчакай 16ms
comf PORTB,w ; Инверт. PORTB и запиши резултата в W
movwf Temp,f ; (W) ? Temp
movlw B'11110000' ; 11110000b?W
andwf Temp, f ; (w) AND (Temp) ?Temp
call Check keys ; Провери броя на натиснатите бутони
movf Key_number,w ; (Key_number)=> W
btfsc STATUS,Z ; (Key_nimber) = 0 ?
goto release ; Да
xorlw H'01' ; Не, (w) XOR G l h ? W
btfss STATUS,Z ; (w)=0? (Един бутон ли е натиснат ?)
goto key_error ; Не, индикация за грешка
swapf Temp,w ; Размени тетрадите на Темр
movwf PORTB ; (w) , PORTB
goto release
key_error
bcf Out ; RA4=0 (светни VD5)
release
movlw B'11110000' ; 11110000?W
andwf PORTB,w ; (PORTB) AND (w)?w
xorlw B'11110000' ; (w) XOR 11110000b?w
btfss STATUS,Z ; (w)=0? (отпуснат бутон?)
goto release ; Не, провери отново
call wait ; Да, изчакай 16ms
bsf Out ; RA4=1 (изгаси VD5)
end_int movf PORTB,f ; Четене на PORTB
bcf INTCON,RBIF ; Нулиране на флага INTF и връщане
retfie ; Към главната програма
;-------- Подпрограма “wait”, ; формираща времезадръжка от 16 ms---
Wait movlw D'2' ; 2->w
movwf Counter ; (w)->Counter
clrf TMR0 ; 00h->TMRO
again bcf INTCON.T0IF ; Нулирай бит TOIF
loop btfss INTCON.T0IF ; Бит TOIF=1?
goto loop ; Не, провери отново
decfsz Counter,f ; Да, Counter= (Counter)-1 Counter=0?
goto again ; Не, изпълни цикъла отново
return
;----------Подпрограма за проверка броя на натиснатите бутони---------
Check_keys
clrf Key_number ; 00h?Key_number
btfsc Temp,7 ; Temp<7>=1? (натиснат бутон S1?)
incf Key_number,f ; Да, Key_number=(Key_nimber)+1
btfsc Temp,6 ; Temp<6>=1? (Натиснат бутон S2?)
incf Key_number,f ; Да, Key_number=(key_number)+1
btfsc Temp,5 ; Temp<5>=1? (Натиснат бутон S3?)
incf Key_number,f ; Да, Key_number=(key_number)+1
btfsc Temp,4 ; Temp<4>=1? (Натиснат бутон S4?)
incf Key_number,f ; Да, Key_number=(key_number)+1
return
;************************************************************************
; Главна програма
;***********************************************************************
main sleep ; режим SLEEP
nop ; Празна информация
goto main
END ; Директина за край на програмата
|
Ще съм ви благодарен за помоща |
|
| Върнете се в началото |
|
 |
mishomvp Опитен потребител

Регистриран на: 17 Авг 2004 Мнения: 2357 Местожителство: Златоград
|
Пуснато на: Пон Апр 13, 2009 18:25 Заглавие: |
|
|
Не си за тук
Тук http://www.mcu-bg.com/ ще ти помогнат повече мисля  |
|
| Върнете се в началото |
|
 |
grizzly Опитен потребител


Регистриран на: 07 Ное 2008 Мнения: 246 Местожителство: София
|
Пуснато на: Вто Апр 14, 2009 0:27 Заглавие: |
|
|
Вероятно не ти е правилно "инклуднат" файла с процесорните дефиниции. Програмата вероятно е читава. Дай какви са грешките. Ако имаш грешка на всеки ред то
| Код: | list p=16F84A ; Задава типа на процесора
#include <p16F8A.inc> ; Дефиниции за SFR регистрите |
не функционира. |
|
| Върнете се в началото |
|
 |
emil74 Опитен потребител


Регистриран на: 16 Мар 2007 Мнения: 1111
|
Пуснато на: Вто Апр 14, 2009 0:35 Заглавие: |
|
|
Първата и сериозна грешка е, че #include <p16F8A.inc> НАМА КАК ДА ФУНКЦИОНИРА, защото името на файла тук е:<p16F84A.inc>Малка техническа грешка със сериозни последици...
Ето основните грешки, които открих: Запомни, че транслаторът различно приема главни и малки букви в етикетите и Wait не е същото като wait. Внимавай и как указваш бит в регистър- STATUS RB0 или STATUS, RB0 определено нищо не означава за MPLAB, но STATUS,RP0 вече е друго нещо. Същото важи и за PORTA.4, което иначе трябва да е PORTA,4
movwf Temp,f трябва да е movf Temp,f
Опитай с този код:
| Код: | 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'
Temp EQU H'0D'
Key_number EQU H'0E'
;----------Дефиниране на входно-изходните изводи-------------
#define Out PORTA,4
; *****************************************************
; Потребителска програма
;******************************************************
ORG H'0000' ; вектор на НУ
goto start ; Преход към началото на програмата
ORG H'0004' ; Вектор на прекъсване
goto Int_Service ; Преход към ISR
;*******************************************************
; Начало на програмата
;*******************************************************
start
bsf STATUS,RP0 ; избор на Банка 1
movlw B'00010100' ; 0000100b ?w
movwf OPTION_REG ; (w)? OPTION_REG
bcf STATUS, RP0 ; избор на Банка 0
clrf PORTB ; 00h? PORTB
bsf STATUS,RP0 ; избор на Банка 1
movlw B'11110000' ;11110000b?w
movwf TRISB ; RB7-RB4-входове, RB3-RB0-изходи
bcf TRISA,4 ; RA4-вход
bcf STATUS,RP0 ; Избор на Банка 0
movf PORTB ; четене на PORTB
movlw B'10001000' ; 10001000b?w
movwf INTCON ; (w) ? INTCON
bsf Out ; RA4=1 (Изгасен светодиод VD5)
goto main ;
; ************************************************************
; Използвани подпрограми
; ************************************************************
;------ Програма за обслужване на прекъсванията (ISR) -------------
Int_Service
btfss INTCON, RBIF ; Бит RBIF=1? (Прекъсване на PORTB ? )
goto end_int ; Не, връщане от ISR
PORTB_int
call Wait ; Изчакай 16ms
comf PORTB,w ; Инверт. PORTB и запиши резултата в W
movf Temp,f ; (W) ? Temp
movlw B'11110000' ; 11110000b?W
andwf Temp, f ; (w) AND (Temp) ?Temp
call Check_keys ; Провери броя на натиснатите бутони
movf Key_number,w ; (Key_number)=> W
btfsc STATUS,Z ; (Key_nimber) = 0 ?
goto release ; Да
xorlw H'01' ; Не, (w) XOR G l h ? W
btfss STATUS,Z ; (w)=0? (Един бутон ли е натиснат ?)
goto key_error ; Не, индикация за грешка
swapf Temp,w ; Размени тетрадите на Темр
movwf PORTB ; (w) , PORTB
goto release
key_error
bcf Out ; RA4=0 (светни VD5)
release
movlw B'11110000' ; 11110000?W
andwf PORTB,w ; (PORTB) AND (w)?w
xorlw B'11110000' ; (w) XOR 11110000b?w
btfss STATUS,Z ; (w)=0? (отпуснат бутон?)
goto release ; Не, провери отново
call Wait ; Да, изчакай 16ms
bsf Out ; RA4=1 (изгаси VD5)
end_int movf PORTB,f ; Четене на PORTB
bcf INTCON,RBIF ; Нулиране на флага INTF и връщане
retfie ; Към главната програма
;-------- Подпрограма “wait”, ; формираща времезадръжка от 16 ms---
Wait movlw D'2' ; 2->w
movwf Counter ; (w)->Counter
clrf TMR0 ; 00h->TMRO
again bcf INTCON,T0IF ; Нулирай бит TOIF
loop btfss INTCON,T0IF ; Бит TOIF=1?
goto loop ; Не, провери отново
decfsz Counter,f ; Да, Counter= (Counter)-1 Counter=0?
goto again ; Не, изпълни цикъла отново
return
;----------Подпрограма за проверка броя на натиснатите бутони---------
Check_keys
clrf Key_number ; 00h?Key_number
btfsc Temp,7 ; Temp<7>=1? (натиснат бутон S1?)
incf Key_number,f ; Да, Key_number=(Key_nimber)+1
btfsc Temp,6 ; Temp<6>=1? (Натиснат бутон S2?)
incf Key_number,f ; Да, Key_number=(key_number)+1
btfsc Temp,5 ; Temp<5>=1? (Натиснат бутон S3?)
incf Key_number,f ; Да, Key_number=(key_number)+1
btfsc Temp,4 ; Temp<4>=1? (Натиснат бутон S4?)
incf Key_number,f ; Да, Key_number=(key_number)+1
return
;************************************************************************
; Главна програма
;***********************************************************************
main sleep ; режим SLEEP
nop ; Празна информация
goto main
END ; Директина за край на програмата |
|
|
| Върнете се в началото |
|
 |
mischoni Нов потребител

Регистриран на: 13 Апр 2009 Мнения: 3
|
Пуснато на: Вто Апр 14, 2009 15:42 Заглавие: |
|
|
брагодаря за помоща. изкара ми вече 0 грешки при асемблиране и 1 грешка при опцията project -> BUILD ALL ми изкара следното съобщение
Clean: Deleting intermediary and output files. Clean: Deleted file "pic16F84A.err". Clean Warning: File "C:\Documents and Settings\Delyan\Desktop\PIC16F84A\pic16F84A.hex" doesn't exist. Clean: Deleted file "pic16F84A.lst". Clean: Done. Executing: "C:\Program Files\Microchip\MPASM Suite\MPAsmWin.exe" /q /p16F84A "pic16F84A.asm" /l"pic16F84A.lst" /e"pic16F84A.err" Warning[205] C:\PIC16F84A\PIC16F84A.ASM 1 : Found directive in column 1. (list) Message[302] C:\PIC16F84A\PIC16F84A.ASM 26 : Register in operand not in bank 0. Ensure that bank bits are correct. Message[302] C:\PIC16F84A\PIC16F84A.ASM 31 : Register in operand not in bank 0. Ensure that bank bits are correct. Message[302] C:\PIC16F84A\PIC16F84A.ASM 32 : Register in operand not in bank 0. Ensure that bank bits are correct. Message[305] C:\PIC16F84A\PIC16F84A.ASM 34 : Using default destination of 1 (file). Error[173] C:\PIC16F84A\PIC16F84A.ASM 104 : Source file path exceeds 62 characters (C:\PIC16F84A\PIC16F84A.ASM) Halting build on first failure as requested. BUILD FAILED: Tue Apr 14 16:35:25 2009
можете ли да ми пратите HEX файла |
|
| Върнете се в началото |
|
 |
mishomvp Опитен потребител

Регистриран на: 17 Авг 2004 Мнения: 2357 Местожителство: Златоград
|
Пуснато на: Вто Апр 14, 2009 18:22 Заглавие: |
|
|
Source file path exceeds 62 characters (C:\PIC16F84A\PIC16F84A.ASM) Halting build on first failure as requested. BUILD FAILED: Tue Apr 14 16:35:25 2009
Преведи си го и ще разбереш къде е грешката. |
|
| Върнете се в началото |
|
 |
mischoni Нов потребител

Регистриран на: 13 Апр 2009 Мнения: 3
|
Пуснато на: Сря Апр 15, 2009 19:17 Заглавие: |
|
|
| ще ми помогнете ли? |
|
| Върнете се в началото |
|
 |
|
|
Не Можете да пускате нови теми Не Можете да отговаряте на темите Не Можете да променяте съобщенията си Не Можете да изтривате съобщенията си Не Можете да гласувате в анкети
|
|