Atmel AVR: Wywolywanie funkcji co pewien czas

Feb 04, 2004 5 Replies

Witam,



Chcialbym wykonac pewna aplikacje. Codzi o to, aby procesor podawal na kilku bitach wyjsciowych rozne dane. Rzecz w tym, ze dane te maja pojawiac sie co pewien, scisle okreslony czas



-- np. co 1 sekunde, albo co 1/10 sek, albo np. co 1/100 sek.



Najdogodniej byloby, gdyby co np.



1/10 sekundy uruchamiala sie funkcja obslugi jakiegos przerwania, w ktorej zmienialbym stan wyjsc wg. pewnego algorytmu.

Moj problem polega na tym, ze nie wiem jak najlepiej rozwiazac problem taktowania wywolywania mojej funkcji. Zapewne nalezy skorzystac z jednego z Timerow. Pytanie, z ktorego i w jakim trybie? Czy da sie wykonac moje zadanie bez zewnetrzengo generatora? Moj procesor to AT90S8535.



Z gory dziekuje za odpowiedzi, Trix.



Kwarc 8Mhz

1/10 sek: TCNT1L=0x2C TCNT1H=0xCF TCRR1B=0x03 - start timera T1 z preskalerem=64 TCRR1B=0x00 - stop timera pamietaj o zalaczeniu obslugi przerwan (sei) w obslusze przerwania timera T1 wywolaj jaka chcesz funkcje Pzdr Michal

U¿ytkownik "Trix" snipped-for-privacy@KochamSPAMpolbox.com napisa³ w wiadomo¶ci news:bvrtm7$hh6$ snipped-for-privacy@atlantis.news.tpi.pl...

Dzieki za odpowiedz. A czy nie mozna obejsc sie bez zewnetrznego kwarcu? Z czego wynika to, ze nie znalazlem zadnej aplikacji tego typu, ktora korzysta z taktowania wewnetrznego? Czy chodzi tu np. o dryfty temperaturowe (zdaje sie, ze wewnetrzne taktowanie odbywa sie za pomoca ukladu RC), czy moze o niemoznosc ustawienia dokladnie czestotliwosci 1Hz, itp.?

Trix.

Użytkownik Trix napisał:

Bo po prostu twój 8535 nie ma taktowania wewnętrznego.

Jesli szukasz jakiegos proca z wewnetrznym oscylatorem to jest nim np ATmega8. Goraco polecam noty katalogowe AVRow znajdujace sie na stronie Atmela

formatting link

1Hz? Chyba nik nie taktuje procesora z taka czestotliwoscia, bo po co. Napisz co chcesz zrobic. Moze jest inne rozwiazanie twojego problemu. Pzdr Michal

Na wstepie pragne podziekowac za odpowiedzi.

Przypominam co chce uzyskac. Chodzi mi o napisanie programu dla AVR AT90S8535, w ktorym pewna funkcja (obslugi przerwania) bylaby wywolywana co pewien czas -- potrzebuje uzyskac wywolywanie mojej funkcji co 0.1 sekundy albo 1 sekunde, moze okaze sie niezbedne wywolywanie funkcji co 0.01 sek.

Mam .pdf "AVR130: Setup and Use the AVR Timers". Na stronie 8 mamy: "Example - Timer0 Overflow Interrupt". Oto kod: void init_Ex1(void) { TCCR0 = (1<<CS02) | (1<<CS00); // Timer clock = system clock / 1024 TIFR = 1<<TOV0; // Clear TOV0 / clear pending interrupts TIMSK = 1<<TOIE0; // Enable Timer 0, Overflow Interrupt DDRB = 0xFF; // Set Port B as output }

void interrupt [TIMER0_0VF0_vect] ISR_TOV0 (void) { PORTB = ~PORTB; }

Do portu B podlaczamy diody LED. Przy 8-bitowym timerze 0 (MaxVal=256). CK=3.69Mhz. PVal = 1024, stad czestotliwosc migania diod fLED=CK/(2*Pval*MaxVal) = okolo 7Hz.

Inny przyklad z tego .pdf ze strony 12 wykorzystuje 8-bitowy timer2 i kwarc. W tym przykladzie, mozna migac diodami z czestotliwoscia np. 1Hz. Czy da sie sterowac diodami (chodzi o wywolywanie funkcji obslugi przerwania z okreslona czestotliwoscia) z czestotliwoscia 1Hz wykorzystujac timer0? Jesli nie, to z czego to wynika? Czy chodzi o to, ze wartosc CK=3.69Mhz, MaxVal=256 i dostepne wartosci Pval sprawiaja, ze podstawiajac do wzoru CK/(2*Pval*MaxVal) nie da sie uzyskac wartosci rzedu 0.1Hz, 1Hz ? Sterowanie z timera0 (tak jak w przytoczonym kodzie) byloby dla mnie o tyle dogodniejsze, ze nie wymagany bylby kwarc. Chcialbym tez zrozumiec czy z timera0 (bez kwarcu) mozna uzyskac czestotliwosc 1Hz, tak jak z timera2 z kwarcem. Z tego wzgledu, bylbym niezmiernie wdzieczny za uswiadomienie.

Z gory dziekuje za odpowiedzi, Trix.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required