 |
Форум за електроника Български форум за електроника, ремонти, схеми, документация
|
| Предишната тема :: Следващата тема |
| Автор |
Съобщение |
eler Опитен потребител

Регистриран на: 30 Яну 2005 Мнения: 2251 Местожителство: Раднево
|
Пуснато на: Сря Апр 14, 2010 17:47 Заглавие: Промяна на времеви интервал в сорс за PIC - РЕШЕНО |
|
|
Нужна ми е малко помощ от някой, който е на ти с асемблер. Файла със сорса е в атача. Той е за един честотомер. Така както е, времето за броене на входните импулси е 100 милисекунди. Въпросът ми е какво трябва да се промени за да стане времето на броене 640 милисекунди (при кварц на 4 MHz)? Формулата за пресмятане на броя цикли на процесора е дадена в коментари, но като не съм на ти с асемблера не мога да се ориентирам къде се задава времето за броене. Пък и се прибавя или изважда допълнително време от калибровъчни константи в EEPROM-a, също има и възможност за прибавяне или изваждане към измерената честота на честота, записана в EEPROM-a, но те не са важни, важно е как цикъла от 100 милисекунди да стане 640 милисекунди.
Последната промяна е направена от eler на Вто Апр 20, 2010 15:22; мнението е било променяно общо 1 път |
|
| Върнете се в началото |
|
 |
Ichko Опитен потребител

Регистриран на: 13 Мар 2004 Мнения: 308
|
Пуснато на: Чет Апр 15, 2010 17:57 Заглавие: |
|
|
Аз също съм доста зле с асемблера, но в моя случай много ми помогна това тук: http://nmarov.narod.ru/pause.htm _________________ Интелектът на Земята е константа, а населението непрекъснато расте! |
|
| Върнете се в началото |
|
 |
eler Опитен потребител

Регистриран на: 30 Яну 2005 Мнения: 2251 Местожителство: Раднево
|
Пуснато на: Чет Апр 15, 2010 18:47 Заглавие: |
|
|
Ще я разгледам програмката. Само дето в моя случай времето се задава от няколко цикъла, в които участват едни променливи. И стигам до извода, че промяна на времето може да стане с промяна на стойностите при дефиниране на променливите. Ей тук май се формира времето:
| Код: | ; ------------------------------------------------------------------------
; Start measurement: RA3 + RA4 set input
; ------------------------------------------------------------------------
movlw b'00010000' ; all ports set L, RA4 set H
movwf PORTA
bsf STATUS,RP0
movlw b'00011111' ; RA0..RA4 input
movwf TRISA
bcf STATUS,RP0
; -------------------------------------------------------------------------
; It is opened now...
; -------------------------------------------------------------------------
Cycle btfss INTCON,2 ; 1 Test for TMR0 overflow
goto Nothing ; 3
incf TimerH,F ; 3
bcf INTCON,2 ; 4
goto Nxt ; 6
Nothing nop ; 4
nop ; 5
nop ; 6
Nxt decfsz R1,F ; 7
goto Cycle ; 9
movlw T1 ; 9*T1
movwf R1 ; 9*T1+1
decfsz R2,F ; 9*T1+2
goto Cycle ; 9*T1+4
movlw T2 ;(9*T1+4)*T2
movwf R2 ;(9*T1+4)*T2+1
decfsz R3,F ;(9*T1+4)*T2+2
goto Cycle ;(9*T1+4)*T2+4
; ------------------------------------------------------------------------
; Final test for TMR0 overflow
; ------------------------------------------------------------------------
movlw T4 ;((9*T1+4)*T2+4)*T3
movwf Help ;((9*T1+4)*T2+4)*T3+1
Cycle2 btfss INTCON,2 ; 1
goto Not2Do ; 3
incf TimerH,F ; 3
bcf INTCON,2 ; 4
goto Nx ; 6
Not2Do nop ; 4
nop ; 5
nop ; 6
Nx decfsz Help,F ; 7
goto Cycle2 ; 9
; nop ; ((9*T1+4)*T2+4)*T3+1+9*T4+Z
; nop ; Z times fine tuning nops
;-------------------------------------------------------------------------
; Fine tuning loops set by EEPROM parameters
;-------------------------------------------------------------------------
movf EE_Fine1,0
movwf Help
LCycleFine1 decfsz Help,F ; 1 Fine tuning loop 1 set by EEPROM
goto LCycleFine1 ; 3
movf EE_Fine2,0
movwf Help
LCycleFine2
nop ; 1
decfsz Help,F ; 2 Fine tuning loop 2 set by EEPROM
goto LCycleFine2 ; 4
; ------------------------------------------------------------------------
; Stop the measurement
; ------------------------------------------------------------------------ |
На променливите T1, T2, T3 и T4 тук се присвояват стойности:
| Код: | ; ------------------------------------------------------------------------
; timing loop values
; must be from 1 to 255!!!
T1 equ .199 ; first timing loop
T2 equ .11 ; second timing loop
T3 equ .5 ; third timing loop
T4 equ .130 ; last timing loop
; ------------------------------------------------------------------------ |
и с промяна цифрите ще се промени времето, но не съм сигурен. |
|
| Върнете се в началото |
|
 |
ELP Опитен потребител

Регистриран на: 07 Яну 2004 Мнения: 6933 Местожителство: София
|
Пуснато на: Чет Апр 15, 2010 19:09 Заглавие: |
|
|
| Ако искаш да го увеличиш 6,4 пъти ,май излизаш извън границата от 255 ? Поне първото и последното време . |
|
| Върнете се в началото |
|
 |
Ichko Опитен потребител

Регистриран на: 13 Мар 2004 Мнения: 308
|
Пуснато на: Чет Апр 15, 2010 19:27 Заглавие: |
|
|
Според калкулатора тези стойности дават времезадръжка от 6510553984 машинни цикъла. При 4 MHz кварц това (ако не граша в сметките) е около 2 часа _________________ Интелектът на Земята е константа, а населението непрекъснато расте! |
|
| Върнете се в началото |
|
 |
eler Опитен потребител

Регистриран на: 30 Яну 2005 Мнения: 2251 Местожителство: Раднево
|
Пуснато на: Чет Апр 15, 2010 21:18 Заглавие: |
|
|
Това е обяснението как се смята времето:
| Код: | ; ------------------------------------------------------------------------
;
; The measuring period is 100 000 us.
; Procesor cycle is T = 4/Fx [us,MHz], Fx is Xtal frequency
;
; Number of processor cycles per measuring period:
;
; N = 100 000/T processor cycles
; N = Fx * 100 000/4 = 25 000 x Fx
;
; The main steps of measuring period:
;
; 1. decode 3-byte value into 7 decimal numbers,
; 2. decode decimal value of digit to chars,
; 3. set decimal point if needed,
; 4. output to PORTB (LCD) either 6 or 7 digits,
; 5. start measurement,
; 6. test TMR0 overflow bite, if YES increase TimerH,
; 7. goto 5 until measuring period is done,
; 8. stop measurement,
; 9. shift out precounter content,
; 10. Add/substract RF according signal from optocoupler,
; 11. goto 1
;
; ------------------------------------------------------------------------
; Total timing formula: N = 25 000 * Fx = ((9*T1+4)*T2+4)*T3+5+9*T4+Z
;
; N = 25 000 * Fx [MHz]
;
; Example: Fx = 4 MHz
;
; N = 25 000 * 4 = 100 000
; N = 25 000 * Fx = ((9*T1+4)*T2+4)*T3+5+9*T4+Z |
Направих си един Excel-ски файл с формулата и като задавам различни стойности на променливите дава съвсем реални времена. За 640 mS се получи:
T1 202
T2 35
T3 10
T4 242
Само дето не съм сигурен дали ще стане така, но някой ден ще пробвам. В момента с този сорс работи един честотомер и си мери съвсем точно и при промяна на честотата индикацията на дисплея се променя почти моментално. Значи наистина времето за броене е 100 mS както е написано в коментарите. |
|
| Върнете се в началото |
|
 |
eler Опитен потребител

Регистриран на: 30 Яну 2005 Мнения: 2251 Местожителство: Раднево
|
Пуснато на: Вто Апр 20, 2010 15:28 Заглавие: |
|
|
| Стана с промяната на стойностите на T1, T2, T3 и T4. Само дето само смятане по формулата не дава много точен резултат и се налага опитно донагласяне. |
|
| Върнете се в началото |
|
 |
|
|
Не Можете да пускате нови теми Не Можете да отговаряте на темите Не Можете да променяте съобщенията си Не Можете да изтривате съобщенията си Не Можете да гласувате в анкети
|
|