Forum: Mikrocontroller und Digitale Elektronik Attiny UART senden und empfangen


von Phil (Gast)


Lesenswert?

Hallo Leute!

Benötige bitte eure Hilfe.
Mein Programm soll folgendes können.

Wenn Pin0 von PortB 1 ist soll "1" gesendet werden.
Wenn Pin1 von PortB 1 ist soll "2" gesendet werden.
Wenn Pin2 von PortB 1 ist soll "3" gesendet werden.
Wenn Pin3 von PortB 1 ist soll "4" gesendet werden.

Das funktioniert auch soweit.
Es soll aber auch eine "9" gesendet werden, wenn eine "9" empfangen 
wurde.

Wenn ich im Hauptprogramm nun //USART_Receive(); auskommentiere dann 
funktioniert aber das senden nach dem Tastendruck nicht mehr.

Wie könnte ich das Problem anders lösen?

philip
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <util/delay.h>
4
#include <avr/uart.h>
5
6
#define F_CPU       1000000UL
7
8
extern void init_io(void);
9
void USART_Init( unsigned int baud );
10
void USART_Transmit( unsigned int data );
11
void USART_Receive();
12
13
int x;
14
unsigned char zeichen;
15
unsigned char empfangen;
16
17
int main(void)
18
{
19
  init_io();
20
  sei();
21
22
  USART_Init(9600);
23
24
  for(x=0;x<3;x++)
25
  {
26
    PORTD|=(1<<PD6);
27
    _delay_ms(200);
28
    PORTD &=~(1<<PD6);
29
    _delay_ms(200);
30
  }
31
32
  USART_Transmit('9');
33
  PORTD|=(1<<PD6);
34
  
35
  while(1)
36
    {  
37
38
    if(PINB & (1<<PINB0))
39
    {
40
      USART_Transmit('1');
41
      while(PINB & (1<<PINB0));
42
      _delay_ms(300);
43
    }
44
    if(PINB & (1<<PINB1))
45
    {
46
      USART_Transmit('2');
47
      while(PINB & (1<<PINB1));
48
      _delay_ms(300);
49
    }
50
    if(PINB & (1<<PINB2))
51
    {
52
      USART_Transmit('3');
53
      while(PINB & (1<<PINB2));
54
      _delay_ms(300);
55
    }
56
    if(PINB & (1<<PINB3))
57
    {
58
      USART_Transmit('4');
59
      while(PINB & (1<<PINB3));
60
      _delay_ms(300);
61
    }
62
    //USART_Receive();
63
    }
64
}
65
      
66
//-------
67
//INIT_IO
68
//-------
69
//Initialisierung der Port-Pins
70
void init_io(void)
71
{
72
  DDRD |= 0xFF;
73
  DDRB |= 0x00;
74
}
75
76
void USART_Init( unsigned int baud )
77
{
78
   UBRRH = 0;
79
    UBRRL = 12;
80
  // Aktivieren des Empfängers, des Senders und des "Daten empfangen"-Interrupts
81
    UCSRB = (1<<RXEN)|(1<<TXEN);
82
    // Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
83
    UCSRC = (1<<USBS)|(3<<UCSZ0);
84
}
85
86
void USART_Transmit( unsigned int data )
87
{
88
  while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
89
    {
90
    }
91
 
92
    UDR = data;                    /* schreibt das Zeichen x auf die Schnittstelle */
93
}
94
95
void USART_Receive()
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
}

von Peter D. (peda)


Lesenswert?

Phil schrieb:
> Wenn ich im Hauptprogramm nun //USART_Receive(); auskommentiere dann
> funktioniert aber das senden nach dem Tastendruck nicht mehr.
...
>
1
> void USART_Receive()
2
> {
3
>   //Wait for data to be received
4
>   while (!(UCSRA & (1<<RXC)) );
5
>

Wait heißt auf deutsch "Warten" und genau das macht es auch.

Versuchs mal mit:
1
  if((UCSRA & (1<<RXC)) ){
2
...
3
  }


Peter

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.