USART Probleme

Gast #3169228
Hallo,

ich bekomme es einfach nicht hin Daten über USART auf den PC zu bekommen 
:(
Das Tutorial von der Seite hier und von anderen Seiten haben mir 
irgendwie nicht weitergeholfen zudem es je nach Controller verschiedene 
gibt.

Ich verwenden einen ATTINY2313 mit einem 8 Mhz Quarz Auf dem 
Evaluationsboard von Pollin.

Als IDE verwende ich Eclipse in dem ich auch die CPU geschwindigkeit 
angegeben hab.

Zum empfangen verwende ich mit dem Linux Terminal diese Befehle:
1
sudo stty 9600 -crtscts -echo -ixoff -F /dev/ttyS0
2
sudo cat /dev/ttyS0

und verwende auf dem Chip den Beispielcode aus dem Datenblatt des 
ATTINY2313:
1
#include <avr/io.h>
2
#include <util/delay.h>
3

4
int main(void) {
5

6
  DDRD = 0b01100000;
7

8
PORTD ^= (1 << PD6);
9
_delay_ms(1000);
10

11
  while (1) {
12

13
    PORTD ^= (1 << PD6);
14
    _delay_ms(1000);
15

16
    void USART_Init( unsigned int baud )
17
    {
18
      /* Set baud rate */
19
      UBRRH = (unsigned char)(baud>>8);
20
      UBRRL = (unsigned char)baud;
21
      /* Enable receiver and transmitter */
22
      UCSRB = (1<<RXEN)|(1<<TXEN);
23
      /* Set frame format: 8data, 2stop bit */
24
      UCSRC = (1<<USBS)|(3<<UCSZ0);
25
    }
26

27
    PORTD ^= (1 << PD5);
28
    _delay_ms(1000);
29

30
    void USART_Transmit( unsigned char data )
31
    {
32
      /* Wait for empty transmit buffer */
33
      while ( !( UCSRA & (1<<UDRE)) )
34
        ;
35
      /* Put data into buffer, sends the data */
36
      UDR = data;
37
    }
38

39
    PORTD ^= (1 << PD6);
40
    _delay_ms(100);
41
    PORTD ^= (1 << PD6);
42
    _delay_ms(100);
43
    PORTD ^= (1 << PD6);
44
    _delay_ms(100);
45
  }
46
return 0;
47
}


Ich weiß nicht wo der Fehler ist und ich weiß nicht wie man bei dem 
Register der neuen Atmels mit dem UBRRH UBRRL die Baudrate einstellt..
so wie ich das verstanden hab wird die so automatisch berechnet?
Hab deswegen einfach 9600 genommen.
Ich möchte hinzufügen das ich mich mit C nochtnicht so gut auskenne und 
daher den Code nicht vollständig verstehe.

Vielen Dank im voraus!

Martin
#3169303
Hallo,

was soll den das für C-Code in der main() sein ?
1
while (1) {
2

3
    PORTD ^= (1 << PD6);
4
    _delay_ms(1000);
5

6
    void USART_Init( unsigned int baud )
7
    {
8
      /* Set baud rate */
9
      UBRRH = (unsigned char)(baud>>8);
10
      UBRRL = (unsigned char)baud;
11
      /* Enable receiver and transmitter */
12
      UCSRB = (1<<RXEN)|(1<<TXEN);
13
      /* Set frame format: 8data, 2stop bit */
14
      UCSRC = (1<<USBS)|(3<<UCSZ0);
15
    }
16

17
    PORTD ^= (1 << PD5);
18
    _delay_ms(1000);
19

20
    void USART_Transmit( unsigned char data )
21
    {
22
      /* Wait for empty transmit buffer */
23
      while ( !( UCSRA & (1<<UDRE)) )
24
        ;
25
      /* Put data into buffer, sends the data */
26
      UDR = data;
27
    }
28

29
    PORTD ^= (1 << PD6);
30
    _delay_ms(100);
31
    PORTD ^= (1 << PD6);
32
    _delay_ms(100);
33
    PORTD ^= (1 << PD6);
34
    _delay_ms(100);
35
  }
#3169624
Martin z. schrieb:
> Thomas Eckmann schrieb:
>> Martin z. schrieb:
>>> Ich möchte hinzufügen das ich mich mit C nochtnicht so gut auskenne und
>>> daher den Code nicht vollständig verstehe.
>
> danke jetzt bin ich schonmal schlauer :)

Es hilft aber nichts. Ohne C-Buch kommst du nicht weit. Wie man ja  ganz 
deztlich wieder einmal sieht. Und ich möchte hinzufügen, wie schon viele 
hunderte male vor dir (und hunderte male nach dir)

Die Afteilung in C ist so, dass Funktionen normalerweise nicht 
geschachtelt werden. D.h. man schreibt es so
1
void foo()
2
{
3
  ...
4
}
5

6
void bar()
7
{
8
  ...
9
}
10

11
int main()
12
{
13
   foo();   // Aufruf der Funktion foo
14
   bar();   // Aufruf der Funktion bar
15
}

du hast die Definitionen geschachtelt definiert
1
int main()
2
{
3
  ...
4

5
  void foo()
6
  {
7
     ...
8
  }
9

10
  void bar()
11
  {
12
    ...
13
  }
14

15
  foo();
16
  bar();
17
}

das heißt, du hast die Funktionsdefinition in eine ander Funktion 
hineingezogen. Das ist zwar eigentlich nicht erlaubt, der gcc hat aber 
eine experimentelle Erweiterung dafür.

Zieh mal deine Funktionsdefinitionen raus und schreib das so, wie man 
das richtig schreibt.
Und siehe da. Organsiert man sich das entsprechend, dann stellt man 
fest: Deine Funktionen werden überhaupt nicht aufgerufen! In main() 
kommt kein einziger Aufruf der Funktionen vor!


All das (und noch viel mehr) hättest du dir locker selbst beantworten 
können, wenn du ein C-Buch hättest und das auch (zumindest das erste 
Drittel) durchgearbeitet hättest. Mit anlassbezogenem Erfragen von 
Achtelwissen in Foren kommt man eben nicht weit.
Gast #3170153
oha ich bin nichtmal auf die idee gekommen das es am c code liegt ich 
dachte es liegt an irgenwas mit dem microcontroller,baud oder so.
ich hab das nichtmal als funktionen erkannt ich hab bisher nur perl 
programmiert und da heißen funktionen sub()

ich werd jetzt mal ein bisschen in meim c buch lesen bis ich den code 
vollständig versteh und meld mich dann nochmal

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.