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][C] - dziwny problem z wysyłaniem znaków po USART

PietrekDer 01 Lip 2008 20:59 1282 3
REKLAMA
  • #1 5303535
    PietrekDer
    Poziom 13  
    Witam
    Do wysyłanie znaków używam takiego kodu:
    
    #define C_GPI_1		(1<<2)
    UCSRB |= 1<<RXEN | 1<<TXEN;	//	transmisja: 8N1
    UBRRL = 51;		//9600 błąd 0.2% przy zegarze 8MHz
    
    	TData[0] = 'P';
    	TData[1] = 'E';
    	for(int i=0; i<2; i++)
    	{
    		UDR = TData[i];
    		while( (UCSRA & 0x40) == 0 )
    		{}
    		UCSRA |= 0x40;
    	}

    Nie potrzebuję jakichś super szybkości itd, więc w zupełności mi to wystarcza. I taki kod jak powyżej działa poprawnie, na kompie odbieram znaczki 'PE'. Gdy tesuje wejście PINC.2 i w zależności od stanu zapalam lub gaszę diodkę na innym porcie, także wszystko działa poprawnie. Natomiast gdy od stanu na PINC.2 chcę uzależnić jaki znak ma być wysłany:
    
    if( (PINC & C_GPI_1) == 1 )	//jeśli PINC.2 ustawiony
    	TData[0] = 'I';
    else
    	TData[0] = 'O';
    	//tutaj pętelka for jak w powyższym kodzie - do wysłania 2 znaków
    

    Wtedy coś zaczyna szwankować, i nie odbieram na kompie porządanych znaków :/
    Nie mam p[ojęcia co może być nie tak. Z góry dziękuję za jakąkolwiek pomoci sugestie.
  • REKLAMA
  • #2 5303685
    ciastek4
    Poziom 14  
    Po pierwsze
    jezeli robisz porownanie bitowe tj.

    PINC & ( 1 <<2 ) to nie mozna porwonac tego do 1 gdyż to nie bedzie do konca prawda :). Zuważ, że jest to porównanie de facto do wartosci 1<<2 dlatego ze :
    bajt and (b0000 0010) (0x02) moze przyjmowac wartości b0000 0010 albo b0000 0000

    lepiej urzyć takiego porównania :

    if ( PINC & ( 1<<2) ) { spełnione gdy na pinie 2 bedzie VinH}

    po drugie to musisz zadeklarowac ten pin jako wyjscie. Nie wiem czy to robisz wczesniej.

    Mam nadzieje, że pomogłem
  • REKLAMA
  • #4 5304207
    PietrekDer
    Poziom 13  
    Witam
    Już rozwiązałem problem. Z jednej strony był to błąd w programie komputerowym (pisany w C++ Bulder 2k7 ), bo do wizualizacji stanów dwóch wejść używałem RadioButton (a może być aktywny tylko jeden w danym GroupBoxie), ale też problem wynikał z wiszącej nogi, niepodciągniętej do plusa, przez co raz wysyłał znak taki a raz inny.
    Mimo to dziękuję za próbę pomocy i pozdrawiam.
REKLAMA