Zliczanie impulsów przez LPC1768

Witam, mam problem z wykorzystaniem wejścia CAP w LPC1768 do zliczania impulsów - pomiaru częstotliwości. Zapewne podobnie jest sprawa rozwiązana w innych LPC np serii 2xxx więc znających się na ARMach z NXP proszę o pomoc. Otóż zamierzam wykorzystać wejście P0.24 skonfigurowane jako CAP3.1 do popędzania Timera3. Konfiguruję ten Timer

const unsigned long TCR_COUNT_RESET = 2, TCR_COUNT_ENABLE = 0x01;

LPC_SC->PCONP |= (1 << 23); LPC_TIM3->CCR &= ~(0x0); LPC_TIM3->TCR = TCR_COUNT_RESET; LPC_TIM3->CTCR = 0x101; LPC_TIM3->TCR = TCR_COUNT_ENABLE;

Czyli kolejno załączam power dla timer3, ustawiam wszystkie bity compare na zero gdy pracuje jako counter, resetuję timer, ustawiam w CTCR rodzaj zbocza rosnący (bity 1,0) i wybór źródła na CAPx.1 (bity 3,2) , startuję timer. Z kolei w konfiguracji portów wstawiam:

LPC_PINCON->PINSEL1 |= (1<<17)|(1<<16);//set pin P0.24 as CAP3.1 LPC_GPIO0->FIODIR &=~(1<<24);// set pin P0.24 as input

Ta druga linia to dodatkowo bo raczej nie powinna mieć znaczenia. No i w ulCount4=LPC_TIM3->TC; nic się nie dzieje. Cały czas zero. Gdy przeprogramuję timer na napędzany z PCLK to sobie zlicza sygnał z wewnętrznego zegara. Z kolei port jest dobry bo po przestawieniu pinu P0.24 na GPIO

LPC_PINCON->PINSEL1 &= ~(1 << 17) | (1 << 16); // set pin P0.24 as GPIO

mogę zmiany jego stanu zliczać w pętli głównej. Ale ja muszę to zrobić na timerze. Any suggestions? Jakiś rejestr trzeba by jeszcze ustawić?

Reply to
Mario
Loading thread data ...

W dniu 2010-08-18 17:00 Mario napisał(a):

Gdzieś Ty wynalazł taki zapis? Teraz w szkołach tak uczą? Po pierwsze wystarczyłoby napisać: ~0 zamiast potworka ~(0x0) ale i tak operacja AND z wartością ~0 nie zmieni wyniku. Na pewno o to chodziło?

Reply to
Adam Dybkowski

Nie wiem, jak we współczesnych zabawkach ale dawniej takiej operacji używało się do ustawienia flag...

Reply to
RoMan Mandziejewicz

W dniu 2010-08-18 22:52, Adam Dybkowski pisze:

To akurat powstało jako efekt kolejnych eksperymentów z ustawieniami &=~(0x111000) i &=~(0x111) które miały się zakończyć zerowaniem wszystkiego &=0 ale mi pozostała negacja. W sumie to i tak błędny zapis bo ustawiał starsze bity rejestru na 1 a program nie powinien ich ustawiać. W sumie to ten rejest CCR to już tak z desperacji ( po wielu godzinach walki) ruszyłem bo difoltowo jest ustawiany na zero czyli tak jak manual wymaga w przypadku stosowania wejścia CAP jako wejście licznika. Poprawienien tego teraz nie zmieniło nic na lepsze :(

W sumie z dokumentacji mi wychodzi że liczy się rejest CTCR - tam wybieram że sygnałem napędzającym licznik jest pin CAP3.x a nie wewnętrzny zegar z preskalerem. No i rejestr PINSEL ustawiający ten pin na funkję CAP3.1 Ale może jeszcze coś gdzieś trzeba uatawić a jakoś nie mogę doczytać. W examplach znajduję jedynie przykłady pracy tych wejść jako capture.

A co do zapisu to stosuję właśnie taki np LPC_GPIO0->FIODIR &=~(1<<24); po to żeby wyzerować jakiś bit w długim rejestrze.

I nie wiem czego teraz w szkołach uczą. Ja jestem dość wiekowy rzeźbiarz asemblerowy który przeniósł się ostatnio na c.

Reply to
Mario

W dniu 2010-08-18 17:00, Mario pisze:

Problem rozwiązany dzięki pomocy na zagranicznym forum. Pomieszałem w głowie biny z hexami. powinno być: LPC_TIM3->CTCR = 0x5;

Reply to
Mario

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.