Uart Atmega 8

Gast #3118102
Lesenswert?
• ▲
▼
Hallo,

ich habe ein Problem mit dem Uart, auf dem PC etwas empfangen kann ich 
zwar, jedoch scheint beim AVR auf dem Pollin-Evaluations-Board nichts 
anzukommen.

Wenn ich TX an RX halte, empfange ich jedes Zeichen wieder. Theoretisch 
müsste alles funktionieren.

Wenn ich jedoch eine Drahtbrücke auf der IC-Fassung einsetze, empfange 
ich nicht jedes Zeichen doppelt. Desweiteren kann ich nur etwas 
empfangen, wenn ich einen Programmer in die ISP-Buchse eingesteckt habe.


1
#define F_CPU       16000000UL
2
#define BAUD        9600UL
3
#define UBRR_BAUD   ((F_CPU)/(BAUD*16UL))-1
4

5
#include <avr/io.h>
6
#include <util/delay.h>
7
#include <stdlib.h>
8
#include <avr/interrupt.h> 
9

10

11

12
void init_uart(void)
13
{
14
  // Baudrate einstellen
15
  UBRRH = (uint8_t) (UBRR_BAUD>>8);
16
  UBRRL = (uint8_t) (UBRR_BAUD);
17
  // Aktivieren von receiver und transmitter
18
  UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
19

20
  // Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
21
  UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
22
}
23

24

25

26

27
int uart_putc(unsigned char c)
28
{
29
  while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
30
  {
31
  }
32
  
33
  UDR = c;                      /* sende Zeichen */
34

35
  return 0;
36
}
37

38

39
/* puts ist unabhaengig vom Controllertyp */
40

41
void uart_puts (char *s)
42
{
43
  while (*s)
44
  {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
45
    uart_putc(*s);
46
    s++;
47
  }
48
}
49

50
uint8_t uart_getc(void)
51
{
52
  while (!(UCSRA & (1<<RXC)))   // warten bis Zeichen verfuegbar
53
  ;
54
  return UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben
55
}
56

57

58

59
int main(void)
60
{
61
  sei();
62
  //DDRD|=(1<<PD7);
63
  init_uart();
64
  uart_puts("Bereit....");
65
  uint8_t c =uart_getc();
66
  uart_puts("Etwas Empfangen!");
67
  return 0;
68
}

Der Code ist zu 90% aus dem Tutorial. Das Problem ist nun, dass ich 
niemals  "Etwas Empfangen!" empfange.
Gast #3118134
Lesenswert?
• ▲
▼
Ich habe noch vergessen zu erwähnen, dass ich hiermit:
> Desweiteren kann ich nur etwas
> empfangen, wenn ich einen Programmer in die ISP-Buchse eingesteckt habe.

das "Bereit" meine.

das "Etwas Empfangen" erhielt ich noch nie.

Stefan Ernst schrieb:
> UCSRB = ... (1<<RXCIE);+ keine ISR (sondern Polling) => kein Empfangen möglich

Das heißt RXCIE muss ich nicht setzen , kann ich aber?
Gast #3118143
Lesenswert?
• ▲
▼
Anonym schrieb:
> Ich habe noch vergessen zu erwähnen, dass ich hiermit:
>> Desweiteren kann ich nur etwas
>> empfangen, wenn ich einen Programmer in die ISP-Buchse eingesteckt habe.
>
> das "Bereit" meine.
>
> das "Etwas Empfangen" erhielt ich noch nie.
>
> Stefan Ernst schrieb:
>> UCSRB = ... (1<<RXCIE);+ keine ISR (sondern Polling) => kein Empfangen möglich
>
> Das heißt RXCIE muss ich nicht setzen , kann ich aber?

RXCIE: Receive complete interrupt enable.
Wenn du keine Interrupt Routine dafür bereitstellst, dann gibt es unter 
Umständen nach einem empfangenen Zeichen sofort einen Reset.
Gast #3118188
Lesenswert?
• ▲
▼
Dietrich L. schrieb:
> Anonym schrieb:
>> #define F_CPU       16000000UL
>
> Sind die Fuses auch entsprechend eingestellt?
> Und natürlich: sind Quarz bzw. Takt vorhanden, d.h. µC läuft "im
> Prinzip"? -> Test mit LED
>
> Gruß Dietrich

Ich bekomme immer ein "Bereit" vom µC, sobald er startet bzw. resettet 
wird.

Fuses sind wohl auch richtig eingestellt.

Low:0xef
High:0xd9
Gast #3118264
Lesenswert?
• ▲
▼
Hubert G. schrieb:
> Es liegt nur am |(1<<RXCIE) das nicht hingehört.
> Schau mal ob du das richtige File ladest.
> Ein HW-Fehler ist natürlich immer noch möglich.

Ne das passt alles.

Was ich noch sonderbar finde ist halt, dass ich nur Empfange wenn der 
ISP-Programmer eingesteckt ist.
#3118277
Lesenswert?
• ▲
▼
Das klingt irgendwie nach einem Problem mit der Reset-Leitung.
Ein stromloser Programmer könnte die Reset-Leitung über seine 
Clamp-Dioden runter ziehen, aber wenn der Programmer vom Board ab ist 
und es trotzdem nicht geht, könnte es ein Problem auf dem Board sein.
Welche Spannung liegt denn am Reset-Pin, wenn der Programmer ab ist?
Gast #3118282
Lesenswert?
• ▲
▼
Hubert G. schrieb:
> Dann fehlt dir die GND-Verbindung vom Board zum PC.
> Das das ganze nur einmal funktioniert ist schon klar?

Das kann gut sein, da der COM-Port bei meinem Mainboard ein 
Pfostenstecker war und ich mir so selbst einen Adapter zu D-Sub bauen, 
musste, ich schaue direkt nach ob ich vielleicht etwas vergessen habe.


Vielen Dank schon mal!
Gast #3118526
Lesenswert?
• ▲
▼
Ich glaube ich bin der Lösung schon näher gekommen, vielleicht gibt es 
jetzt noch ein paar Ideen um die Sache abzuschließen.

Also ich habe den Code wie folgt abgeändert:
1
int main(void)
2
{
3
  init_uart();
4
  uart_puts("Bereit....");
5
  while(1)
6
  {
7
if(UDR!=0)
8
    uart_putc(UDR);
9
  }
10
  return 0;
11
}

Nun sieht es so aus:

µC:"Bereit.."
Eingabe
Gast #3118531
Lesenswert?
• ▲
▼
Ich glaube ich bin der Lösung schon näher gekommen, vielleicht gibt es
jetzt noch ein paar Ideen um die Sache abzuschließen.

Also ich habe den Code wie folgt abgeändert:
int main(void)
{
  init_uart();
  uart_puts("Bereit....");
  while(1)
  {
    if(UDR!=0)
    uart_putc(UDR);
  }
  return 0;
}

Nun sieht es so aus:

µC:"Bereit....
Eingabe: (Beispielsweise:)"k")
µC:"kkkkkkkkk,usw......"


Ps: Sorry für den Doppelpost
Gast #3118537
Lesenswert?
• ▲
▼
Sorry , aber ich weiß nicht wie ich alte Beiträge löschen kann, aber das 
hier ist der richtige Code
1
int main(void)
2
{
3
  init_uart();
4
  uart_puts("Bereit....");
5
  while(1)
6
  {
7
    uart_putc(UDR);
8
  }
9
  return 0;
10
}
#3118773
Lesenswert?
• ▲
▼
So sieht mein Code aus:
1
#define F_CPU       16000000UL
2
#define BAUD        9600UL
3
#define UBRR_BAUD   ((F_CPU)/(BAUD*16UL))-1
4

5
#include <avr/io.h>
6
#include <util/delay.h>
7
#include <stdlib.h>
8
#include <avr/interrupt.h> 
9

10

11

12
void init_uart(void)
13
{
14
  // Baudrate einstellen
15
  UBRRH = (unsigned char) (UBRR_BAUD>>8);
16
  UBRRL = (unsigned char) (UBRR_BAUD);
17
  // Aktivieren von receiver und transmitter
18
  UCSRB = (1<<RXEN)|(1<<TXEN);
19

20
  // Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
21
  UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
22
}
23

24

25

26

27
int uart_putc(unsigned char c)
28
{
29
  while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
30
  {
31
  }
32
  
33
  UDR = c;                      /* sende Zeichen */
34

35
  return 0;
36
}
37

38

39
/* puts ist unabhaengig vom Controllertyp */
40

41
void uart_puts (char *s)
42
{
43
  while (*s)
44
  {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
45
    uart_putc(*s);
46
    s++;
47
  }
48
}
49

50
uint8_t uart_getc(void)
51
{
52
  while (!(UCSRA & (1<<RXC)))   // warten bis Zeichen verfuegbar
53
  ;
54
  return UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben
55
}
56

57

58

59
int main(void)
60
{
61

62
  sei();
63
  //DDRD|=(1<<PD7);
64
  init_uart();
65
  uart_puts("Bereit....");
66
  for(;;){
67
  
68
  unsigned char c =uart_getc();
69
  uart_putc(c);
70
  uart_puts("  ");
71
  uart_puts("Etwas Empfangen!");
72
  uart_puts("  ");
73
 } 
74
}

Es wird jeder eingegebene Buchstabe vom µC an das Terminal 
zurückgeschickt.
Gast #3119037
Lesenswert?
• ▲
▼
Funktioniert bei mir leider nicht nur wenn ich den Code

1
uint8_t uart_getc(void)
2
{
3
  while (!(UCSRA & (1<<RXC)))   // warten bis Zeichen verfuegbar
4
  ;
5
  return UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben
6
}


so abändere:
1
uint8_t uart_getc(void)
2
{
3
  while (!(UCSRA & (1<<RXC)))   // warten bis Zeichen verfuegbar
4
  {
5
  UDR = 0;
6
  }
7
  return UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben
8
}

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.