Elp
Guest
Sat Jun 14, 2008 2:07 pm
Witam.
Znowu problem z tym klockiem :-(
Chcę wykorzystać przerwania od USART`a, po odbiorze znaku i po wysłaniu.
Jeśli włączę tylko przerwanie od odbioru, to wszystko działa. Jeśli
natomiast włączę również od końca wysłania znaku, to wywoła mi przerwanie
w momencie startu programu raz i koniec. Potem nic nie działa (brak
przerwań).
Poniżej przedstawiam fragment kodu ustalający parametry pracy USART i AIC.
Co tu jest nie tak?
Przy tym procku zaczynam już siwieć :-(
// Inicjowanie USART 1
US1_CR = US_RSTRX | US_RSTTX | US_RXDIS | US_TXDIS;
US1_RCR = 0x00000000;
US1_TCR = 0x00000000;
US1_IDR = 0xFFFFFFFF;
US1_IER = US0_IMR_RXRDY; // "Tak działa"
US1_IER = US0_IMR_RXRDY | US0_IMR_ENDTX; // "Tak NIE działa";
US1_MR = US_CLKS_MCK | US_CHRL_8 | US_PAR_NO | US_NBSTOP_2 |
US_CHMODE_NORMAL;
US1_BRGR = PROCESSOR_CLOCK_FREQUENCY / (16 * US1_BaudRate);
US1_TTGR = 0;
US1_CR = US_TXEN | US_RXEN;
// Przerwanie od USART1 (PC)
AIC_IDCR = 1 << US1_ID;
AIC_SVR(US1_ID) = (unsigned)usart1_irq;
AIC_SMR(US1_ID) = AIC_SRCTYPE_INT_EDGE_TRIGGERED;
AIC_ICCR = 1 << US1_ID;
AIC_IECR = 1 << US1_ID;
Pozdrawiam
ELP
Krzysztof Rudnik
Guest
Sat Jun 14, 2008 2:50 pm
Elp wrote:
Quote:
Witam.
Znowu problem z tym klockiem :-(
Chcę wykorzystać przerwania od USART`a, po odbiorze znaku i po wysłaniu.
Jeśli włączę tylko przerwanie od odbioru, to wszystko działa. Jeśli
natomiast włączę również od końca wysłania znaku, to wywoła mi przerwanie
w momencie startu programu raz i koniec. Potem nic nie działa (brak
przerwań).
Zwykle przerwania od nadajnika nie oznaczaja konca wysylania znaku tylko
gotowosc nadajnika. Z tego tez powodu przy nadawaniu przerwania wlacza sie
dopiero ja masz cos do nadawania, najlepiej dopiero jak natrafisz na zajety
nadajnik. Bo inaczej masz caly czas aktywne przerwanie.
Krzysiek Rudnik
Elp
Guest
Sat Jun 14, 2008 3:14 pm
Dnia 14-06-2008 o 15:50:51 Krzysztof Rudnik <rudnik@kki.net.pl> napisał(a):
Quote:
Elp wrote:
Witam.
Znowu problem z tym klockiem :-(
Chcę wykorzystać przerwania od USART`a, po odbiorze znaku i po wysłaniu.
Jeśli włączę tylko przerwanie od odbioru, to wszystko działa. Jeśli
natomiast włączę również od końca wysłania znaku, to wywoła mi
przerwanie
w momencie startu programu raz i koniec. Potem nic nie działa (brak
przerwań).
Zwykle przerwania od nadajnika nie oznaczaja konca wysylania znaku tylko
gotowosc nadajnika. Z tego tez powodu przy nadawaniu przerwania wlacza
sie
dopiero ja masz cos do nadawania, najlepiej dopiero jak natrafisz na
zajety
nadajnik. Bo inaczej masz caly czas aktywne przerwanie.
Ale problem nie polega na "zapętlaniu" się przerwania, tylko na jego
braku. Program nie chodzi cały czas w przerwaniu, tylko w prgramie głównym.
Napisałem przecież, że jeśli mam włączone przerwanie TYLKO od odbiornika,
to wszystko działa poprawnie. Jeśli włączę przerwanie od odbiornika i
nadajnika, to nie dość że nie wyzwala przerwania po wysłaniu bajtu, to do
tego jeszcze nie wyzwala odbiór (który "przedtem" działał).
Pozdrawiam
ELP
Krzysztof Rudnik
Guest
Sat Jun 14, 2008 5:22 pm
Elp wrote:
Quote:
Dnia 14-06-2008 o 15:50:51 Krzysztof Rudnik <rudnik@kki.net.pl
napisał(a):
Ale problem nie polega na "zapętlaniu" się przerwania, tylko na jego
braku. Program nie chodzi cały czas w przerwaniu, tylko w prgramie
głównym. Napisałem przecież, że jeśli mam włączone przerwanie TYLKO od
odbiornika, to wszystko działa poprawnie. Jeśli włączę przerwanie od
odbiornika i nadajnika, to nie dość że nie wyzwala przerwania po wysłaniu
bajtu, to do tego jeszcze nie wyzwala odbiór (który "przedtem" działał).
Moze CPU reaguje na zbocze, a przy aktywnym przerwaniu od nadajnika
zgloszenie przerwania od odbiornika nic juz nie zmienia.
Krzysiek Rudnik
Elp
Guest
Sat Jun 14, 2008 5:45 pm
Quote:
Moze CPU reaguje na zbocze, a przy aktywnym przerwaniu od nadajnika
zgloszenie przerwania od odbiornika nic juz nie zmienia.
No, ma to sens.
Ale w takim razie jak skasować flagę przerwania od USART`a?
Wydawało mi się, że jest kasowana automatycznie po wejściu w procedurę
przerwania.
Chociaż w procedurze przerwania od timera trzeba odczytać TC0_SR aby się
to skasowało.
Dla USART`a odczytanie analogicznego rejestru US0_CSR nic nie daje. A może
(raczej na pewno) ja czegoś nie wiem?
Pozdrawiam
ELP
Adam Dybkowski
Guest
Sat Jun 14, 2008 11:07 pm
Elp pisze:
Quote:
Moze CPU reaguje na zbocze, a przy aktywnym przerwaniu od nadajnika
zgloszenie przerwania od odbiornika nic juz nie zmienia.
No, ma to sens.
Ale w takim razie jak skasować flagę przerwania od USART`a?
Wydawało mi się, że jest kasowana automatycznie po wejściu w procedurę
przerwania.
Chociaż w procedurze przerwania od timera trzeba odczytać TC0_SR aby się
to skasowało.
Dla USART`a odczytanie analogicznego rejestru US0_CSR nic nie daje. A
może (raczej na pewno) ja czegoś nie wiem?
A nie łaska przeczytać odpowiedni rozdział PDFa?
Ogólnie mówiąc jest tak, że USART dysponuje zwykle trzema przerwaniami:
przerwaniem odbiornika informującym o niepustym buforze odbiorczym,
przerwaniem nadajnika informującym o niecałkiem wypełnionym buforze
nadawczym oraz przerwaniem pustego nadajnika informującym o całkowitym
opróżnieniu bufora nadawczego oraz rejestru przesuwnego.
Zalecam niebawienie się bezpośrednio przerwaniami od USARTa, ale raczej
wykorzystanie PDC (a'la DMA) i transmisję danych blokami - abyś nie
obciążał procesora przerwaniem co bajt. Nadawaj całe bloki i skorzystaj
z timeoutu odbiornika.
--
Adam Dybkowski
http://dybkowski.net/
Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.