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

CCP / capture
http://mcu-bg.com/mcu_site/viewtopic.php?f=2&t=9325
Страница 1 от 1

Автор:  npelov [ Сря Сеп 07, 2011 9:30 pm ]
Заглавие:  CCP / capture

Процесора е PIC18F45J10. Опитвам се да подкарам IR приемник с CCP2 модула в capture режим. Прекъсване се случва, но CCPR2L/H остават непроменени. Е, не точно. Копира първия път - при пускане на модула и таймер 1, което не е чак толкова невъзможно - ако пина е бил 0 - нормалното положение на IR приемника е 1 -> копира се. Проблема е обаче, че след това тази стойност си остава същата и не се променя изобщо. Трасирах го и с PICKIT2 - сложих брекпоинт на прекъсването - прекъсване има като като подам сигнал с дистанционното, стойността на CCPR2 не се променя ... изобщо.
Опитах какво ли не - спирах прекъсването на Т1, сетнах входовете на цифрови с movlw 0x0F; movwf ADCON1, спирах прекъсването на CCP2 или байпасвах кода, стойността си остава същата в CCPR2. Вътре в прекъсването на CCP сменям фронта на импулса така:

Код:
setCcpCon   macro   value
   clrf   CCP2CON
   movlw   value
   movwf   CCP2CON
   endm
....
   setCcpCon   0x04 ;  falling edge
   setCcpCon   0x05 ;  rising edge


както е указано в даташита, макар че като не пипам прескалъра не би трябвало да е необходимо:

Целия код е много за да се постне. Все пак на теория няма какво да спре CCPR регистъра да се ъпдейтва, ако прекъсването се случва ... или поне така си мисля.

edit - конфигурацията:

Код:
#define CCP2_ALT

   CONFIG   XINST  = OFF   ; extended instruction set disabled
   CONFIG   STVREN = ON
   CONFIG   CP0 = OFF   ;Program memory is not code-protected
   CONFIG   FOSC = HS

#ifdef   START_IN_INTRC
   CONFIG   FOSC2 = OFF   ; INTRC enabled as system clock when OSCCON<1:0> = 00
#else
   CONFIG   FOSC2 = ON   ; Clock selected by FOSC as system clock is enabled when OSCCON<1:0> = 00
#endif

   CONFIG   FCMEN = OFF
   CONFIG   IESO = OFF      ; Two-Speed Start-up disabled
   CONFIG   WDTEN = OFF
   ;CONFIG   WDTPS = 32768   ; 1:32768
   CONFIG   WDTPS = 64   ; 1:64 - 4*64 = 128 ms

#ifdef   CCP2_ALT
   CONFIG   CCP2MX = ALTERNATE   ; CCP2 is multiplexed with RB3
#else
   CONFIG   CCP2MX = DEFAULT   ; CCP2 is multiplexed with RC1
#endif


#define   irrCCPCON   CCP2CON
#if   irrCCPCON == CCP1CON
   #define   irrTris      TRISC
   #define   irrBit      RC2
   #define   irrPort      PORTC
   #define   irrLat      LATC
   #define   irrCCPRL   CCPR1L
   #define   irrCCPRH   CCPR1H
   #define   irrPIR      PIR1
   #define   irrPIE      PIE1
   #define   irrIPR      IPR1
   #define   irrIntBit   CCP1IE
#else
   #define   irrTris      TRISB
   #define   irrBit      RB3
   #define   irrPort   PORTB
   #define   irrLat      LATB
   #define   irrCCPRL   CCPR2L
   #define   irrCCPRH   CCPR2H
   #define   irrPIR      PIR2
   #define   irrPIE      PIE2
   #define   irrIPR      IPR2
   #define   irrIntBit   CCP2IE
#endif


Автор:  npelov [ Сря Сеп 07, 2011 10:14 pm ]
Заглавие:  Re: CCP / capture

хмм. може и да бъркам. CCPR2 май се ъпдейтват всеки път, но с едни и същи стойности - извеждам и тях и стойността на TMR1 -> TMR1L/H си е наред, CCPR2 - една и съща стойност.

Автор:  aquilax [ Чет Сеп 08, 2011 10:27 am ]
Заглавие:  Re: CCP / capture

Здрасти,мисля че не е правилна смяната на фронта

........
setCcpCon 0x04 ; falling edge
setCcpCon 0x05 ; rising edge
така винаги CCP2CON ще е 0x05.може би ще е по леснo само да сменяш бита,който ти трябва

btfss CCP2CON,0
bsf CCP2CON,0
btfsc CCP2CON,0
bcf CCP2CON,0

Автор:  npelov [ Чет Сеп 08, 2011 11:49 am ]
Заглавие:  Re: CCP / capture

Нямах в предвид, че пускам двата макроса setCcpCon 0x04 и setCcpCon 0x05 един след друг. Всъщност прекъсването е state machine и на всяко прекъсване сменям фронта.

Както и да е - аз опитах да прескоча това и в прекъсването на CCP да оставя само копирането на CCPR регистрите за да ги покажа - всеки път една и съща стойност. Имам още един таймер който цъка с 1ms - TMR0. Там чета указател към числата които трябва да покажа на дисплея ( 7 seg. LED, 4 digit). Ползвам FSR0. На теория ако FSR0 не сочи където трябва може да пренаписва съдържанието на CCPR регистрите, но на практика ми се струва невъзможно. Всеки път правя нещо подобно:

Код:
clrf FSR0H
movff displayPtr1, FSR0L
movf INDF0, w
call display


T.e. нямам цикъл и няма как да излезе извън контрол. Пък и само чета, не пиша.

Вчера опитах да направя същото с CCP1 - същата работа. Timer1 ми е с кристал 32768 кХз - т.е. не е асинхронен, което би попречило на CCP да работи правилно. Може би да се разровя в битовете, които иначе не се ползват, когато таймера работи с осцилатора си.

Ето как изглеждат настройките на 2-та таймера (включвам ги в края на файла с инициализацията):


Код:
movlf   macro   y, x
#if   x == 0
   clrf   y
#else
   movlw   x
   movwf   y
#endif
   endm

........
   ; -------- Timer0 init - display timer --------
   ; 16 MHz / 4 = 4 MHz / 4000 = 1kHz (1ms timer)
   movlf   T0CON,0x08    ; 0000 1000 16bit, no prescaller, OFF
   movlf   TMR0L, LOW(TIMER0ADD)
   movlf   TMR0H, HIGH(TIMER0ADD)
   bsf      INTCON, TMR0IF
   bsf      INTCON,   TMR0IE
   bsf      INTCON2, TMR0IP

   ; ------ Timer 1 init ------
   bcf      T1CON, TMR1ON
   movlf   TMR1H, 0x80
   movlf   TMR1L, 0x00
   bcf      PIR1, TMR1IF
   movlf   T1CON, 0x4E      ; 0100 1110
   bsf      PIE1, TMR1IE
   bcf      IPR1, TMR1IP      ; low priority

Автор:  npelov [ Чет Сеп 08, 2011 4:55 pm ]
Заглавие:  Re: CCP / capture

Открих, че числото винаги е с 1 по-голямо от стойността на таймер 1 при прекъсване. Т.е. ако не закачам таймера брои от 0 до 0xFFFF -> CCPR e 0х0001. Ако при прекъсването на таймер 1 сетвам бит 7 на старшия байт за да брои от 0x8000 до 0xFFFF (1 секунда при 32.768 кХз кварц) CCPR винаги има стойност 0x8001. т.е. стойността на таймера се копира в CCPR 1/32768 (около 30.5us) след прекъсването на таймера и само тогава. Т.е. не се копира при ccp прекъсване.

Автор:  npelov [ Чет Сеп 08, 2011 9:59 pm ]
Заглавие:  Re: CCP / capture

направих отделна по-проста програма за да съм сигурен че останалия код не прецаква нещо. Няма прекъсвания и т.н. (глобалните прекъсвания са забранени). Ако някой е мераклия - да хвърли един поглед. Струва ми се че нещо мсу-то се е прецакало. Вече правих същото на един pic16 - не е голяма философия...

Прикачени файлове:
ccptest.txt [62.17 KiB]
222 пъти

Автор:  Cekins [ Пет Сеп 09, 2011 11:55 am ]
Заглавие:  Re: CCP / capture

The timers that are to be used with the capture feature
(Timer1 and/or Timer3) must be running in Timer mode or
Synchronized Counter mode. In Asynchronous Counter
mode, the capture operation will not work.

цитат от даташита :)

ако правилно съм установил, че 0х4Е ти е контрола на Т1, там бит 2 (T1SYNC) трябва да е 0 ...

Автор:  npelov [ Пет Сеп 09, 2011 5:35 pm ]
Заглавие:  Re: CCP / capture

Ще го пробвам тази вечер, но аз го четох много пъти и има само един асинхронен режим и той е свързан с външен сигнал, не със собствения генератор:
"must be running in Timer mode or Synchronized Counter mode" - в случая аз ползвам timer mode
Все си мислех че съм го сетнал за всеки случай, но може и да не съм.

Автор:  Cekins [ Пет Сеп 09, 2011 5:57 pm ]
Заглавие:  Re: CCP / capture

Точно че си го сетнал и става async...

Аз останах с впечатление че ползваш осцилатора на таймер1 с външен кварц на 32.768 kHz. Тогава синхронизацията ти трябва да е включена (T1CON.2=0)

Автор:  npelov [ Пет Сеп 09, 2011 8:36 pm ]
Заглавие:  Re: CCP / capture

мда. хващам се като удавник за сламка. Не стана:

Код:
   ; ------ Timer 1 init ------
   bcf      T1CON, TMR1ON
   movlf   TMR1H, 0x80
   movlf   TMR1L, 0x00
   bcf      PIR1, TMR1IF
   movlf   T1CON, 0x4A      ; 0100 1010
   bsf      PIE1, TMR1IE
   bcf      IPR1, TMR1IP      ; low priority


Точно така, с външен кварц е - това е режим таймер. Ако погледнеш T1RUN на същия регистър пише, че при 1 такта се взима от Т1 осцилатора, при 0 от "друг източник" (виж TMR1CS).

Хммм ... Т1RUN е флаг. аз си мислех че така се включва таймера към собствения си генератор...

Добавка. В началото на таймер 1 пише:

Timer1 can operate in one of these modes:
Timer
Synchronous Counter
Asynchronous Counter

Т.е. ако не брои външни импулси е в режим таймер и синхронизацията няма връзка.

Автор:  npelov [ Пет Сеп 09, 2011 8:46 pm ]
Заглавие:  Re: CCP / capture

мам*а му! тръгна!!! изчистил съм бита в грешния файл. Прав беше. Все пак описанието на микрочип е доста объркващо

Автор:  Cekins [ Пет Сеп 09, 2011 11:38 pm ]
Заглавие:  Re: CCP / capture

Той run-а няма нищо общо с тва от де взема такта - в смисъл т1(и т3 където го има) има два източника - външен и вътрешен. Вътрешния винаги е синхронизиран така или иначе. А щом е външен вече е counter и е sync и async. Пък вече самия осцилатор си е съвсем отделен модул - ти можеш и да не ползваш неговия осцилатор а някъв друг източник на импулси. А каква е идеята кепчъра да не работи в асинхронен режим идея си нямам.

Ако това ти се струва объркващо, погледни на 24-ките как е :)

Автор:  npelov [ Съб Сеп 10, 2011 8:32 am ]
Заглавие:  Re: CCP / capture

да, като се замислиш синхронизацията трябва когато честотата е различна от системната ... Ами мерси. Още една бира имаш... скоро ще станат много :)

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