USART Probleme

Gast #3169228
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren