Всичко свързано с тоците ми е слабост, опитайте се да ме затрудните.
lenko71 - специалист
SuB^ZerO написа:
btfss би трябвало да прескочи следващата инструкция ако бит T0IF е "1"
Ами няма как да е "1" при проверката, при положение че с предната инструкция си го нулирал.
Неслучайно цитирах и трите места, където си ползвал проверката на T0IF. Предполагам и в трите случая идеята е да се изчаква някакво време. Ако е така направи го както в първия случай.
Иначе като вариант бих ти препоръчал да ползваш прекъсване (на TMR0). Прочети как става, пробвай, ако нещо не върви питай.
"if, elseif..." може да ползваш ако пишеш на някакво C или Basic. В MPASM не може.
SuB^ZerO - специалист
Както ме посъветва прочетох за TMR0.Успях да изляза от ШИМ генератора и да се върна към основната програма и сега се изпълнява всичко от главната програма main (която се наложи да попроменя), но времето за което моторчето се върти със скорост 50% е много малко и не успявам да го променя ... ето каква е логиката ми :
pwm50 ;начало на подпрограмата която осъществява ШИМ
....
....
....
....
pwmb50 nop
nop
nop
decfsz temp ;temp = temp-1 . temp=0 ?
goto pwmb50 ;НЕ - изпъни отново
;ДА - прескочи "goto pwmb50f"

btfss INTCON,T0IF ;бит T0IF=1???
goto pwm50 ;НЕ - върни се в началото на подпрограмата
decfsz cou ;ДА - намали cou с 1. cou=0 ?
goto pwm50 ;НЕ - върни се в началото на подпрограмата
return ;ДА - върни се към главната програма
т.е. следя за препълване на TMR0 , като проверявам бит T0IF дали е 1 или 0.Препълването би трябвало да отнеме около 43ms (поне толкова го сметнах но точното време не е от значение) т.е. T0IF става 1 и тогава намалям брояча (cou) с 1 , като същевременно проверявам дали брояча не е стигнал до 0 и когато това стане се връщам към главната програма. Следователно ако cou e 100 трябва да се върна към главната програма след 100 x 43ms = 4,3 секунди , а при мен се получава време от около 1 секунда (дори когато направя cou = 255).

Ето и main където нулирам TMR0 и бит T0IF преди да извикам подпрограма pwm50:
main call pwm100f
call WaitP

clrf TMR0
bcf INTCON,T0IF
call pwm50
call WaitP

call pwm100b
call WaitP

clrf TMR0
bcf INTCON,T0IF
bsf portb,2
call pwm50
bcf portb,2
call WaitP

goto main
Къде ми е грешката ?
SuB^ZerO - специалист
Намерих си грешката и съм готов с проекта :-D Много благодаря за помощта :prayer:
Ето и кодът ако някой се интересува :
list p=16F84A
#include <p16F84A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

w EQU 0
f EQU 1
portb equ 0x06 ; port b equate
Counter EQU 0x0c
duty equ 0x0d ; length of duty cycle
temp equ 0x0e ; length of duty cycle
cou equ 0x0f


ORG H'0000'
goto start

start movlw d'100'
movwf cou
bsf STATUS,RP0
movlw B'11010111'
movwf OPTION_REG
bcf STATUS,RP0
clrf PORTB
bsf STATUS,RP0
movlw B'11111000'
movwf TRISB
bcf STATUS,RP0
goto main
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;deley for the pause between subroutines
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WaitP movlw D'50'
movwf Counter
clrf TMR0
againP bcf INTCON,T0IF
loopP btfss INTCON,T0IF
goto loopP
decfsz Counter,f
goto againP
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;delay for the time of Action on pwm100b and pwm100f
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WaitA movlw D'70'
movwf Counter
clrf TMR0
againA bcf INTCON,T0IF
loopA btfss INTCON,T0IF
goto loopA
decfsz Counter,f
goto againA
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;pwm 50% speed
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
pwm50 movlw d'0'
movwf portb
movlw d'90'
movwf duty
movf duty,w
movwf temp
bsf portb,0
bsf portb,1
pwma50 nop
nop
nop
decfsz temp
goto pwma50
movlw d'255'
movwf temp
movf duty,w
subwf temp,f
bcf portb,0
bcf portb,1

pwmb50 nop
nop
nop
decfsz temp ;temp = temp-1 . temp=0 ?
goto pwmb50 ;НЕ - изпъни отново
;ДА - прескочи "goto pwmb50f"

btfss INTCON,T0IF ;бит T0IF=1???
goto pwm50 ;НЕ - върни се в началото на подпрограмата
decfsz cou ;ДА - намали cou с 1. cou=0 ?
goto t0clr ;НЕ - върни се в началото на подпрограмата
return ;ДА - върни се към главната програма

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;t0clr - нулиране на бит T0IF на TMR0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
t0clr bcf INTCON,T0IF
goto pwm50

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;pwm 100% forward
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
pwm100f bsf portb,0
bsf portb,1
call WaitA
bcf portb,0
bcf portb,1
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;pwm 100% backward
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
pwm100b bsf portb,0
bsf portb,1
bsf portb,2
call WaitA
bcf portb,0
bcf portb,1
bcf portb,2
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
main call pwm100f
call WaitP

movlw d'100'
movwf cou
clrf TMR0
bcf INTCON,T0IF
call pwm50
call WaitP

call pwm100b
call WaitP

movlw d'100'
movwf cou
clrf TMR0
bcf INTCON,T0IF
bsf portb,2
call pwm50
bcf portb,2
call WaitP

goto main

END
MrMurdjo - майстор
=D> И от мен.
Отсъствах тези дни и съм пропуснал развитието на темата, но както виждам, има успех. Също така съм сигурен, че имаш поне две идеи как програмата може да се подобри :)

Тема "Моля за помощ PIC16F84A (Микроконтролери и асемблер)" | Включи се в дискусията:


Сподели форума:

Бъди информиран. Следвай "Направи сам" във Facebook:

Намери изпълнител и вдъхновения за дома. Следвай MaistorPlus във Facebook: