www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART empfaengt nix


Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hab eine kleine Anwendung mit einem UART am ATMega16 gemacht.
Leider springt er beim SIG_UART_RECV-Interrupt nicht in die
entsprechende ISR. Kann mir jemand sagen was an meinem Code falsch
ist?

#include <avr/io.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

#include <delayms.c>

#ifndef F_CPU
#define F_CPU 16000000           /* Oszillator-Frequenz in Hz */
#endif
#define UART_BAUD_RATE 9600
#define UART_BAUD_CALC(UART_BAUD_RATE,F_OSC)
((F_CPU)/((UART_BAUD_RATE)*16L)-1)

//globals
volatile uint8_t command[4];
volatile uint8_t sreg_temp;
volatile uint8_t bytecountSen;


SIGNAL(SIG_UART_TRANS)
//ISR for transmitting via serial Interface
{
  if (bytecountSen==3)  //bytes 0 bis 2 sind gesendet, also die 3 byte
des Befehls
      bytecountSen==0;
  else
    {
      //while (!(UCSRA & (1<<UDRE)));    //warten bis Senden moeglich
      UDR = command[bytecountSen];    //der hier erzeugte Interrupt zird
getsartet nachdem
      bytecountSen++;            //dies ISR abgearbeitet ist.
    }
}

SIGNAL(SIG_UART_RECV)
//§§§ Hier springt derATMega leider nicht hinein wenn ich ein Zeichen
//schick (via Br@y++ Terminal)
{
uint8_t data;
PORTC = 0xFF;
data = UDR;
 switch (data)
 {
   case 'a': {ToggleBit(PORTC,PC0); break;}
   case 'b': {ToggleBit(PORTC,PC1); break;}
   case 'c': {ToggleBit(PORTC,PC2); break;}
   case 'd': {ToggleBit(PORTC,PC3); break;}
   default : {PORTC = 0x00;}
 }
}

int main(void)
{
//uint8_t i;

//Initialization UART
UBRRH=(uint8_t)(UART_BAUD_CALC(UART_BAUD_RATE,F_CPU)>>8);
UBRRL=(uint8_t)UART_BAUD_CALC(UART_BAUD_RATE,F_CPU);

UCSRB |= (1<<RXEN) | (1<<TXEN);   //enable RxD & TxD
UCSRB |= (1<<RXCIE) | (1<<TXCIE); //enable interrupts

//command generation
command[0] = 0xff;
command[1] = 0x01;
command[2] = 0x34;
command[3] = 0x00;

sei();
DDRC = 0xFF; //PortC = Ausgang
PORTC = 0x00; //PortC = alles auf Null (LEDs leuchten nicht)

//main loop
  for(;;)
   {
  ommand[2] = 0x32;  //50
  bytecountSen = 1;
  UDR = command[0];
        delayms(300);

  command[2] = 0x7F;  //127
  bytecountSen = 1;
  UDR = command[0];
        delayms(300);
 }
}


danke fuer hinweise!

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.