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

Atmega 16 + RS232 problem z nadawaniem w C

9xxx 26 Gru 2010 12:11 1522 4
REKLAMA
  • #1 8914033
    9xxx
    Poziom 10  
    Witam, napisałem prosty program w C, który ma za zadanie odebrać znak z komputera, zasygnalizować to, a następnie odesłać ten sam znak do komputera (echo). Odbiór danych jest w porządku (działa sygnalizacja diodami), natomiast dane nie są odsyłane do komputera. Zapewne problem jest banalny, ale nie mogę znaleźć rozwiązania. Nie korzystam z kwarcu zewnętrznego, ale to chyba nie powinno być problemem?
    
    #include <avr/io.h> 
    #include <inttypes.h>  
    #include <stdlib.h>
     
    
    #define F_CPU 1000000
    #define BAUD 9600
    #define MYUBRR F_CPU / 16 / BAUD - 1
    
    
    //Inicjalizacja UART
    
    void USART_Init(unsigned int ubrr)
    {
    
    UBRRH=(unsigned char)(ubrr>>8);
    UBRRL=(unsigned char) ubrr;
    UCSRB=(1<<RXEN)|(1<<TXEN);
    UCSRC=(1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
    }
    
    //Odbiór danych
    
    unsigned char odbierz(void)
    {
    while(!(UCSRA & (1<<RXC)));
    return UDR;
    }
    
    //Wysyłanie danych
    
    void nadajznak(unsigned char dana)
    {
    while(!(UCSRA & (1<<UDRE)));
    UDR=dana;
    }
    
    
    
    int main (void)
    {
    char odebrano;
    
    USART_Init(MYUBRR);
    DDRC=0xFF;
    PORTC=0xFF;
    
    for(;;)
    {
    odebrano=odbierz();		
    if(odebrano==0x31)		//Jeśli odebrano 1 to gasi jedną diodę i nadaje echo
    {
    PORTC=0xFF, 
    PORTC=~_BV(1); 
    nadajznak(odebrano);
    }
    if(odebrano==0x32)		//Jeśli odebrano 2 to gasi inną diodę i nadaje echo
    {
    PORTC=0xFF; 
    PORTC=~_BV(2); 
    nadajznak(odebrano);
    }
    }
    }
    
  • REKLAMA
  • Pomocny post
    #2 8914458
    Fredy
    Poziom 27  
    Jak masz oscyloskop to sprawdź czy na wyjściu TXD nie ma sygnału, może problem jest po stronie sprzętowej ( sprawdź podłączenie do MAXa 232).
    No i nie wiem czy wiesz ale ustawiłeś tam na nadawaniu 2 bity stopu.
  • REKLAMA
  • #3 8914973
    9xxx
    Poziom 10  
    Dzięki wielkie, wymienię maxa na nowego i zobacze czy pomoże (niestety dopiero jutro jak kupię), myślałem, że może to wina programu. A co do ustawień transmisji to wiem, ale dzięki za uwagę :)
  • REKLAMA
  • #4 8919251
    Krauser
    Poziom 26  
    Dla 1 MHz przy pojedynczej prędkości 9600 bodów to za dużo.
  • #5 8919634
    9xxx
    Poziom 10  
    Udało mi się to rozwiązać. Faktycznie max był uszkodzony. Wymiana na nowy pomogła chociaż nie bez problemów, ale na szczęście działa. 9600 faktycznie okazało się za szybkie (czasem powstają przekłamania ale nie zawsze), zmieniłem na 4800 i jest bez problemu. Dzięki, za pomoc. Zamykam
REKLAMA