Forum: Mikrocontroller und Digitale Elektronik ATmega 32 interrupt RXC_vect funktioniert nicht


von geist (Gast)


Lesenswert?

Hallo,

kann mir einer helfen ich bin kurz vorm verzweifeln.

Ich möchte, wenn ein Zeichen über USART emfangen wurde, per Interrupt 
ein Zeichen zurück gesendet bekommen, allerdings geht das nicht.
Wieso auch immer ka.
1
#define F_CPU 16000000UL
2
3
#include <avr/io.h>
4
#include <avr/interrupt.h>
5
#include <util/delay.h>
6
#include <stdlib.h>
7
8
//USART initialisieren
9
void USART0_Init (int BaudRate)
10
{  int ubrr0 = (F_CPU / 16 / BaudRate - 1);         // Baudrate UART0 einstellen  
11
  
12
  UBRRH = (unsigned char)(ubrr0>>8);
13
  UBRRL = (unsigned char)ubrr0;
14
         
15
  UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);                  // UART0 Frame Format einstellen: 8data, 1 Stop-bit, keine Parity 
16
  UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);          // UART0 Receiver und Transmitter einschalten inturrupt RXC eingeschaltet
17
}
18
19
//Prüfen, ob Zeichen empfangen wurde, dann Rückgabe, ansonsten Rückgabewert -1
20
int16_t USART_Receive (void)
21
{  //prüfen, ob Zeichen empfangen wurde
22
  if (UCSRA & (1<<RXC))
23
  {  return (UDR);
24
  }
25
  else
26
  {  return (-1);
27
  }
28
}
29
30
//Zeichen senden
31
void USART_Transmit( unsigned char data )
32
{  /* Wait for empty transmit buffer */
33
  while ( !( UCSRA & (1<<UDRE)) );
34
  {
35
    /* Put data into buffer, sends the data */
36
    UDR = data;
37
  }
38
}
39
40
/Gibt eine Zeichenkette mit maximal 29 Zeichen aus (realisiert mit char-Array)
41
void USART_String_ausgeben (char Zeichenkette [30])
42
{  uint8_t  i=0;
43
  
44
  while (Zeichenkette [i] != 0)
45
  {  USART_Transmit (Zeichenkette [i]);
46
    i++;
47
  }
48
}
49
50
ISR(USART_RXC_vect)
51
{  
52
  USART_String_ausgeben("empfangen");
53
  USART_Transmit (13);  
54
}
55
56
int main(void)
57
{
58
//Usart mit 9600 baud initalisieren
59
USART0_Init(9600UL);
60
sei();
61
}

Gruß geist

von Karl H. (kbuchegg)


Lesenswert?

geist schrieb:

> int main(void)
> {
> //Usart mit 9600 baud initalisieren
> USART0_Init(9600UL);
> sei();
> }
> [/c]


Mach da mal die obligate Endlosschleife rein.
Du willst auf keinen Fall haben, dass dein Programm jemals aus main() 
rauskommt!

von geist (Gast)


Lesenswert?

Danke,

da wäre ich bestimmt nicht mehr drauf gekommen.

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.