Forum: Mikrocontroller und Digitale Elektronik USART Probleme


von Martin Z. (Gast)


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

von Uwe (de0508)


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
  }

von Ho (Gast)


Lesenswert?

Der ist krass...

von Thomas E. (thomase)


Lesenswert?

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.
Geht ganz einfach:
1
if (!C_Buch_im_Regal) C_Buch_Kaufen();
2
3
while(!Alles_verstanden)
4
{
5
  C_Buch_durcharbeiten();
6
}

Also der klassische Dreizeiler.

mfg.

von Martin Z. (Gast)


Lesenswert?

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 :)

von Martin Z. (Gast)


Lesenswert?

Uwe S. schrieb:
> Hallo,
>
> was soll den das für C-Code in der main() sein ?
>

hallo das ist der laut dem manual notwenige code um usart verwenden zu 
können.
ausser den zeilen:
PORTD ^= (1 << PD6);
_delay_ms(100);)

von Karl H. (kbuchegg)


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.

von Martin Z. (Gast)


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

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.