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

Programowy UART (nadawanie) avr-gcc/ATMGA8, bez timerow

Platon 07 Sie 2007 11:59 3409 3
REKLAMA
  • #1 4154044
    Platon
    Poziom 42  
    Posty: 9185
    Pomógł: 744
    Ocena: 169
    Witam,
    Szukam jakiegos kawalka kodu programowego UART'u - tylko częsci do nadawania. Najlepiej, jakby nie musiał wykorzystywac timerów/przerwań, (ew t1 lub t2) a był zrobiony na opoznieniach. Predkosc nie musi byc duza, 300bodow to aż, aż. Nie musi miec buforów itp - ilosc informacji nie bedzie duza. Dobrze by było, jakby miał mozliwosci wybrania czy jest podpiety pod max232, czy bezposrednio do portu - czyli dane "odwrotne". Bede tym probowal deugowac program.
    Nie moge wykorzystac sprzetowego uartu, bo jest juz zajety - czesc sprzetowa jest niezmienna, moge podpiac sie tylko pod PC2 lub PC5.

    Dzieki za pomoc.
  • REKLAMA
  • Pomocny post
    #2 4154082
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    przy prędkości 300bodów to spokojnie można wyklepać coś z miejsca - teraz to napisałem, ale powinno działać i zawiera cały sens. Można też zamienić _delay_ms(1000/BAUD) na _delay_us(1000000/BAUD) ale pamiętając, że opóźnienie wtedy nie może mieć więcej niż 768 cykli (w przypadku _delay_ms max jest 262144 cykli).. ogólnie jeśli coś było by nie tak z opóźnieniami, to trzeba zagwarantować, żeby trwało ono tyle, co jeden bit..
    #define SOFTUART_SETHI() (.....)
    #define SOFTUART_SETLO() (.....)
    #define BAUD 300
    
    void softuart_Send(u8 AByte)
    {
    	// bit startu
    	SOFTUART_SETLO();
    	_delay_ms( 1000/BAUD );
    	
    	// 8 bitów danych (MSB first)
    	u8 i;
    	for(i=8;i;i--)
    	{
    		if(AByte & 0x80)
    			SOFTUART_SETHI();
    		else
    			SOFTUART_SETLO();
    		AByte <<= 1;
    		_delay_ms( 1000/BAUD );
    	}
    	
    	// bit stopu
    	SOFTUART_SETHI();
    	_delay_ms( 1000/BAUD );
    }
    
  • REKLAMA
  • Pomocny post
    #3 4154110
    lelekx
    Poziom 30  
    Posty: 1220
    Pomógł: 158
    Ocena: 90
    Jeżeli masz czasochłonne przerwania mogą one znacznie zakłócić transmisje nawet przy 300baud. Jeżeli możesz na ten czas wyłączyć przerwania, zrób to - możesz wtedy próbować podnieść prędkość transmisji nawet do 115kbaud. Taki zabieg bez użycia assemblera może się nie udać.
  • #4 4154292
    Platon
    Poziom 42  
    Posty: 9185
    Pomógł: 744
    Ocena: 169
    Jeżeli podłączam bez MAX'a to neguje cala transmisje czyli faktycznie SOFTUART_SETLO() ma ustawiac wysoki i odwrotnie, tak? Dodatkowo na poczatku programu i po transmisji gdzies ustawic stan aktywny na niski (jak bez MAX'a), tak?

    Na razie dostaje te same znaczki grupami po 14 "ĹĹÍÍÍÍÍĹÍĹĹÍÍĹ" / "ŕŕŕŕŕŕŕ" itp, przy predkosciach 110 lub 300.

    z MAX'em tez dostaje po 14 symboli przy kazdej transmisji.

    Po podejrzeniu transmisji na wejsciowej linii sterujacej okazalo sie, ze sygnal jest "szatkowany", zapewne przez jakies operacje w przerwaniu, chociaz zadnych modyfikacji linii wyjsciowej tam nie widze. Wyłączenie przerwan na czas transmisji tym uartem rozwiazalo sprawe. Tylko przesuniecie bitów zrobilem w druga strone, zeby było po ludzku ;)

    Dziekuje za pomoc.
REKLAMA