Forum: Mikrocontroller und Digitale Elektronik UART empfaengt nix


von Johannes (Gast)


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!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.