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 | }
|