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

Brak odpowiedzi na wysłany komunikat ATiny2313

Belor 12 Lis 2009 13:18 1427 6
  • #1 7249831
    Belor
    Poziom 12  
    Witam,

    Chciałem sprawdzić czy będę dostawał odpowiedzi na wysłany komunikat. W tym calu wrzuciłem poniższy program na ATiny2313.

    #include <avr/io.h>
    #include <inttypes.h>
    
    //This function is used to initialize the USART
    //at a given UBRR value
    void USARTInit(uint16_t ubrr_value)
    {
    
       //Set Baud rate
    
       UBRRL = ubrr_value;
       UBRRH = (ubrr_value>>8);
    
       /*Set Frame Format
    
    
       >> Asynchronous mode
       >> No Parity
       >> 1 StopBit
    
       >> char size 8
    
       */
    
      // UCSRC=(1<<URSEL)|(3<<UCSZ0);
    
    
       //Enable The receiver and transmitter
    
       UCSRB=(1<<RXEN)|(1<<TXEN);
    
    
    }
    
    
    //This function is used to read the available data
    //from USART. This function will wait untill data is
    //available.
    char USARTReadChar()
    {
       //Wait untill a data is available
    
       while(!(UCSRA & (1<<RXC)))
       {
          //Do nothing
       }
    
       //Now USART has got data from host
       //and is available is buffer
    
       return UDR;
    }
    
    
    //This fuction writes the given "data" to
    //the USART which then transmit it via TX line
    void USARTWriteChar(char data)
    {
       //Wait untill the transmitter is ready
    
       while(!(UCSRA & (1<<UDRE)))
       {
          //Do nothing
       }
    
       //Now write the data to USART buffer
    
       UDR=data;
    }
    
    void main()
    {
       //This DEMO program will demonstrate the use of simple
    
       //function for using the USART for data communication
    
       //Varriable Declaration
       char data;
    
       /*First Initialize the USART with baud rate = 19200bps
       
       for Baud rate = 19200bps
    
       UBRR value = 51
    
       */
    
       USARTInit(51);    //UBRR = 51
    
       //Loop forever
    
       while(1)
       {
          //Read data
          data=USARTReadChar();
    
          /* Now send the same data but but surround it in
          square bracket. For example if user sent 'a' our
          system will echo back '[a]'.
    
          */
    
          USARTWriteChar('[');
          USARTWriteChar(data);
          USARTWriteChar(']');
    
       }
    }


    Niestety nie zależnie co wyślę dostaje cały czas taką samą odpowiedź i za bardzo nie wiem co jest nie tak :( Czy byłby w stanie ktoś pomóc?

    Brak odpowiedzi na wysłany komunikat ATiny2313
  • #2 7250558
    m.bartczak
    Poziom 16  
    Na początek - czemu:

    
     // UCSRC=(1<<URSEL)|(3<<UCSZ0); 
    


    jest zakomentowane?

    Drugie pytanie: jaki masz zegar w AVR? Bo z tego co widzę musisz mieć 16MHz (na tyle ustawiasz UBRR)
  • #3 7250822
    BoskiDialer
    Poziom 34  
    W zasadzie kod jest na tyle prosty (tylko komentarze zmniejszają czytelność), że nie ma miejsca na błąd - prawdopodobnie pojawiają się problemy z częstotliwością pracy procesora.

    m.bartczak: Tamta linijka prawdopodobnie jest zakomentowana, gdyż z nią program nie będzie się kompilował bez minimalnej edycji - tutaj nie ma bitu URSEL. Wartość domyślna jest zgodna z tym co teoretycznie powinno być wpisane.

    Obstawiam źle ustawione fusebity lub złą wartość przy USARTInit().
  • #4 7253144
    Belor
    Poziom 12  
    m.bartczak napisał:
    Na początek - czemu:

    
     // UCSRC=(1<<URSEL)|(3<<UCSZ0); 
    


    jest zakomentowane?


    Ponieważ tak jak kolega poniżej zauważył nie ma bitu URSEL i program go nie kompiluje tylko wyrzuca błąd.
    m.bartczak napisał:

    Drugie pytanie: jaki masz zegar w AVR? Bo z tego co widzę musisz mieć 16MHz (na tyle ustawiasz UBRR)


    Używam wewnętrznego zegara 8MHz bez kwarcu na zewnątrz. A co Wy na to że kompilator źle kompiluje?

    Dodano po 15 [minuty]:

    [quote="BoskiDialer"]W zasadzie kod jest na tyle prosty (tylko komentarze zmniejszają czytelność), że nie ma miejsca na błąd - prawdopodobnie pojawiają się problemy z częstotliwością pracy procesora.

    m.bartczak: Tamta linijka prawdopodobnie jest zakomentowana, gdyż z nią program nie będzie się kompilował bez minimalnej edycji - tutaj nie ma bitu URSEL. Wartość domyślna jest zgodna z tym co teoretycznie powinno być wpisane.

    BoskiDialer napisał:
    Obstawiam źle ustawione fusebity lub złą wartość przy USARTInit().
    fusebity są moim zdaniem ok (Calibrated internal RC Oscillator 8MHz 0100), a USART to UBRR=(fOSC/8BAUD)– 1, wychodzi 51 zreszta w tabelach też tak jest
  • #5 7254339
    m.bartczak
    Poziom 16  
    URSEL, jak BoskiDialer zauważył, nie istnieje w tym mikrokontrolerze. Powinieneś ustawić:

    
    UCSRC=3<<UCSZ0;
    


    Dodatkowo, jeżeli masz 8MHz AVR, to dla prędkości 19200 UBRR=25, 51 tylko jak ustawisz U2X w UCSRA.
  • #6 7275478
    Belor
    Poziom 12  
    m.bartczak napisał:
    URSEL, jak BoskiDialer zauważył, nie istnieje w tym mikrokontrolerze. Powinieneś ustawić:

    
    UCSRC=3<<UCSZ0;
    


    Dodatkowo, jeżeli masz 8MHz AVR, to dla prędkości 19200 UBRR=25, 51 tylko jak ustawisz U2X w UCSRA.


    Czyli zamiast "UCSRC=(1<<URSEL)|(3<<UCSZ0); " mam wstawic "UCSRC=3<<UCSZ0;" ? i sprobowac wtedy?

    Co do Prędkości to robie to na 9600 komantarz tylko źle sotał wpisany.
  • #7 7537603
    Belor
    Poziom 12  
    Witam,

    Dołożyłem zewnętrzny kwarc kondensator rpzy zasilaniu i wszytko działa:)Dzieki za pomoc!
REKLAMA