Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Weak Pull-up
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=7480
Страница 1 от 1

Автор:  npelov [ Съб Яну 23, 2010 3:05 am ]
Заглавие:  Weak Pull-up

Имам проблем. Един дребен пик 12F629 не ще да ме слуша.
Програмата ми започва така:

Код:
        movlw   80h
      banksel OPTION_REG
        movwf   OPTION_REG ; bank1

      banksel WPU
        clrf   WPU  ;21 ;???
      movlw   37h ; 0011 0111
      movwf   WPU

      banksel TRISIO
      clrf    TRISIO ; bank1
      ;GP1 - input, the rest output. GP3 - always input
      bsf      TRISIO, GP1 ; bank1


T.e. разрешил съм pul-up на всички GPIO (GP3 няма такава опция). GP1 - вход. Всички останали - изходи. На теория GP1 трябва да се чете 1, а се чете ту като 1, ту като 0.
Някакви идеи?

На GP0 има зелен светодиод, а на GP2 е червен ... или обратното (диода е 1, двуцветен). Св. диода трябва да мига червено или зелено в зависимост дали GP1 е свързан към маса, но става цветомузика - всички цветове се редуват


пълен код на програмата (прекъсванията временно са изключени):
Код:
   list    p=12F629
   #include p12F629.inc

#DEFINE DISABLE_INT

   ;__config   _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF & _CPD_OFF  & _BODEN_OFF & _MCLRE_OFF
   __config   H'1F81'
   __idlocs   0x0001


   cblock 0x20
      dtime
      smalld
      vsd
      pdelay
      status_temp
      W_temp
      fsr_temp
      color
   endc


   org H'0000'
   goto main

   org H'0004'
   goto   handle_interrupts



   org H'0005'




handle_interrupts
;push:
   movwf   W_temp   ;save W register
   swapf   STATUS, W
   ;movf   STATUS,W
   movwf   status_temp ; (1tcy)
   banksel FSR
   movf   FSR,W
   movwf   fsr_temp
   bcf      STATUS, RP0 ; select bank 0

   banksel   INTCON
   btfsc   INTCON, GPIF
   goto   gp_int
   
   goto   end_interrupts

;a port state changed
gp_int
   
   banksel   GPIO
   movlw   GP0
   btfsc   GPIO, GP1
   movlw   GP2
   movwf   color

   

   ;BANKSEL   PIR1 ; (2tcy) select correct SFR bank
   ;btfss   INTCON,GPIF ; (2tcy) did a Timer1 overflow occur?
   goto end_interrupts ; (2tcy) no, check another interrupt source   

end_interrupts

;POP:
   banksel   FSR
   MOVF    fsr_temp,W
   MOVWF   FSR
   SWAPF   status_temp,W
   MOVWF   STATUS
   SWAPF   W_temp, F
   SWAPF   W_temp,W
   retfie


      ;delay time = 4*(cntr-1)+10
delay
        bcf   STATUS,RP0
      ;movlw   255
        movwf   dtime
delay_loop
      movlw   0FFh
      movwf   smalld
small_loop

      movlw   0FFh
      movwf   vsd
vsl
        decfsz   vsd,f
        goto   vsl

        decfsz   smalld,f
        goto   small_loop

      bcf   STATUS,RP0
        decfsz   dtime,f
        goto   delay_loop
        return


main
        movlw   80h
      banksel OPTION_REG
        movwf   OPTION_REG ; bank1

      banksel WPU
        clrf   WPU  ;21 ;???
      movlw   37h
      movwf   WPU

      banksel TRISIO
      clrf    TRISIO ; bank1
      ;GP1 - input, the rest output. GP3 - always input
      bsf      TRISIO, GP1 ; bank1

        IFNDEF __12F629
           clrf   ANSEL, 0 ;bank 1
        ENDIF

   IFNDEF   DISABLE_INT
      banksel IOC
      ;Enable interrupt on change for port 1:  00010
      bsf      IOC, GP1  ; bank 1
   ENDIF

      banksel GPIO
        ;movlw   1
        movlw   0
        bcf      STATUS, RP0    ; 3,5
        movwf   GPIO   ;bank 0

      banksel CMCON
        movlw   7
        movwf   CMCON  ; bank 0

   IFNDEF   DISABLE_INT
      banksel INTCON
      clrf   INTCON ; 11   ;volatile
      bsf      INTCON, GIE
      bsf      INTCON, GPIE
   ENDIF

      banksel   pdelay
      movlw   2
      movwf   pdelay

        bcf      STATUS, RP0    ; 3,5
      movlw   04h ;; 0000 0100
      movwf   color

        ;movlw   -2
        ;movlw   FE
        ;bsf      STATUS,RP0 ; 3,5
        ;movwf   GPIO

main_loop
   banksel   GPIO
   movlw   04h
   btfsc   GPIO, GP1
   movlw   01h
   movwf   color

      bcf      STATUS, RP0    ; 3,5
   movf   color,W
   iorwf   GPIO

   ;movlw   1
   movf   pdelay,w
   call delay

      bcf      STATUS, RP0    ; 3,5
   ;clear bit in color
   comf   color,W
   andwf   GPIO,F

   ;movlw   1
   movf   pdelay,w
   call delay

      goto   main_loop

end

Автор:  ji4ka [ Съб Яну 23, 2010 3:24 am ]
Заглавие: 

Проследи си кода стъпка по стъпка в симулатора, не е чак толкова сложно.

Автор:  npelov [ Съб Яну 23, 2010 11:27 am ]
Заглавие: 

а как да сетна порт в симулатора? нещо не го намерих.
И как да видя стойност на някои регистър или акомулатора

Автор:  npelov [ Съб Яну 23, 2010 12:32 pm ]
Заглавие: 

Намерих го. Трасирах програмата - GP1 е винаги 0 и color е винаги 04h. Което е тъпо защото GP1 има weak pull-up и трябва да е 1

Автор:  npelov [ Съб Яну 23, 2010 12:39 pm ]
Заглавие: 

Ок. Открих проблема. Така е като не гледам. Приемам на доверие че 1 разрешава и 0 забранява. А weak pull-ups се забраняват с 1 в OPTION_REG. Инициализирах OPTION_REG с 00h и всичко се оправи.

Без pull-up порта е хубав random генератор :D

Автор:  ji4ka [ Съб Яну 23, 2010 6:07 pm ]
Заглавие: 

npelov написа:
а как да сетна порт в симулатора? нещо не го намерих.
И как да видя стойност на някои регистър или акомулатора


В MPLAB-a View/Watch - и там с десен бутон задаваш какво искаш да гледаш, може и да променяш стойности... Сигурно си го намерил. По принцип периферията не се симулира напълно и се налага ръчно да си въвеждаш някои стойности. А пул-ъп/даун може да се симулира и с външен резистор към захранване в схемата.
Както виждаш пик-а много внимателно те слуша, но ти какво му говориш е друг въпрос. :wink:

Автор:  npelov [ Съб Яну 23, 2010 9:50 pm ]
Заглавие: 

Прав си. ПИК-а слуша добре. Обаче симулатора хич го няма.

Цитат:
По принцип периферията не се симулира напълно и се налага ръчно да си въвеждаш някои стойности.

Ами като променя някой бит от GPIO ми го връща обратно независимо дали е вход или изход.
Предполагам че нещо се прави с View->SFR/Peripherals, но то ми е неактивно.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/