[BASCOM] Przerwania a program główny...

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
piotrek7700
Użytkownik
Posty: 105
Rejestracja: 09 mar 2006, 8:15
Lokalizacja: Leszczyna
Kontakt:

[BASCOM] Przerwania a program główny...

Post autor: piotrek7700 » 19 mar 2007, 15:24

chciałbym w sterowniku do przedwzmacniacza wykorzystać wewnętrzne przerwania od timera 2 (w mega 16 lub 32) . pytanie nie daje mi spać "czy jak będę się komunikował i2c, odbierał rc5, komunikował się przez 1 wire, korzystał z uart, to czy przerwanie zakończy proces nadawania czy najpierw skończy nadawać a dopiero później przejdzie do zliczenia impulsów?
pozdrawiam
Ostatnio zmieniony 01 sty 1970, 1:00 przez piotrek7700, łącznie zmieniany 1 raz.

Michał17
Użytkownik
Posty: 329
Rejestracja: 07 sty 2006, 14:25
Lokalizacja: Łódź

Post autor: Michał17 » 19 mar 2007, 17:13

Możesz na pewien czas wyłączać przerwania.

Awatar użytkownika
gaweł
Użytkownik
Posty: 651
Rejestracja: 05 kwie 2004, 8:38
Lokalizacja: Białystok
Kontakt:

Re: przerwania a program główny...

Post autor: gaweł » 20 mar 2007, 13:13

lowelas7700 pisze:chciałbym w sterowniku do przedwzmacniacza wykorzystać wewnętrzne przerwania od timera 2 (w mega 16 lub 32) . pytanie nie daje mi spać "czy jak będę się komunikował i2c, odbierał rc5, komunikował się przez 1 wire, korzystał z uart, to czy przerwanie zakończy proces nadawania czy najpierw skończy nadawać a dopiero później przejdzie do zliczenia impulsów?
pozdrawiam
Mikrokontroler jest układem integrującym w jednej obudowie sam mikroprocesor i urządzenia pefyferyjne i należy je rozpatrywać niezależnie. Przerwanie dotyczy mikroprocesora, czyli tej części, która wykonuje program. Układy peryferyjne są sterowane przez mikroprocesor ale pracyją od niego niezależnie. Przykładowo UART, który dostał polecenie wysłania znaku jest już nie do zatrzymania. Tak samo zachowają się wszystkie inne zespoły mikrokontrolera. Podobnie w przypadku I2C. Jeżeli użyjesz sprzętowego kontrolera, to nić nie zaburzy transmisji. Jeżeli będziesz realizował transmisję I2C w sposób programowy, tj. napiszesz program, który będzie tak sterował wyprowadzeniami, że przebieg będzie zgodny z wymogami stanrardu I2C, to przerwanie może przeszkadzać w generowaniu odpowiednich sygnałów, jednak nie zawsze jest to na tyle krytyczne, że transmisja "się urwie".

piotrek7700
Użytkownik
Posty: 105
Rejestracja: 09 mar 2006, 8:15
Lokalizacja: Leszczyna
Kontakt:

Post autor: piotrek7700 » 20 mar 2007, 13:52

jeżeli użyje sprzętowego kontrolera.... czyli jak w programie głównym wywołam funkcje ic2start to wyśle wszystkie dane przez i2c i dopiero później zliczy impuls? bo chciałbym wbudować prosty układ zliczający impulsy co sekundę...peryferyjny układ rtc nie wchodzi w rachube bo nie potrzeba mi wyświetlania godziny tylko żeby zliczał kwadranse i zmienił stan jednej ze zmiennych. chciałbym aby to była w miarę równy kwadrans...
a jeśli program będzie w trakcie odbioru rc5 i nadejdzie przerwanie?

tasza
Użytkownik
Posty: 1391
Rejestracja: 21 lut 2005, 15:02

Post autor: tasza » 20 mar 2007, 14:01

lowelas7700 pisze:a jeśli program będzie w trakcie odbioru rc5 i nadejdzie przerwanie?
To oprogramuj to tak, aby po nadejściu przerwania ustawić sobie jakąś
zmienną (flagę) i tak szybko jak się da obsługę przerwania zakończyć.
Wtedy czas obsługi będzie krótki i to nie będzie zakłócało transmisji lub innych zadań.
A w programie głównym zerkasz sobie na tę flagę kiedy masz akurat czas,
robisz to co trzeba - gdy ona się zmieni. A potem ją zerujesz...

N.

Awatar użytkownika
gaweł
Użytkownik
Posty: 651
Rejestracja: 05 kwie 2004, 8:38
Lokalizacja: Białystok
Kontakt:

Post autor: gaweł » 20 mar 2007, 14:26

lowelas7700 pisze:jeżeli użyje sprzętowego kontrolera.... czyli jak w programie głównym wywołam funkcje ic2start to wyśle wszystkie dane przez i2c i dopiero później zliczy impuls?
Jaki impuls?
lowelas7700 pisze:bo chciałbym wbudować prosty układ zliczający impulsy co sekundę...peryferyjny układ rtc nie wchodzi w rachube bo nie potrzeba mi wyświetlania godziny tylko żeby zliczał kwadranse i zmienił stan jednej ze zmiennych. chciałbym aby to była w miarę równy kwadrans...
Można zaprogramować licznik/zegar by zliczał impulsy zegara systemowego (po wstępnym podzieleniu) i przepełnienie się licznika było sygnałem przerwania. Dobierając odpowiednio stopień podziału wstępnego dzielnika można uzyskać sygnał przerwania co jakiś czas. Licznik zawsze będzie liczyć, jest zespołem autonomicznym, i co jakiś czas będzie zgłaszać sygnał przerwania. Jeżeli mikroprocesor w danej chwili ma zablokowane przyjmowanie przerwań, to ono "się zakolejkuje" i zostanie obsłużone w najbliższym możliwym czasie. W obsłudze przerwania możesz zliczać liczbę wywołań i w ten sposób odmierzać czas.
lowelas7700 pisze:chciałbym aby to była w miarę równy kwadrans...
Co znacza w miarę równy kwardans. Jeżeli uzyskasz przerwanie co 1 ms i nie zgubisz zadnego przerwania, to mierzysz czas z dokładnością 1ms. Czy to jest wystarczająca dokładność?
lowelas7700 pisze:a jeśli program będzie w trakcie odbioru rc5 i nadejdzie przerwanie?
Jażeli nie jest zablokowana możliwość przyjmowania przerwania, to mikroprocesor przejdziee do jego obsługi, czyli aktualnie wykonywany program zostaje zawieszony na czas obsługi przerwania. Z tego powodu obsługa przerwań powinna być nak najkrótsza. Jeżeli zablokujesz przyjmowanie przerwań, to zostanie oni obsłużone później (po umożliwieniu ich przyjmowania). Jeżeli licznik/zegar zgłasza przerwanie przykładowo co 1 ms, ty, przy okazji obsługi RC5 zablokujesz przyjmowanie przerwań na czas dłuższy, to możesz zgubić sygnał o upłynięciu czasu 1ms. Jeżeli blokada przerwań będzie wystarczająco krótka, a przerwanie od upływu czasu przyjdzie w trakcie, to nic się nie stanie. Możesz to sobie wyobrazić jako: raz dostaniesz przerwanie po 1.5 ms ale bastępne będzie po 0.5 ms, co sumatycznie i tak odmierzy czas 2 ms.

piotrek7700
Użytkownik
Posty: 105
Rejestracja: 09 mar 2006, 8:15
Lokalizacja: Leszczyna
Kontakt:

Post autor: piotrek7700 » 20 mar 2007, 14:30

procek będzie chodził (w zasadzie juz jest na płytce uniwersalnej ) na 16 MHz to przerwanie od timera i zwiększenie o 1 jakiejś zmiennej zajmie "trochę mniej niż chwilunie"...:)
ok. kolejne pytanie...jeśli użyję uart (rs232) to co będzie jeśli w jeden uC zacznie wysyłać dane, a drugi będzie w zupełnie innym miejscu i nie będzie zamierzał odbierać danych? czy jeśli jeden zacznie nadawać to drugi automatycznie przeskoczy do odbioru danych? czy odbierze dane przechowa je przez chwilę i dopiero kiedy program główny będzie chciał je otrzymać to zostaną przekazane?
pozdrawiam. może dla wielu z Was to banalne pytania ale dla mnie łączność przez rs232 będzie krokiem milowym....

[ Dodano: 2007-03-20, 14:37 ]
impuls w sensie przerwania i przejścia do
incr sekund

Awatar użytkownika
gaweł
Użytkownik
Posty: 651
Rejestracja: 05 kwie 2004, 8:38
Lokalizacja: Białystok
Kontakt:

Post autor: gaweł » 20 mar 2007, 14:42

lowelas7700 pisze:procek będzie chodził (w zasadzie juz jest na płytce uniwersalnej ) na 16 MHz to przerwanie od timera i zwiększenie o 1 jakiejś zmiennej zajmie "trochę mniej niż chwilunie"...:)
ok. kolejne pytanie...jeśli użyję uart (rs232) to co będzie jeśli w jeden uC zacznie wysyłać dane, a drugi będzie w zupełnie innym miejscu i nie będzie zamierzał odbierać danych? czy jeśli jeden zacznie nadawać to drugi automatycznie przeskoczy do odbioru danych? czy odbierze dane przechowa je przez chwilę i dopiero kiedy program główny będzie chciał je otrzymać to zostaną przekazane?
pozdrawiam. może dla wielu z Was to banalne pytania ale dla mnie łączność przez rs232 będzie krokiem milowym....
To, że UART odbierze znak może być sygnałem przerwania. Jego obsługa powinna sprowadzić się do jego odczytu z rejestru odbiornika (bo następne przerwanie nadpisze znak i poprzedni zostanie utracowny) i zachowania go w pamięci do poźniejszego użycia. NIGDY nie należy liczyć, że obierzesz znak we właściwym momencie. W programie odbierającym należy sprawdzić, czy w buforze jest przechowywany znak i ewentualnie go pobrać z bufora w pamięci.

PS
W jakim języku chcesz programować procka?

piotrek7700
Użytkownik
Posty: 105
Rejestracja: 09 mar 2006, 8:15
Lokalizacja: Leszczyna
Kontakt:

Post autor: piotrek7700 » 20 mar 2007, 14:48

posiadam jedynie bascoma avr. asm odpada bo jak dla mnie za wysokie progi....przynajmniej na razie

Awatar użytkownika
gaweł
Użytkownik
Posty: 651
Rejestracja: 05 kwie 2004, 8:38
Lokalizacja: Białystok
Kontakt:

Post autor: gaweł » 20 mar 2007, 15:03

Niestety, dla mnie bascom odpada, więc nie mogę ci pomóc w kwestii przykładów.

piotrek7700
Użytkownik
Posty: 105
Rejestracja: 09 mar 2006, 8:15
Lokalizacja: Leszczyna
Kontakt:

Post autor: piotrek7700 » 20 mar 2007, 15:18

w domu przy wolnej chwili sprobuje wykorzystać przerwanie generowane przy odbiorze danych....
pozdrawiam mimo to i tak wielkie dzięki.

ODPOWIEDZ