Atmel AVR: Wywolywanie funkcji co pewien czas

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.

Reply to
Trix
Loading thread data ...

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.

Reply to
Trix

Użytkownik Trix napisał:

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

Reply to
zenek

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
Reply to
reff

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.

Reply to
Trix

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.