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

Проблем: програмата ми се стартира отново и отново
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=5554
Страница 1 от 1

Автор:  dan [ Чет Мар 06, 2008 7:48 pm ]
Заглавие:  Проблем: програмата ми се стартира отново и отново

Здравейте!
Проблема ми е следния:
искам да направя плавно тръгване на постояннотоков двигател, като за целта използвам pwm модула на pic16f684. Постепенно увеличавам коефициента на запълване на импулса, достигам пълна мощност, но не мога да накарам изхода да стане '1', а започва да се инкрементира отново.Проблема обаче възниква още при инициализацията на ПВМ модула. ето и кода:
Код:
   PROCESSOR   16F684
      LIST      p=16F684
      #include   <p16f684.inc>
      __CONFIG   _CP_OFF & _WDT_OFF & _MCLRE_ON & _INTOSCIO
      #define      B0   bcf STATUS,RP0;izbor na banka 0
      #define      B1   bsf STATUS,RP0;izbor na banka 1
   
W         EQU   0
F         EQU   1
DUTY   EQU     20H
CIKYL   EQU     21H      
CIKYL1   EQU     22H
   ORG H'00'
   GOTO   START
START

   B0
   CLRF PORTC ;Init PORTC
   MOVLW 07h ;Set RC<4,1:0> to
   MOVWF CMCON0 ;digital I/O
   B1
   CLRF ANSEL ;digital I/O
   MOVLW 00H ;Set RC<3:2> as OUT
   MOVWF TRISC
   B0
   BSF   PORTC,5
   B1
   BCF   OPTION_REG,5;TMR0 INTERNAL CLOCK
   BCF   OPTION_REG,7;PULL-UPS ENABLED

   BCF   OPTION_REG,3;PRESCALER ASS. TO TMR0

   BSF   OPTION_REG,0;PRESCALER=256
   BSF   OPTION_REG,1
   BCF   OPTION_REG,2

   GOTO   MAIN


SETUP_PWM   B1
         BSF      TRISC,5
         MOVLW   D'199'   ;
         MOVWF   PR2      ;2
         MOVLW   B'00001110';PWM ACTIV-LOW, DUTY'S LSbits=0
         B0
         MOVWF   CCP1CON   ;3
         ;4
         MOVLW   D'25'      ;PRIMERNA NA4ALNA STOJNOST
         MOVWF   CCPR1L      
      
         BCF      PIR1, TMR2IF;5.1
         BCF      T2CON,T2CKPS0;5.2
         BCF      T2CON,T2CKPS1;5.2
         BSF      T2CON,TMR2ON;5.3
      
   CHAKAJ   BTFSS   PIR1,1;4AKAME TAJMERA DA SE NAPYLNI
         GOTO   CHAKAJ
         B1
         BCF      TRISC,5;SET PWM OUTPUT

         RETURN
MAIN


      CALL   SETUP_PWM;

      B0
      CLRF   CCP1CON
      NOP
      B1
      BCF      TRISC,5
      BCF      ANSEL,5
      B0
      BCF      PORTC,5
   END

Ще съм много благодарен за всяка помощ. :)

Автор:  ji4ka [ Пет Мар 07, 2008 2:58 am ]
Заглавие: 

Нямаш край на MAIN. Тури едно goto $-1 преди END. Това END е директива на асемблера (компилатора.).

Автор:  dan [ Пет Мар 07, 2008 11:41 am ]
Заглавие: 

@ji4ka:
Благодаря за отговора.
А защо да не напиша goto $ ? С goto $-1 ще се изпълнява последната инструкция постоянно, нали?

Автор:  ji4ka [ Пет Мар 07, 2008 9:59 pm ]
Заглавие: 

Няма значение - важно е да зацикли програмата на място защото иначе програмния брояч си нараства и като стигне края на паметта започва отначало.

Автор:  Ки4о [ Пет Мар 07, 2008 10:32 pm ]
Заглавие: 

Като не искаш да ти се изпълнява последната инструкция,т.е да влезеш в празен цикъл:
B0
BCF PORTC,5
NOP
NOP
goto $-1
END

Автор:  stanleyhacker [ Пон Мар 10, 2008 11:53 am ]
Заглавие: 

goto $-1 не изпълнява последната инструкция, а пак отива на него.

Автор:  Ugeen [ Пон Мар 10, 2008 11:02 pm ]
Заглавие: 

Не знам как ти работи програмата без goto,а освен това таймера по принцип си работи така,брои,препълва и пак почва от начало,освен ако ти не вземеш мерки да направиш изхода си независим от него когато е стигнал края.Според мен не си си построил програмата правилно,Трябвало е да иползваш прекъсване от таймера което ти установява изхода в 1 след като PWM а е стигнал края.Провери си да не ти е включен WDT,тогава наистина ще ти се ресетва постоянно програмата.

Автор:  Cekins [ Вто Мар 11, 2008 5:10 pm ]
Заглавие: 

Най елегантното решение според мен би било :
GIE=0 (ако въобще се ползват прекъсвания)
SLEEP

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