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

[Atmega162][C]ustawienie USART w tryb synchroniczny

deviland 11 Wrz 2008 19:40 1290 1
REKLAMA
  • #1 5526364
    deviland
    Poziom 10  
    witam,

    od godzinki walcze z ustawieniem USART1 w tryb synchroniczny w mojej Atmedze 162. Po przeczytaniu pdf'a wnioskuje, ze ustawiam UMSEL = 1 oraz XCK na 1 lub 0 w zaleznosci od tego czy master czy slave. Czyli ze jak ustawie XCK1 jako wyjscie to atmega powinna generowac sygnal zegarowy synchronizujacy transmisje. Niestety podpinam oscyloskop i nie ma zadnego sygnalu ....

    
    #include <avr/io.h>
    
    
    #define USART_BAUDRATE 9600
    #define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 2UL))) - 1)
    
    int main (void)
    {
       char ReceivedByte;
    
       UCSR1B |= (1 << RXEN1) | (1 << TXEN1);   // Turn on the transmission and reception circuitry
       UCSR1C |= (1 << UMSEL1) | (1 << UCSZ10) | (1 << UCSZ11) | (0 << UCPOL1); // Use 8-bit character sizes
    
       UBRR1L = BAUD_PRESCALE; // Load lower 8-bits of the baud rate value into the low byte of the UBRR register
       UBRR1H = (BAUD_PRESCALE >>8 ) ; // Load upper 8-bits of the baud rate value into the high byte of the UBRR register
    
       //DDRD |= (1 << PD2);  // pin XCK1 jako wyjście
       DDRD |= 0 << DDD2;
       
       for (;;) // Loop forever
       {
          while ((UCSR1A & (1 << RXC1)) == 0) {}; // Do nothing until data have been recieved and is ready to be read from UDR
          ReceivedByte = UDR1; // Fetch the recieved byte value into the variable "ByteReceived"
    
          while ((UCSR1A & (1 << UDRE1)) == 0) {}; // Do nothing until UDR is ready for more data to be written to it
          UDR1 = ReceivedByte; // Echo back the received byte back to the computer
       }   
    } 
    


    Czy mam dobrze skonfigurowany USART ?
  • REKLAMA
  • #2 5529674
    HIOB
    Poziom 17  
    Witam,

    Teraz będzie działało:

    
    #include <avr/io.h> 
    
    
    #define USART_BAUDRATE 9600 
    #define BAUD_PRESCALE ((F_CPU / (USART_BAUDRATE * 2)) - 1) 
    
    
    int main (void) 
    { 
       char ReceivedByte; 
    
       UBRR1L = BAUD_PRESCALE;
       UBRR1H = (BAUD_PRESCALE >> 8);
    
       UCSR1B |= (1 << RXEN1) | (1 << TXEN1);
       UCSR1C |= (1 << URSEL1) | (1 << UMSEL1) | (1 << UCSZ10) | (1 << UCSZ11);
    
       DDRD |= (1 << PD2);
    
       for (;;)
       {
          while ((UCSR1A & (1 << RXC1)) == 0) {};
    
          ReceivedByte = UDR1;
    
          while ((UCSR1A & (1 << UDRE1)) == 0) {};
    
          UDR1 = ReceivedByte;
       }
    }
    


    Zakładam, że transmisja ma być prowadzona: 8bit/brak bitu kontroli/1stop/rosnące zbocze na XCK

    Pozdrawiam;
    Hiob.
REKLAMA