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

[Atmega16][C] problem z RS

Mikemtb 08 Lut 2009 14:31 1107 4
REKLAMA
  • #1 6120826
    Mikemtb
    Poziom 12  
    Witam
    Mam problem z odpaleniem usarta na atmedze16. Problem tym bardziej irytujący, że już kiedyś to zrobiłem i myślałem, że teraz podłącze wszystko będzie śmigać. W sumie nie wiem gdzie sedno problemu, bo program ten sam, a wygląda tak:
    
    #include <avr/io.h> 
    #include <util/delay.h>
    #include <stdlib.h>
    #include <string.h>
    #define F_CPU 1000000UL                    // 1MHz wewnetrzny
    #define BAUD 9600UL                        // predkosc transmisji
    #define MYUBRR ((F_CPU/(16*BAUD))-1)
    
    void UART_init(unsigned int ubrr)         // inicjalizacja UArta
    {
       UBRRH = (unsigned char) (ubrr>>8);    // ustawienie prędkości transmisji
       UBRRL = (unsigned char) ubrr;
       UCSRB = (1<<RXEN)|(1<<TXEN);          // włączenie odbiornika oraz nadajnika
       UCSRC = (1<<URSEL)|(3<<UCSZ0);        // 8 bitów danych, 1 bity stopu, brak parzystości
    }
    
    void USART_out (unsigned char data)       // wysłanie pojedynczego znaku
    {
    	_delay_ms(1);
       while((UCSRA&(1<<UDRE)) == 0);
       UDR = data;
    }
    
    void wysString(unsigned char z[])
    {
       int i = 0;
       while(i < 64)
       {
          if( z[i] == '\0' ) break;
          USART_out(z[i++]);
       }
    }
    
    int main(void)
    {
    int numer = 23;
    
        char strTo[30] = "DC  ";    	
        char *strFrom[10];
    	itoa(numer, strFrom, 10);	//zamiana int na string
    	char *strGo = "V\r";
        strcat (strTo, strFrom);	//scalanie stringow
    	strcat (strTo, strGo);		//scalanie stringow
    	UART_init(MYUBRR);			//inicjacja Uarta
       while (1)
          {
            _delay_s(1);
    		wysString(strTo);
    		
          }
    return 0;
    } 
    


    Podłączenie zgodnie z:

    [Atmega16][C] problem z RS

    Po pierwsze wysyłanie ma jakieś problemy i musiałem dać to delay 1ms, po drugie, niby coś tam wysyła, ale w hyperterminal, są krzaki typu u umlaut i E z kreseczką :P

    Jakieś wskazówki? Takie objawy mogą na coś wskazywać, układ to dokładnie max232CPE
  • REKLAMA
  • REKLAMA
  • #3 6121660
    Mikemtb
    Poziom 12  
    To 100nF gdzie ma być? Mam 10uF (taki miałem :P ) pomiędzy vcc i gnd maxa.
    Pojemności się wpięte dobrze, polaryzacje chyba z 10 razy sprawdzałem...no chyba że jakaś jest walnięta..no ale prawdopodobieństwo chyba małe?
    Zapętliłem ( 8<->7, 4<->6), ale nic to nie dało oprócz świecenia się kontrolek CTS i DSR w programie realterm :P ( notabene ten program nie podaje że jest error, wszystko jest niby ok, tylko krzaki zamiast danych).

    Częstotliwość to było pierwsze co sprawdziłem :P

    Jeżeli to coś pomoże to na nóżce V+10V jest 9,33V, a na transmit waha się pomiędzy 8,9 a 8,6 w zależności od tego czy nadaje. Nie za mało?

    edit:
    Już sam nie wiem, niby jest wszystko dobrze, ale nie do końca. Przykładowo wysyłam stringa "ABCAA" a otrzymuje:
    [Atmega16][C] problem z RS

    czyli niby krzaczki są odpowiednie dla odpowiedniej literki...może jakieś kodowanie czy coś...no ale sam nie wiem, to raczej nie ten poziom.
  • REKLAMA
  • Pomocny post
    #4 6122135
    kedzi1
    Poziom 18  
    Problem w tym, że ta prędkość nie jest do uzyskania na tym kwarcu. Dla UBRR = 6 błąd wynosi ponad 7%. Na moje oko prekompilator wyliczy UBRR = 5 (jak zaokrąglimy wynik działania w dół). Dobierz inny kwarc bo będą na pewno problemy z tą prędkością. Sprawdź z inną niższą prędkością czy działa (4800 dla UBRR=12 - 0,2%ERR).

    A i jeszcze jedno: można ustawić bit U2X w UCSRA, dać UBRR12 wtedy mamy 9600b z błędem 0,2% czyli jak najbardziej OK.
  • #5 6122501
    Mikemtb
    Poziom 12  
    Ooo dziękuję bardzo, zmiana prędkości transmisji pomogła. Nawet mi przez myśl nie przeszło, że to przez prędkość transmisji ( fakt faktem, że kiedyś jak mi to działało to robiłem na 4Mhz).
REKLAMA