-         

Ergebnis 1 bis 4 von 4

Thema: ATmega32 UART Problem

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    26.09.2011
    Beiträge
    7

    ATmega32 UART Problem

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo Zusammen,

    ich habe ein Problem mit dem UART von meinem ATmega32.
    Sobald durch ein uart_putc() der Interrupt für UDR empty aktiviert wird hängt sich der gesammte AVR auf. Woran könnte das liegen? Im Terminal kommt nichts an und der Controller beginnt auch nicht zu blinken. Mein Code sieht momentan so aus.

    Code:
    ISR(UART_TX_VECTOR)
    {
        if(uart_tx_read == uart_tx_write)
        {
            UART_STATUS_B &= ~(1 << 5);
            return;
        }
    
        UART_UDR = uart_tx_buffer[uart_tx_read];
    
        uart_tx_read++;
    
        if(uart_tx_read >= UART_BUFFER_SIZE)
        {
            uart_tx_read = 0;
        }
    }
    
    void uart_init(long baud)
    {
        //Senden aktivieren
        UART_STATUS_B |= (1 << 3);
    
        //Empfang aktivieren
        UART_STATUS_B |= (1 << 4);
    
        //Baud setzen
        short UBRR = (F_CPU/(16*baud))-1;
        UART_BAUD_HIGH = UBRR >> 8;
        UART_BAUD_LOW = UBRR & 0xFF;
        UART_STATUS_C();
    
        //Interrupts global aktivieren
        sei();
    
        //Empfangsinterrupt aktivieren
        UART_STATUS_B |= (1 << 7);
    
        //Bufferzeiger setzen
        uart_tx_read = 0;
        uart_tx_write = 0;
    
        uart_rx_read = 0;
        uart_rx_write = 0;
    
    }
    
    
    unsigned char uart_putc(char c)
    {
        if(uart_tx_write + 1 == uart_tx_read || (uart_tx_read == 0 && uart_tx_write + 1 == UART_BUFFER_SIZE))
        {
            return 1;
        }
    
        uart_tx_buffer[uart_tx_write] = c;
    	uart_tx_write++;
    
        if(uart_tx_write >= UART_BUFFER_SIZE)
        {
            uart_tx_write = 0;
        }
    
    	UART_STATUS_B |= 1 << 5;
    
        return 0;
    }
    Die zugehörigen Includes
    Code:
    //ATmega32
    #if defined (__AVR_ATmega32__)
        #define UART_TX_VECTOR USART_UDRE_vect
        #define UART_RX_VECTOR USART_RXC_vect
        #define UART_UDR UDR
        #define UART_STATUS_B UCSRB
        #define UART_BAUD_HIGH UBRRH
        #define UART_BAUD_LOW UBRRL
        #define UART_STATUS_C()
    #endif
    und die Main:
    Code:
    #include <avr/io.h>
    #include <util/delay.h>
    #include "uart.h"
    
    
    int main(void)
    {
    	uart_init(9600);
    
    	uart_putc('a');
    
    	DDRC = 0x0F;
    	while(1)
    	{
    		PORTC |= 0x0F;
    		_delay_ms(500);
    		PORTC &= ~(0x0F);
    		_delay_ms(500);
    	}
    
    	return 0;
    }
    Geändert von loewe.xy (27.01.2013 um 18:50 Uhr) Grund: Angaben korrigiert

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.183
    Hier sollte es doch anstelle von :

    #define UART_TX_VECTOR USART_UDRE_vect
    so heißen:
    #define UART_TX_VECTOR USART_TXC_vect
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    26.09.2011
    Beiträge
    7
    Ändert nichts an meinem Problem. Aber eigentlich soll auch das UDR nachgefüllt werden sobald es leer ist und nicht erst wenn er fertig gesendet hat. Der name für das Define ist da etwas unglücklich gewählt.

    Gruß Lukas

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.183
    Es ist etwas spät und mühsam herauszusuchen wie das Bit heist (1<<5). Es ist sicher nicht mehr Aufwand den Namen hinzuschreiben.
    Geh deinen Ablauf durch und lass schrittweise eine Led aufleuchten dann weisst du wo du zum Stehen kommst.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

Ähnliche Themen

  1. [ERLEDIGT] BTM222 <-UART-> ATmega32 Problem
    Von robo_tom_24 im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 29.05.2012, 23:31
  2. ATmega32 mit zwei UART's
    Von Mauro im Forum AVR Hardwarethemen
    Antworten: 14
    Letzter Beitrag: 19.05.2010, 20:54
  3. ATMega32 UART problem --> Problem gelöst
    Von ChristophB im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 12.03.2010, 19:45
  4. ATmega32 Problem UART Reihenfolge Register
    Von vajk im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 20.09.2009, 18:54
  5. nochmal: 1x PC, 2x UART (ATMEGA32)
    Von boeseTURBO-CT im Forum AVR Hardwarethemen
    Antworten: 33
    Letzter Beitrag: 27.08.2004, 09:49

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •