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][UART] Co robię źle?

karol75 25 Kwi 2009 17:10 2363 2
REKLAMA
  • #1 6455713
    karol75
    Poziom 16  
    Mam problem z UART w ATMEGA162 16PU
    Procesor z kwarcem 11059200 Hz zasilany 3,3V
    Potrzebuje prędkość 9600 b/s



    
    #include <avr/io.h> 
    #include<inttypes.h>
    #include<avr/interrupt.h> 
    #include <util/delay.h>
    #include <avr/wdt.h>
    //#include"../lib/rs232.h"
    
    #define FOSC 11059000// Clock Speed 
    #define BAUD 9600 
    #define MYUBRR FOSC/16/BAUD-1 
    
    void USART0_Init( unsigned int ubrr ) 
    { 
    /* Set baud rate */ 
    UBRR0H = (unsigned char)(ubrr>>8); 
    UBRR0L = (unsigned char)ubrr; 
    /* Enable receiver and transmitter */ 
    UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0); 
    /* Set frame format: 8data, 2stop bit */ 
    UCSR0C = (1<<URSEL0)|(1<<USBS0)|(3<<UCSZ00);
     
    } 
    
    
    void USART0_Transmit( unsigned char data ) 
    { 
    /* Wait for empty transmit buffer */ 
    while ( !( UCSR0A & (1<<UDRE0))); 
    /* Put data into buffer, sends the data */ 
    UDR0 = data; 
    } 
    
    unsigned char USART0_Receive( void )
    {
    /* Wait for data to be received */
    while ( !(UCSR0A & (1<<RXC0)) );
    /* Get and return received data from buffer */
    return UDR0;
    }
    
    volatile char n;
    
    SIGNAL(SIG_UART0_RECV)
    { 
      
      //PORTB=0x00;
      n=UDR0;
      //UCSR0A &= ~_BV(RXC0);
    }
    
    int main( void ) 
    { 
    DDRB= 0xFF;
    PORTB=0xFF;
    
    USART0_Init(MYUBRR); 
    //sei(); 
    n=0; 
    while(1) 
    { 
      n=USART0_Receive();
      USART0_Transmit(n);
    } 
    return 0; 
    }
    
    


    To jest bez przerwań
    To jest bez przerwań i działa czyli w terminalu wraca to co wysyłam.

    Niestety potrzebuję tego w przerwaniach
    I robię tak
    Odznaczam sei();

    I usuwam zwykły odczyt i odesłanie co PC
    Czyli usuwam linie
    n=USART0_Receive();

    I po wysłaniu czegokolwiek do ATMEGI układ nie daje znaku życia dioda przestaje reagować.
    Co robię źle?
  • REKLAMA
  • Pomocny post
    #2 6455808
    BoskiDialer
    Poziom 34  
    Nie masz funkcji obsługi przerwania od usartu, przez co po wystąpieniu przerwania procesor się resetuje. Brak funkcji obsługi wynika ze złej nazwy: jest SIG_UART0_RECV a powinno być SIG_USART0_RECV (lub USART0_RXC_vect). Warto czasem zobaczyć co w iom162.h siedzi.
  • #3 6455835
    karol75
    Poziom 16  
    Proszę ile może zmienić jedna Litera.
    Dla ciebie pomógł.
REKLAMA