logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATMEGA8]Przerwania, a RS232

marnowak 12 Gru 2010 06:35 3476 14
REKLAMA
  • #1 8857364
    marnowak
    Poziom 15  
    Witam!
    Chciałbym zrobić układ regulacji fazowej na owym procku. Chciałbym obsługiwać przerwania od TIMER-a co 100us. Dodatkowo przerwanie od detekcji zera- wystąpi jak wiadomo co 10mS. Czy układ RS232 będzie obsługiwany równolegle jeśli będzie pracował z prędkością 1200b/s, co odpowiada 1 znakowi/10 ms? Czy prędkość RS232 ma tu coś do rzeczy- czytaj, czy na czas wytransmitowania, bądź odbioru znaku program wstrzyma swoje działanie na 10ms, czy po prostu odbędzie się to równolegle i nie zakłócą tej transmisji przerwania 100us, które będę miał od TIMERA?
  • REKLAMA
  • #2 8857552
    ZbeeGin
    Poziom 39  
    Jak dobierzesz priorytety przerwań (programowo) z TIMERA i ZCD, i transmisję z UART też zrobisz przerwaniowo to czym się martwisz. UART ma bufor 3 znakowy i jest jednostką samodzielną.
  • REKLAMA
  • #3 8857666
    Andrzej__S
    Poziom 28  
    marnowak napisał:

    ...czy na czas wytransmitowania, bądź odbioru znaku program wstrzyma swoje działanie na 10ms, czy po prostu odbędzie się to równolegle...

    Jeśli budujesz transmisję RS232 na przerwaniach, sprzętowy USART odbiera znak w czasie, gdy procesor wykonuje program główny. Po odebraniu całego znaku generowane jest przerwanie. W obsłudze przerwania musisz tylko ten znak zapisać np. do jakiejś zmiennej lub bufora odbiorczego. To zajmuje zwykle kilkanaście/kilkadziesiąt taktów zegara raz na cały okres potrzebny do odebrania jednego znaku.
    marnowak napisał:

    Czy prędkość RS232 ma tu coś do rzeczy?

    Im większa prędkość, tym częściej będą pojawiać się przerwania. Im dłuższa procedura obsługi przerwania, tym mniej czasu będzie miał procesor na inne rzeczy (program główny, inne przerwania).
    marnowak napisał:

    ...czy po prostu odbędzie się to równolegle i nie zakłócą tej transmisji przerwania 100us, które będę miał od TIMERA.

    Jeżeli przerwanie od timera (co 100us) wystąpi w czasie, gdy obsługiwane jest przerwanie od USART (a jest to bardzo prawdopodobne), to jego procedura obsługi będzie musiała poczekać na zakończenie obsługi przerwania USART'a. Wyjściem jest włączenie - zaraz na początku obsługi przerwania USART - globalnej flagi zezwalającej na przerwania (flaga I w SREG). Mimo wszystko od momentu wejścia w procedurę obsługi przerwania USART do momentu zezwolenia na inne przerwania mija trochę czasu (jest on potrzebny na skok do procedury obsługi oraz na odłożenie na stos używanych w przerwaniu rejestrów). Żeby ten czas skrócić można zastosować atrybut ISR_NAKED przy definiowaniu procedury obsługi przerwania lub napisać ją w assemblerze. Jeśli jednak potrzebujesz bardzo precyzyjnego czasu co do jednego taktu zegara, to i tak może być problem, szczególnie jeśli zastosujesz niską częstotliwość taktowania procesora (dla 1MHz kilka taktów zegara to kilka procent błędu przy odmierzaniu 100us). Ewentualnie można zastosować rezonator o jak najwyższej częstotliwości, żeby zminimalizować straty.
  • #4 8858173
    LordBlick
    VIP Zasłużony dla elektroda
    Zależy w sumie o jakim języku programowania rozmawiamy, osobiście sprawdziłem, że się da w asemblerze 2xRS (komunikacja z falownikiem i debug na PC) + podwójna bariera podczerwieni + sterowanie grupowe (synchronizowane z siecią) triakiem + obsługa klawiatury + obsługa LCD znakowego 2x16 i przy tym procesorek jeszcze ma czas na bieżącą konwersję BIN2BCD dla 7 parametrów wyświetlanych na wyświetlaczu... Zegar 11 MHz z hakiem...
  • REKLAMA
  • #5 8858377
    mirekk36
    Poziom 42  
    Bez NAJMNIEJSZEGO problemu można zrobić to o czym piszesz panie autor i to z prędkościami RS232 rzędu 115200 a nie tak ślimaczymi jak 1200. A do tego jeszcze wiele innych zadań może ten sam procek wykonywać - mniej więcej tak jak to opisał kolega wyżej.

    Ja podobne układy robię i programuję w języku C i nie mam z tym żadnych tego typu problemów, które cię nurtują. A dlaczego ?

    ..... to już wyżej dostałeś szereg odpowiedzi o dodatkowym buforowaniu i pełnej sprzętowej osbłudze RS232. Hmmmm tylko, że musisz oczywiście napisać dobrą obsługę przerwań a przede wszystkim użyć jakiegoś bufora cyklicznego dla odboru RS232 .... i po kłopotach ;)
  • #6 8860192
    marnowak
    Poziom 15  
    Dzięki!
    Pytałem zapobiegawczo. Muszę wybrać temat pracy inżynierskiej. Kiedyś bawiłem się BASCOM-em, ale do przerwań nie doszedłem- pamiętam, że też miałem problemy z równoległym wykonywaniem zadań przez procesor, ale i moja wiedza była też mizerna. Ten program chcę napisać w AVR-GCC, bo to jest szeroko chwalone środowisko programistyczne i język programowania obiektowy, a BASCOM-a jakoś wykładowcy z mojej uczelni nie wiedzieć czemu potępiają.

    Co do transmisji:
    Muszę mieć 1200bodów/sekundę, ponieważ taką wydolność ma modem PLC na TDA5051.

    W związku z tym chciałbym zadać jeszcze dwa pytania:
    1. Czy w AVR nie można jakimś rejestrem przestawić priorytetów przerwań, tak, aby najpierw wykonywało się przerwanie od INT0, a potem od UART-a?
    2. Modem na TDA 5051 wrzuca w sieć energetyczną przebieg sinusoidalny 132,5kHz o wartości skutecznej napięcia około 1,9V dla logicznej jedynki na wejściu DATA IN. Czy pojawianie się co jakiś czas tego przebiegu w sieci energetycznej nie zakłóci mi układu wykrywania przejścia przez zero. Próbowałem sobie to zasymulować w PSpice i Multisim, ale jak podłącze 230V, to nie widzę przebiegu 125kHz od strony sieci energetycznej- symulatory po prostu widzą po danej stronie tylko napięcie, które jest tam przyłożone(układ ze strony 20 specyfikacji TDA5051: 1,9V o f=125kHz daję przed filtrami LC, po drugiej stronie tych filtrów podłączam 230V 50Hz i symulator widzi od tej strony tylko te 230V. Jak usunę 230V, to w Multisimie widzę ten przebieg 125kHz, jak podłącze 230V- to już nie).

    A propo układu:
    Tematem tej pracy ma być sterowanie trzema układami regulacji fazy (jasnością świecenia żarówek w poszczególnych pomieszczeniach)- będą to układy SLAVE za pomocą komputera (MASTER) poprzez sieć energetyczną (Power Line Carier). Stąd właśnie te moje pytania.
  • REKLAMA
  • #7 8860272
    mirekk36
    Poziom 42  
    Nie da rady ustawiać priorytetów przerwań w AVR'kach tak jak to było w 8051. Ale spokojnie bez tego sobie poradzisz ;) ... ale cały czas jednak cię dręczy nadal czy się transmisja RS232 nie zakłóci mimo zapewnień ;) ..... oczywiście że może się zakłócić ale tylko wtedy jeśli źle napiszesz program a nie z innych powodów o których wcześniej było tu pisane.

    a przy tak ślimaczej prędkości 1200 to już w ogóle nie wiem czym tu się martwić - no ale to już troszkę powtarzam się.
  • #8 8860371
    marnowak
    Poziom 15  
    Nie, nie. Nie rozumiesz.
    Wtedy pytałem o stronę programową, a teraz sprzętową.
    Do sieci 230V poprzez filtr LC wejdą mi dodatkowo przebiegi o częstotliwości 132,5kHz. Wiadomo, że dla regulacji fazowej musimy zrobić obwód detekcji przejścia przez zero. Teraz po prostu nie wiem, czy jak w momencie przejścia przez zero zacznie mi transmitować układ TDA5051, to czy sygnał ten nie będzie na tyle silny, że spowoduje podtrzymanie świecenia diody w optotranzystorze.

    Z symulacji wynika, że jak podam 1,9Vsk przed filtrem LC, to na wyjściu dostanę przebieg o Vsk=około 1,5V. Dioda w optotranzystorze jest połączona z siecią energetyczną przez rezystor kilkumegaomowy. Czy to spowoduje, że napięcie na diodzie spadnie do takiej wartości, że nie zaświeci? Rozumiesz: co będzie jak przebieg z TDA pojawi się w czasie, gdy napięcie sieciowe o f=50Hz jest w zerze- czy dioda będzie świeciła, co spowoduje, że układ detekcji zera się zmyli, czy też nie ruszy go i detekcja normalnie się odbędzie?
  • #9 8860836
    LordBlick
    VIP Zasłużony dla elektroda
    marnowak napisał:
    Teraz po prostu nie wiem, czy jak w momencie przejścia przez zero zacznie mi transmitować układ TDA5051, to czy sygnał ten nie będzie na tyle silny, że spowoduje podtrzymanie świecenia diody w optotranzystorze.
    Z mojego punktu widzenia rozwiązanie jest trywialne - nie ma potrzeby wykrywania przejścia przez zero, wystarczy wykrywać wartość podchodzącą pod amplitudę sprzed triaka i od tego momentu mierzyć czas (który należy dobrać eksperymentalnie za pomocą oscyloskopu). Daje takie podejście do tematu jako bonus kilka ms do namysłu... ;)
  • #10 8860927
    marnowak
    Poziom 15  
    To takie nieprofesjonalne i po drugie nie zadziała jak by układy podłączyć w sieci 60Hz. Musiałbym drugi TIMER zaprząc do pracy. Trochę to pokręcone by się stało.
  • #11 8860990
    LordBlick
    VIP Zasłużony dla elektroda
    marnowak napisał:
    To takie nieprofesjonalne i po drugie nie zadziała jak by układy podłączyć w sieci 60Hz. Musiałbym drugi TIMER zaprząc do pracy. Trochę to pokręcone by się stało.
    1. Zdefiniuj pojęcie "profesjonalne" w tym przypadku. Układ ma działać niezawodnie i za taki płacą klienci, a nie na modłę teoretyków.
    2. Możesz zaprzęgnąć układ i do pracy na 75Hz, wystarczy raz po włączeniu układu zmierzyć okres częstotliwości pracy sieci, zapamiętać, alleluja i do przodu.
    3. Wystarczy jeden timer, reszta to problem odpowiednio zdefiniowanych liczników w RAM obsługiwanych w przerwaniu CTC.
  • #12 8861027
    janbernat
    Poziom 38  
    No, ale musisz przwidzieć kiedy włączyć triak/tyrystor.
    A nie jesteś w stanie przewidzieć co będzie.
    A musisz włączyć przed zerem sieci.
    Tak więc sposób Light-I jest jak najbardziej słuszny.
    I stosowany w rozwiązaniach profesjonalnych.
    Te lepsze mierzą czas.
    Te tańsze mają zworki.
  • #13 8930780
    marnowak
    Poziom 15  
    No dobra. Sądzę, że z tym sobie poradzę jakoś.

    Jeszcze jedno pytanko. W aplikacjach tego TDA jest napisane, że transmisja odbywa się z prędkością 1200 bod/s, w tabelkach dokumentacji AVR-ów najniższa prędkość transmisji widnieje jako 2400 bod/s. Jak mniemam skoro układ TDA daje radę z prędkością 1200bod/sekundę, to nie wolno mi transmitować do niego z większą prędkością, bo po prostu krzaki dostanę. Czy te tabelki są tylko przykładowe, czy też w rzeczywiście najniższa obsługiwana prędkość przez ATMEGA8 to 1200bod/sekundę?
  • #14 8931329
    Fredy
    Poziom 27  
    Od dołu to nie ma ograniczeń - możesz ustawić nawet dużo niższe prędkości.

    Problem pojawia się przy dużych prędkościach rzędu Fosc/16 .

    Prędkośc transmisji ustalasz wpisami w rejstr UBRRL i UBRRH. Jak wpiszesz tak będziesz mieć.
  • #15 11401513
    marnowak
    Poziom 15  
    Dziękuję za odpowiedzi. Układ zmontowałem. Transmisja OK. Co do regulacji fazowej- średnio to działa, ale działa.
REKLAMA