www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RX Complete Interrupt wird nicht ausgelöst


Autor: Ahnungslos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir bitte jemand sagen, warum der USART- RX Complete Interrupt 
nicht ausgelöst wird?
Ich teste das ganze am STK500. Ich schalte in der ISR eine LED (zum 
Test). Die leuchtet jedoch nicht....
Die Routinen stammen von Ulrich Radig.
Danke!

UartTest.c:
#include <stdlib.h>
#include <avr/io.h>
#include <avr/interrupt.h>

#include "usart.h"

//----------------------------------------------------------------------------




int main(void)
{ 
  DDRC=0xFF;
  PORTC=0xFF;

  usart_init(9600);

  usart_write("Test");
  PORTC &= ~ (1<<PC0);

  sei();

}

Usart.c:
/*----------------------------------------------------------------------------
 Copyright:      Radig Ulrich  mailto: mail@ulrichradig.de
 Author:         Radig Ulrich
 Remarks:        
 known Problems: none
 Version:        14.06.2007
 Description:    RS232 Routinen
----------------------------------------------------------------------------*/

#include "usart.h"

volatile unsigned char buffercounter = 0;
char usart_rx_buffer[BUFFER_SIZE];

//----------------------------------------------------------------------------
//Init serielle Schnittstelle
void usart_init(unsigned int baudrate) 
{ 
    //Enable TXEN im Register UCR TX-Data Enable
  UCR =(1 << TXEN | 1 << RXEN | 1<< RXCIE);
  //Teiler wird gesetzt 
  UBRR=(SYSCLK / (baudrate * 16L) - 1);
}

//----------------------------------------------------------------------------
//Routine für die Serielle Ausgabe eines Zeichens
void usart_write_char(char c)
{
  if (c == '\n')
    usart_write_char('\r');
  //Warten solange bis Zeichen gesendet wurde
  while(!(USR & (1<<UDRE)));
  //Ausgabe des Zeichens
  UDR = c;
  return;
}

//------------------------------------------------------------------------------
void usart_write_P (const char *Buffer,...)
{
  va_list ap;
  va_start (ap, Buffer);  
  
  int format_flag;
  char str_buffer[10];
  char str_null_buffer[10];
  char move = 0;
  char Base = 0;
  int tmp = 0;
  char by;
  char *ptr;
    
  //Ausgabe der Zeichen
    for(;;)
  {
    by = pgm_read_byte(Buffer++);
    if(by==0) break; // end of format string
            
    if (by == '%')
    {
            by = pgm_read_byte(Buffer++);
      if (isdigit(by)>0)
        {
                                 
         str_null_buffer[0] = by;
        str_null_buffer[1] = '\0';
        move = atoi(str_null_buffer);
                by = pgm_read_byte(Buffer++);
        }

      switch (by)
        {
                case 's':
                    ptr = va_arg(ap,char *);
                    while(*ptr) { usart_write_char(*ptr++); }
                    break;
        case 'b':
          Base = 2;
          goto ConversionLoop;
        case 'c':
          //Int to char
          format_flag = va_arg(ap,int);
          usart_write_char (format_flag++);
          break;
        case 'i':
          Base = 10;
          goto ConversionLoop;
        case 'o':
          Base = 8;
          goto ConversionLoop;
        case 'x':
          Base = 16;
          //****************************
          ConversionLoop:
          //****************************
          itoa(va_arg(ap,int),str_buffer,Base);
          int b=0;
          while (str_buffer[b++] != 0){};
          b--;
          if (b<move)
            {
            move -=b;
            for (tmp = 0;tmp<move;tmp++)
              {
              str_null_buffer[tmp] = '0';
              }
            //tmp ++;
            str_null_buffer[tmp] = '\0';
            strcat(str_null_buffer,str_buffer);
            strcpy(str_buffer,str_null_buffer);
            }
          usart_write_str (str_buffer);
          move =0;
          break;
        }
      
      }  
    else
    {
      usart_write_char ( by );  
    }
  }
  va_end(ap);
}

//----------------------------------------------------------------------------
//Ausgabe eines Strings
void usart_write_str(char *str)
{
  while (*str)
  {
    usart_write_char(*str++);
  }
}

//Empfang eines Zeichens
ISR(USART_RXC_vect)
{  
    PORTC &= ~ (1<<PC1);         // Zur überprüfung ob ISR überhaupt aufgerufen wird
/*  unsigned char receive_char;
  receive_char = (UDR);

  if (usart_status.usart_ready)
  {
    usart_status.usart_rx_ovl = 1;
    return; 
  }

  if (receive_char == 13 && (!(usart_rx_buffer[buffercounter-1] == '\\')))
  {
      
    usart_rx_buffer[buffercounter] = 0;
    buffercounter = 0;
    usart_status.usart_ready = 1;
    return;    
  }

  if (buffercounter < BUFFER_SIZE - 1)
  {
    usart_rx_buffer[buffercounter++] = receive_char;    
  }
return; */
}

usart.h
/*----------------------------------------------------------------------------
 Copyright:      Radig Ulrich  mailto: mail@ulrichradig.de
 Author:         Radig Ulrich
 Remarks:        
 known Problems: none
 Version:        14.06.2007
 Description:    RS232 Routinen
----------------------------------------------------------------------------*/

#ifndef _UART_H
  #define _UART_H

#define BUFFER_SIZE  100

volatile unsigned char buffercounter;
char usart_rx_buffer[BUFFER_SIZE];

struct {
    volatile unsigned char usart_ready:1;
    volatile unsigned char usart_rx_ovl:1;
    }usart_status ;
    
//----------------------------------------------------------------------------
  
  #include <avr/interrupt.h>
  #include <avr/pgmspace.h>
  #include <stdlib.h>
  #include <stdarg.h>
  #include <ctype.h>
  #include <string.h>
  #include <avr/io.h>

//----------------------------------------------------------------------------

//Der Quarz auf dem Experimentierboard
#ifndef SYSCLK
    //#define SYSCLK  8000000  //Quarz Frequenz in Hz
    //#define SYSCLK  14318180  //Quarz Frequenz in Hz
    #define SYSCLK 4000000UL
#endif //SYSCLK  

//Anpassen der seriellen Schnittstellen Register wenn ein ATMega128 benutzt wird
#if defined (__AVR_ATmega128__)
#  define USR UCSR0A
#  define UCR UCSR0B
#  define UDR UDR0
#  define UBRR UBRR0L
#  define EICR EICRB
#endif

#if defined (__AVR_ATmega32__)
#  define USR UCSRA
#  define UCR UCSRB
#  define UBRR UBRRL
#  define EICR EICRB
#endif

#if defined (__AVR_ATmega8__)
#  define USR UCSRA
#  define UCR UCSRB
#  define UBRR UBRRL
#endif

#if defined (__AVR_ATmega8515__)  // by hubert
#  define USR UCSRA
#  define UCR UCSRB
#  define UBRR UBRRL
#endif

#if defined (__AVR_ATmega88__)
#  define USR UCSR0A
#  define UCR UCSR0B
#  define UBRR UBRR0L
#  define TXEN TXEN0
#  define UDR UDR0
#  define UDRE UDRE0
#endif

//----------------------------------------------------------------------------
  
void usart_init(unsigned int baudrate); 
void usart_write_char(char c);
void usart_write_str(char *str);
  
void usart_write_P (const char *Buffer,...);
#define usart_write(format, args...)   usart_write_P(PSTR(format) , ## args)
  
//----------------------------------------------------------------------------

#endif //_UART_H


Autor: Ahnungslos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Ausgabe funktioniert übrigens...

Autor: RyouArashi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beim Überfliegen würd ich spontan sagen "Da!".

UCR =(1 << TXEN | 1 << RXEN | 1<< RXCIE);

ich meine | hat ne höher Priorität als <<, d.h die Zeile ergibt unfug.

Versuchs mal so:
UCR =(1 << TXEN) | (1 << RXEN) | (1<< RXCIE);

Autor: Ahnungslos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, hab ich ausgebessert, funktioniert allerdings immer noch nicht.
Ahnungslos

Autor: RyouArashi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich seh grad, hab mich vertan, sorry

Autor: Daniel P. (ppowers)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist das tatsächlich Deine vollständige main???
Natürlich funktioniert das nicht! Der µC gibt ja auch nur den String 
über die serielle Schnittstelle aus und legt sich dann pennen.
Wie wärs mit einer while-Schleife oder ähnlichem?

Autor: Ahnungslos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AHhhhhhhhhhhhhhhhhh!!!
Danke!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.