Отговори на тема  [ 5 мнения ] 
програма за събуждане на микроконтролер от режим Sleep 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Апр 13, 2009 9:26 pm
Мнения: 1
Мнение програма за събуждане на микроконтролер от режим Sleep
програма за събуждане на микроконтролер от режим 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         ; Директина за край на програмата


Ще съм ви благодарен за помоща


Пон Апр 13, 2009 9:28 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Нед Окт 19, 2008 7:26 pm
Мнения: 673
Мнение 
След ремонта на следния ред, предполагам че половината грешки ще изчезнат
Код:
#include    <p16F8A.inc>      ; Дефиниции за SFR регистрите

А кода който си написал, извинявай преписал или по точно недопреписал
има липси откъм дефиниране на променливи???

:D Е поне аз така виждам нещата :D


Пон Апр 13, 2009 11:13 pm
Профил
Ранг: Напреднал
Ранг: Напреднал

Регистриран на: Чет Авг 21, 2008 2:52 pm
Мнения: 476
Местоположение: Пловдив
Мнение 
сравни си кода по-добре с книгата на млад конструктор..някъде си забравил нещо


Вто Апр 14, 2009 11:39 am
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Дек 06, 2008 9:22 am
Мнения: 119
Местоположение: Пловдив
Мнение 
На първо време сле до конфигурационната дума напиши errorlevel -302 за да ти махне Warning за банките примерно.

на второ място прегледаи си кода откривам на първо четене ужасно много правописни грешки

STATUS , RB0 трбва да е STATUS RP0
call wait трбва да е call Wait
bsf Oat трбва да е bsf Out

Общо взето за компилатора има значение малки и големи букви.А като гледам този код все е дно със затворени очи си го преписвал от книгата.
Изтрии всичко и наново ще ти е по лесно.


Сря Апр 15, 2009 8:00 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Чет Ное 20, 2008 1:49 pm
Мнения: 276
Местоположение: Бургас
Мнение 
Малък трик (ако става въпрос за МПЛаб):
При конфигурирането на проекта може да се изключи чувствителността къв главни и малки букви. Това намалява възможните символни комбинации, но за хора, свикнали с кейс-инсенситив езици е по-удобно.

_________________
Digitally yours: Optron


Пет Апр 17, 2009 3:59 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 5 мнения ] 

Кой е на линия

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


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

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