Отговори на тема  [ 13 мнения ] 
CCP / capture 
Автор Съобщение
Ранг: Почетен член
Ранг: Почетен член

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


_________________
PIC SPBRG values calculator


Сря Сеп 07, 2011 9:30 pm
Профил WWW
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Пет Яну 22, 2010 5:46 pm
Мнения: 680
Мнение Re: CCP / capture
хмм. може и да бъркам. CCPR2 май се ъпдейтват всеки път, но с едни и същи стойности - извеждам и тях и стойността на TMR1 -> TMR1L/H си е наред, CCPR2 - една и съща стойност.

_________________
PIC SPBRG values calculator


Сря Сеп 07, 2011 10:14 pm
Профил WWW
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Фев 20, 2005 4:17 am
Мнения: 33
Мнение 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


Чет Сеп 08, 2011 10:27 am
Профил
Ранг: Почетен член
Ранг: Почетен член

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

_________________
PIC SPBRG values calculator


Чет Сеп 08, 2011 11:49 am
Профил WWW
Ранг: Почетен член
Ранг: Почетен член

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

_________________
PIC SPBRG values calculator


Чет Сеп 08, 2011 4:55 pm
Профил WWW
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Пет Яну 22, 2010 5:46 pm
Мнения: 680
Мнение Re: CCP / capture
направих отделна по-проста програма за да съм сигурен че останалия код не прецаква нещо. Няма прекъсвания и т.н. (глобалните прекъсвания са забранени). Ако някой е мераклия - да хвърли един поглед. Струва ми се че нещо мсу-то се е прецакало. Вече правих същото на един pic16 - не е голяма философия...


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

_________________
PIC SPBRG values calculator
Чет Сеп 08, 2011 9:59 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение 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 ...


Пет Сеп 09, 2011 11:55 am
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Пет Яну 22, 2010 5:46 pm
Мнения: 680
Мнение Re: CCP / capture
Ще го пробвам тази вечер, но аз го четох много пъти и има само един асинхронен режим и той е свързан с външен сигнал, не със собствения генератор:
"must be running in Timer mode or Synchronized Counter mode" - в случая аз ползвам timer mode
Все си мислех че съм го сетнал за всеки случай, но може и да не съм.

_________________
PIC SPBRG values calculator


Пет Сеп 09, 2011 5:35 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение Re: CCP / capture
Точно че си го сетнал и става async...

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


Пет Сеп 09, 2011 5:57 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член

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

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

_________________
PIC SPBRG values calculator


Пет Сеп 09, 2011 8:36 pm
Профил WWW
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Пет Яну 22, 2010 5:46 pm
Мнения: 680
Мнение Re: CCP / capture
мам*а му! тръгна!!! изчистил съм бита в грешния файл. Прав беше. Все пак описанието на микрочип е доста объркващо

_________________
PIC SPBRG values calculator


Пет Сеп 09, 2011 8:46 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение Re: CCP / capture
Той run-а няма нищо общо с тва от де взема такта - в смисъл т1(и т3 където го има) има два източника - външен и вътрешен. Вътрешния винаги е синхронизиран така или иначе. А щом е външен вече е counter и е sync и async. Пък вече самия осцилатор си е съвсем отделен модул - ти можеш и да не ползваш неговия осцилатор а някъв друг източник на импулси. А каква е идеята кепчъра да не работи в асинхронен режим идея си нямам.

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


Пет Сеп 09, 2011 11:38 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Пет Яну 22, 2010 5:46 pm
Мнения: 680
Мнение Re: CCP / capture
да, като се замислиш синхронизацията трябва когато честотата е различна от системната ... Ами мерси. Още една бира имаш... скоро ще станат много :)

_________________
PIC SPBRG values calculator


Съб Сеп 10, 2011 8:32 am
Профил WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 13 мнения ] 

Кой е на линия

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


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

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