Forum: Mikrocontroller und Digitale Elektronik ATtiny2313 + UART + Empfangen + Problem


von Phil (Gast)


Lesenswert?

Hallo!

Habe ein kleines Problem:
Wenn ich vom Computer eine '9' sende, will ich, dass der AVR eine '9' 
zurücksendet.
Leider funktioniert der Code nicht - vielleicht kann mir wer helfen, 
danke!
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <util/delay.h>
4
5
extern void init_io(void);
6
void USART_Init( unsigned int baud );
7
void USART_Transmit( unsigned int data );
8
unsigned char USART_Receive( void );
9
10
int x;
11
unsigned char zeichen;
12
13
int main(void)
14
{
15
  //cli();
16
  init_io();
17
  //init_timer0();
18
  //sei();
19
20
  USART_Init(9600);
21
22
  for(x=0;x<3;x++)
23
  {
24
    PORTD|=(1<<PD6);
25
    _delay_ms(200);
26
    PORTD &=~(1<<PD6);
27
    _delay_ms(200);
28
  }
29
30
  USART_Transmit('9');
31
32
  while(1)
33
    {  
34
    PORTD|=(1<<PD6);
35
    if(PINB & (1<<PINB0))
36
    {
37
      USART_Transmit('1');
38
      while(PINB & (1<<PINB0));
39
      _delay_ms(300);
40
    }
41
    if(PINB & (1<<PINB1))
42
    {
43
      USART_Transmit('2');
44
      while(PINB & (1<<PINB1));
45
      _delay_ms(300);
46
    }
47
    if(PINB & (1<<PINB2))
48
    {
49
      USART_Transmit('3');
50
      while(PINB & (1<<PINB2));
51
      _delay_ms(300);
52
    }
53
    if(PINB & (1<<PINB3))
54
    {
55
      USART_Transmit('4');
56
      while(PINB & (1<<PINB3));
57
      _delay_ms(300);
58
    }
59
    zeichen=USART_Receive();
60
    }
61
}
62
63
      
64
//-------
65
//INIT_IO
66
//-------
67
//Initialisierung der Port-Pins
68
void init_io(void)
69
{
70
  DDRD |= 0xFF;
71
  DDRB |= 0x00;
72
}
73
74
void USART_Init( unsigned int baud )
75
{
76
 
77
    UBRRH = 0;
78
    UBRRL = 12;
79
  /* Enable receiver and transmitter */
80
  UCSRB = (1<<RXEN)|(1<<TXEN);
81
  /* Set frame format: 8data, 2stop bit */
82
  UCSRC = (1<<USBS)|(3<<UCSZ0);
83
}
84
85
void USART_Transmit( unsigned int data )
86
{
87
  while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
88
    {
89
    }
90
 
91
    UDR = data;                    /* schreibt das Zeichen x auf die Schnittstelle */
92
93
}
94
95
unsigned char USART_Receive( void )
96
{
97
  /* Wait for data to be received */
98
  while ( !(UCSRA & (1<<RXC)) )
99
  /* Get and return received data from buffer */
100
  zeichen=UDR;
101
  if (zeichen == '9')
102
  {
103
    USART_Transmit('9');
104
  }  
105
  zeichen='0';
106
  return zeichen;
107
}

von holger (Gast)


Lesenswert?

>Leider funktioniert der Code nicht - vielleicht kann mir wer helfen,
>danke!

WAS funktioniert nicht?

>    UBRRH = 0;
>    UBRRL = 12;

Das funktioniert nur bei einer bestimmten CPU Frequenz
die ich mir hier jetzt sicher nicht ausrechnen werde.

von Stefan E. (sternst)


Lesenswert?

Phil schrieb:
1
  /* Wait for data to be received */
2
  while ( !(UCSRA & (1<<RXC)) )
Da fehlt schon mal ein Semikolon oder ein {}.

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.