Forum: Mikrocontroller und Digitale Elektronik Atmega 32 UART Problem


von terminator (Gast)


Lesenswert?

Hallo Leute,

Ich bräuchte Hilfe bei einem kleinen Problem und zwar geht es um die 
UART Schnittstelle bei einem Atmega 32. Ich möchte den Chip mit einem PC 
kommunizieren lassen. Das Senden vom Chip zum Pc funktioniert wunderbar 
nur das Empfangen mit dem Chip klappt irgendwie nicht. Zum Testen hab 
ich nur eine Schleife zum Empfangen gemacht die zum Senden wird später 
ergänzt.

Ich wäre wirklich froh wenn mir jemand helfen könnte. Vielen Dank schon 
mal im Voraus.

Das Programm:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/pgmspace.h>
4
5
#ifndef F_CPU
6
7
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
8
#define F_CPU 16000000UL  
9
10
#endif
11
 
12
#define BAUD 9600UL      
13
 
14
15
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   
16
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     
17
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) 
18
19
uint8_t c=0;
20
21
int main(void) {
22
  
23
  DDRD = 0b01100000;
24
  void uart_init(void);
25
  
26
  while (1) {
27
    uint8_t c;
28
    uint8_t UART_getc();
29
    c = UART_getc();
30
    if(c==1) {
31
      PORTD = 0b01100000;
32
    }
33
  }
34
  
35
return(0);  
36
37
}
38
39
  
40
void uart_init(void) {
41
42
  UBRRH = UBRR_VAL >> 8;
43
  UBRRL = UBRR_VAL & 0xFF;
44
 
45
  UCSRB |= (1<<TXEN)|(1<<RXEN);          //Sender und Empfänger Initialisieren
46
  UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);  //asynchrone übertragung
47
 
48
}
49
50
uint8_t UART_getc(void) {
51
52
  while ( !(UCSRA & (1<<RXC)) ) {      //Auf ein Zeichen warten
53
  }
54
  
55
return UDR;
56
}
von Karl H. (kbuchegg)


Lesenswert?

terminator schrieb:
1
    c = UART_getc();
2
    if(c==1) {

womit sendest du?
Du bist dir ganz sicher, dass du PC-seitig ein Byte mit dem Wert 1 auf 
die Reise schickst?

Hinweis: wenn du auf dem PC ein Terminalprogramm laufen hast und dort 
die Taste '1' drückst, dann wird kein Byte mit dem Wert 1 übertragen, 
sondern der ASCII Code für das Zeichen '1'. Das ist aber etwas anderes 
als 1:
1
    c = UART_getc();
2
    if(c == '1') {
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.