Форум за електроника Форуми Форум за електроника
Български форум за електроника, ремонти, схеми, документация
 
 Въпроси/ОтговориВъпроси/Отговори   ТърсенеТърсене   ПотребителиПотребители   ГрупиГрупи   Регистрирайте сеРегистрирайте се 
 ПрофилПрофил   Влезте, за да видите съобщенията сиВлезте, за да видите съобщенията си   ВходВход 

програма за събуждане на микроконтролер от режим Slee

 
Създайте нова тема   Напишете отговор    Форум за електроника Форуми -> Обща електроника - General Electronics



Предишната тема :: Следващата тема  
Автор Съобщение
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    Заглавие: Отговорете с цитат

Не си за тук Smile
Тук http://www.mcu-bg.com/ ще ти помогнат повече мисля Smile
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Посетете сайта на потребителя
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>Малка техническа грешка със сериозни последици... Very Happy

Ето основните грешки, които открих: Запомни, че транслаторът различно приема главни и малки букви в етикетите и 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    Заглавие: Отговорете с цитат

ще ми помогнете ли?
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла
Покажи мнения от преди:   
Създайте нова тема   Напишете отговор    Форум за електроника Форуми -> Обща електроника - General Electronics Часовете са според зоната GMT + 2 Часа
Страница 1 от 1

 
Към:  
Не Можете да пускате нови теми
Не Можете да отговаряте на темите
Не Можете да променяте съобщенията си
Не Можете да изтривате съобщенията си
Не Можете да гласувате в анкети


Powered by phpBB © 2001, 2005 phpBB Group
Translation by: Boby Dimitrov
Where to Find Free Service Manuals