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

[C] Half-Duplex Software UART dla Attiny13 (Tx+Rx)

narasta 09 Cze 2009 23:07 6786 10
REKLAMA
  • #1 6637214
    narasta
    Poziom 21  
    Szukam jakichś źródeł które pasowały by np pod attiny13 (at13 = tylko 1kB ROM). Chodzi o software uart który obsługiwałby zarówno wysyłanie jak i odbieranie danych. Kod obsługujący wysyłanie znalazłem i działa tak jak trzeba ale nic sensownego do odbioru nie mogę znaleźć. Macie jakieś sprawdzone źródła?
  • REKLAMA
  • #2 6637613
    Dr.Vee
    VIP Zasłużony dla elektroda
    #define BAUD_RATE 9600
    #define UART_RX_PIN 0
    #define UART_BIT_LENGTH (1/((double)BAUD_RATE) / 1e-6)
    
    int uart_rx(void)
    {
        uint8_t rv = 0;
        uint8_t i;
    
        if (!(PINB & _BV(UART_RX_PIN)))
            return -1;
        while (PINB & _BV(UART_RX_PIN))
            /* wait for start bit */;
        _delay_us(UART_BIT_LENGTH / 2);
    
        for (i = 0; i < 8; ++i)
        {
            rv >>= 1;
            _delay_us(UART_BIT_LENGTH);
            if (PINB & _BV(UART_RX_PIN))
                rv |= 0x80;
        }
    
        _delay_us(UART_BIT_LENGTH);     /* wait for stop bit */
    
        if (PINB & _BV(UART_RX_PIN))    /* stop bit must be one */
            return rv;
        else
            return -1;
    }

    Zamiast _delay_us możesz użyć timera w trybie CTC z testowaniem bitu OCF0A, inaczej dla zegara 1MHz będziesz gubił bity...

    Pozdrawiam,
    Dr.Vee
  • REKLAMA
  • #3 6638816
    narasta
    Poziom 21  
    Niekoniecznie musi to być zegar 1MHz. Można tez ustawić attiny13 na 4.8 lub 9.6 MHz.
  • REKLAMA
  • #4 6639383
    Dr.Vee
    VIP Zasłużony dla elektroda
    Może być i nawet 20MHz jak podłączysz kwarc lub będziesz układ taktował z zewnątrz.

    Chodziło mi o to, że dla 1MHz 9600 bps masz czas trwania bitu ~30us = 30 instrukcji. W samej pętli będziesz miał dodatkowo z 8-10 cykli na iterację, więc już po kilku bitach odbiornik straci synchronizację.

    Pozdrawiam,
    Dr.Vee

    Pozdrawiam,
    Dr.Vee
  • REKLAMA
  • #5 6640802
    szeryf.rm
    Poziom 22  
    Attiny13 bez kwarcu to raczej ciężka sprawa. Konieczna jest synchronizacja z odbiornikiem, poprzez np. wysyłanie i nasłuch. W ten sposób można się dostroić. Z zegarem zewnętrznym nie ma problemu. Dodam tylko, że takie coś pisze się lepiej w ASM i najlepszy efekt można osiągnąć z wykorzystanim przerywania (przy odbiorze).
  • #6 6641862
    narasta
    Poziom 21  
    Teraz testuje programowego uarta na atmedze32 z kwarcem 12MHz i działa wyśmienicie :) Aż zaraz przestawię atmege na wewnętrzny rezonator i zobaczymy jak się będzie zachowywać uart.

    Nie mam jak tego sprawdzić na razie na attiny13 bo chcąc przestawić zegar, procesor się zablokował... Przestawiłem z 9.6 na 4.8Mhz.

    W sumie nie koniecznie musi wszystko pracować na 9600 bodach... Docelowo mają ze sobą współpracować dwa procesory. Jako master będzie pracować jakaś ATMEGA z uartem, a jako slave właśnie to attiny13 z software uartem. Tak więc oba można ustawić na dowolny baudrate. Dla zegarów 4,8/9,6MHz można dać np odpowiednio 4838 lub 9676 bodów co da błąd 0,01%. Tak niski błąd będzie kompensować niedokładność zegara RC.
  • #7 6642475
    szeryf.rm
    Poziom 22  
    Niedokładność zegara wewnętrznego to nie tylko to co sobie założysz. Na jego niedokładność wpływa także temperatura otoczenia. Rozgrzej minimalnie a wynik uzyskany będzie inny. Już nie pamiętam jakie może być odstępstwo częstotliwości, ale pamiętam, że różnice są naprawdę niewielkie (ja przyjmowałem że maksymalne odchlenie może wynosić ok 3% co w przypadku 9600 daje odchylenie na poziomie około +/-250b/s).

    Poza tym jak wyliczyłeś błąd 0,01%? Chyba raczej 1%. Ale to i tak nie przejdzie. Mała różnica temperatur a częstotliwość się rozjeżdza. Bez kwarcu jest ciężej i nie ma co się opierać tylko na teorii.
  • #8 6642948
    narasta
    Poziom 21  
    Nie 1, tylko 0,01%.

    Z resztą ramki danych maja po 19 bajtów, wiec nie powinno być problemu.

    Już kiedyś pisałem program do attiny13 ale jeszcze w bascomie. Napisałem wtedy własny asynchroniczny protokół wysyłania danych i nie było tragedii dla braku zewnętrznego zegara. :)
  • #9 6643373
    szeryf.rm
    Poziom 22  
    Eh, rób jak uważasz. Bez synchronizacji tragedii nie ma ale tylko w pewnych zakresach temperatur. Rezonator nie jest idealny i od tego masz wykresy zależności częstotliwości od różnych czynników (temp., nap. zasilania). Ja miałem okazję to sprawdzić w pracy z komputerem i telefonem. Przy odpowiednich ustawieniach wszystko chodziło idealne, ale nie trzeba było wiele podgrzewać/studzić attiny, żeby transmisja ustała. No ale skoro tobie działa, to w takim razie gratuluje. No chyba że ty piszesz o zewnętrznych zegarach w takim razie nie ma czego gratulować, bo to rzecz jasna, że działa.

    Dodano po 13 [minuty]:

    Dodatkowo za Ciebie zerknąłem do karty, skoro ty tam jeszcze nie zaglądałeś.
    Wynika z niej, że w przedziale temp. 10-30'C częstotliwość oscylatora krąży od ok. 9,5MHz do 9,7MHz co daje odchylenie ok 1%. Jednak przedział temp. 10-30'C to dość mały przedział. Piwnica/strych wymaga nieco szerszego przedziału. Dla 0-40'C wynik to już od 9,4MHz do 9,7MHz co daje już 2%. Ja w swoich konstrukcjach musiałem założyć przedział -20'C do 60'C, gdyż sprzęt musiał pracować na dworze w zamkniętych z blachy miejscach. Daje to więc odchylenie 4%.

    Łatwo więc przeliczyć, że skoro odchylenie dla zegara wynosi 1% to dla UART też tyle wyniesie. Nie można też zapominać o tym, że tolerancja samego zegara jest także ważna.

    I dodać mogę jedynie tylko, że nie mam pojęcia po co przeliczenie na ilość wysyłanych bajtów? Jaki to ma związek z transmisją asynchroniczną, skoro w niej liczy się tylko przesłanie jednego bajtu? Jak już jeden przejdzie to drugi też, bo bit synchronizacji jest dla każdego bajtu osobny.
  • #10 6643850
    narasta
    Poziom 21  
    Jakich znowu zewnętrznych zegarach? Nie mam nawet miejsca na to, żeby upchnąć jeszcze zewnętrzne źródło zegarowe... W obudowie w której będzie attiny zmieści się poza samym up w SO-8 tylko płytka, kondensator 1206 i ew. LED 1206. Cały czas właśnie chodzi mi o to, że nie mogę wykorzystać żadnych dodatkowych elementów.

    Tak jak napisałeś, wychodzi na to, że błąd będzie osiągać max około 1,2% - dla temperatur od 0-40'C. Podejrzewam, że docelowo układ będzie pracować w temperaturach od -20'C do +40'C co daje dla 9676 - 2% i dla 4838 - 1,2% błędu.
  • #11 6644184
    szeryf.rm
    Poziom 22  
    Kolego, ty nadal nie rozumiesz wszystkiego. Błąd zegara stanowi tylko część możliwych błędów. Dorzuć do tego błąd samego oscylatora, który też ma rozrzut i wymaga kalibracji. Do tego dorzuć błędy i rozrzut samych procesorów. Idąc tym tokiem rozumowania, jak wszędzie założysz świetne 1% to ci wyjdzie, że można osiągnąć naprawdę wartości przekraczające 3% dla zakresu 0-40'C.
    Jest natomiast sposób, żeby się dostroić do częstotliwości 9600 itd. Wymaga to wysyłania pewnego symbolu i znalezienia takich opóźnień kiedy druga strona odpowie.

    Poza tym zastanawia mnie czy tak ciężko jest podłaczyć procesor, podgrzać go i sprawdzić, ostudzić i sprawdzić?

    A piszę o zewnętrznych zegarach bo to ty naliczyłeś te 0,01%. Bóg tylko jeden raczy wiedzieć jak ci to wyszło.

    A poza tym, to jest twój projekt, a nie mój, więc nie wiem po co się unosisz, skoro sam nie sprawdzasz połowy z ważnych rzeczy. Jeszcze wyżej pisałeś 0,01% a teraz już 1,2% i nadal się unosisz. Zaraz znów dojdziesz do wniosku, że źle myślałeś, ale nie zauważysz, że doszedłeś do takich wniosków nie sam a dzięki forum. Tak więc życzę powodzenia w projekcie i nieco lepszego podejścia do kart katalogowych i ludzi, którzy Ci wskazują gdzie może być problem.
REKLAMA