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

samoczynny reset po wysłaniu tekstu przez uart [m128][winavr

AVRowiec 01 Lut 2010 04:15 1236 4
REKLAMA
  • #1 7625059
    AVRowiec
    Poziom 18  
    Mam bardzo dziwny problem. Dziwny o tyle że ten sam program na niemal identycznym układzie działa a teraz nie chce.
    Wysyłam znaki na uart za pomocą procedury:

    void TS(char * line)
    {
       USART0_Transmit_Word(line);
       USART0_Transmit(0x0D);
       USART0_Transmit(0x0A); [b]<--- ta linijka psuje wszystko - jeśli wywołam tą funkcje dwa razy z rzędu program się restartuje, why?![/b]
       
    }


    void USART0_Transmit( unsigned char data )
    {
    /* Wait for empty transmit buffer */
    while ( !( UCSR0A & (1<<UDRE)) )
    ;
    /* Put data into buffer, sends the data */
    UDR0 = data;
    }
    /////////////////////////////////////////////////////
    void USART0_Transmit_Word(char *data)
    {
       while (*data)
         USART0_Transmit(*data++);
    }


    W mainie wygląda to tak:
    
    main {
    
    TS("start");TS("123");
    while (1)
    {
    TS("xxx");
     LED5_TOGGLE;
     _delay_ms(200);
    
    }


    Uart inicjowany jest wg datasheeta więc napewno jest poprawny.

    #define FOSC 8000000      // Clock Speed
    #define BAUD_UART0 19200  
    #define BAUD_UART1 9600   
    #define USART0PORT PORTE
    #define USART0DDR  DDRE
    #define RX0PIN 0
    #define TX0PIN 1
    #define USART1PORT PORTD
    #define USART1DDR  DDRD
    #define RX1PIN 2
    #define TX1PIN 3
    //////////////////////////////////////////////////////
    void USARTs_Init()
    {
    	unsigned int ubrr = FOSC/16/BAUD_UART1-1;
    	/* Set baud rate */
    	UBRR1H = (unsigned char)(ubrr>>8);
    	UBRR1L = (unsigned char)ubrr;
    	/* Enable receiver and transmitter */
    	UCSR1B = (1<<RXCIE1)|(1<<RXEN1)|(1<<TXEN1);
    	/* Set frame format: 8data, 1stop bit */
    	UCSR1C = (3<<UCSZ10);
    
    	ubrr = FOSC/16/BAUD_UART0-1;
    	/* Set baud rate */
    	UBRR0H = (unsigned char)(ubrr>>8);
    	UBRR0L = (unsigned char)ubrr;
    	/* Enable receiver and transmitter */
    	UCSR0B = (1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0);
    	/* Set frame format: 8data, 1stop bit */
    	UCSR0C = (3<<UCSZ00);
    
        // Ustawienie portów
    	// DDR
        USART0DDR |=  _BV(RX0PIN);
    	USART0DDR &= ~_BV(TX0PIN);  
    	USART1DDR |=  _BV(RX1PIN);
    	USART1DDR &= ~_BV(TX1PIN);
    	// PORT
    	USART0PORT |= _BV(RX0PIN);
    	USART0PORT |= _BV(TX0PIN);  
    	USART1PORT |= _BV(RX1PIN);
    	USART1PORT |= _BV(TX1PIN);
    }


    To wersja bardziej rozbudowana ale nawet po wyrzuceniu tego co niepotrzebne dzieje się to samo a mianowicie:


    Czy ktoś ma pojęcie o co może tutaj chodzić? Dlaczego wysłanie znaku restartuje procla? przecież bufer sie nie przepełnia ;/ (/* Wait for empty transmit buffer */
    while ( !( UCSR0A & (1<<UDRE)) ) )

    Dodano po 1 [godziny] 4 [minuty]:

    czy zamiast UDRE nie powinno być UDRE0 ?

    dałem UDRE0 i nadal dzieje się to samo :(
  • REKLAMA
  • #2 7625934
    marekos
    Poziom 16  
    Wyłącz przerwanie od przychodzącego znaku.
  • REKLAMA
  • #3 7626651
    AVRowiec
    Poziom 18  
    przerwanie musi pracować. sei() włączone.
  • REKLAMA
  • #4 7626826
    Konto nie istnieje
    Poziom 1  
  • #5 7626985
    AVRowiec
    Poziom 18  
    znalazłem problem.

    efuse nie był ustawiony

    domyślnie jest 0xFD czyli kompatybilność z atmega103 włączona,
    trzeba ją wyłączyć bo inaczej dzieją się takie jaja.

    dałem 0xFF i wszystko gra.

    dziękować za pomoc.
REKLAMA