AT91SAM7S + USART + Interrupt

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

Reply to
Elp
Loading thread data ...

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

Reply to
Krzysztof Rudnik

Dnia 14-06-2008 o 15:50:51 Krzysztof Rudnik snipped-for-privacy@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ł).

Pozdrawiam ELP

Reply to
Elp

Moze CPU reaguje na zbocze, a przy aktywnym przerwaniu od nadajnika zgloszenie przerwania od odbiornika nic juz nie zmienia.

Krzysiek Rudnik

Reply to
Krzysztof Rudnik

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

Reply to
Elp

Elp pisze:

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.

Reply to
Adam Dybkowski

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.