Отговори на тема  [ 7 мнения ] 
Weak Pull-up 
Автор Съобщение
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Пет Яну 22, 2010 5:46 pm
Мнения: 680
Мнение 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


Съб Яну 23, 2010 3:05 am
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Фев 01, 2007 4:04 am
Мнения: 1539
Мнение 
Проследи си кода стъпка по стъпка в симулатора, не е чак толкова сложно.


Съб Яну 23, 2010 3:24 am
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Пет Яну 22, 2010 5:46 pm
Мнения: 680
Мнение 
а как да сетна порт в симулатора? нещо не го намерих.
И как да видя стойност на някои регистър или акомулатора


Съб Яну 23, 2010 11:27 am
Профил WWW
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Пет Яну 22, 2010 5:46 pm
Мнения: 680
Мнение 
Намерих го. Трасирах програмата - GP1 е винаги 0 и color е винаги 04h. Което е тъпо защото GP1 има weak pull-up и трябва да е 1


Съб Яну 23, 2010 12:32 pm
Профил WWW
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Пет Яну 22, 2010 5:46 pm
Мнения: 680
Мнение 
Ок. Открих проблема. Така е като не гледам. Приемам на доверие че 1 разрешава и 0 забранява. А weak pull-ups се забраняват с 1 в OPTION_REG. Инициализирах OPTION_REG с 00h и всичко се оправи.

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


Съб Яну 23, 2010 12:39 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Фев 01, 2007 4:04 am
Мнения: 1539
Мнение 
npelov написа:
а как да сетна порт в симулатора? нещо не го намерих.
И как да видя стойност на някои регистър или акомулатора


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


Съб Яну 23, 2010 6:07 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Пет Яну 22, 2010 5:46 pm
Мнения: 680
Мнение 
Прав си. ПИК-а слуша добре. Обаче симулатора хич го няма.

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

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


Съб Яну 23, 2010 9:50 pm
Профил WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 7 мнения ] 

Кой е на линия

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


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

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