Forum: Mikrocontroller und Digitale Elektronik Atmega8 RS232


von patrick b. (calalex)


Angehängte Dateien:

Lesenswert?

hallo, ich nutze einen Atmega8, programmiere mit Amtel Studio6 und 
möchte eine Kommunikation über RS232 zum PC. Als Terminal verwende ich 
HTerm port com1,baud 9600, data 8, stop1, parity non.

am terminal kommt nix an, was mach ich falsch? danke fürs feedback!
1
#include <avr/io.h>
2
#include <stdio.h>
3
#include <string.h>
4
#include <util/delay.h>
5
#include <avr/interrupt.h>
6
#include <stdint.h>    
7
#include <inttypes.h>
8
9
10
#define BAUD 9600
11
#define MYUBRR F_CPU/16/BAUD -1   //#define F_CPU 4000000
12
13
14
volatile char ReceivedChar;
15
void sendletter(unsigned char);
16
17
void sendletter(unsigned char letter)
18
{
19
  while ( !(UCSRA & (1 << RXC)) )
20
  letter= UDR;
21
22
  while ( !( UCSRA & (1<<UDRE)) )
23
  UDR = letter;
24
}
25
26
void inituart()
27
{
28
  UBRRH = (MYUBRR >> 8);
29
  UBRRL = MYUBRR;
30
  UCSRB = (1<<RXEN)|(1<<TXEN);
31
  UCSRC = (1<<URSEL)|(1<<USBS)|(1<<UCSZ0);
32
}
33
34
int main(void)
35
{
36
37
  inituart();
38
39
  while(1==1)
40
  {
41
    
42
  sendletter('.');
43
44
    
45
  }
46
  
47
  return 0;
48
49
}

von Gurty (Gast)


Lesenswert?

#define MYUBRR (F_CPU/16/BAUD-1)

von Dussel (Gast)


Lesenswert?

Müsste hinter die Schleifen in sendletter() nicht ein Semikolon?
Und ist USBS in UCSRC nicht zwei Stopbit?

von Karl H. (kbuchegg)


Lesenswert?

> am terminal kommt nix an, was mach ich falsch?

drück mal eine Taste.

Denn genau das hast du hier ( wenn auch falsch ) programmiert:
1
void sendletter(unsigned char letter)
2
{
3
  while ( !(UCSRA & (1 << RXC)) )
4
  letter= UDR;
5
6
  while ( !( UCSRA & (1<<UDRE)) )
7
  UDR = letter;
8
}

Da steht

   warte auf ein eingehendes Zeichen
    (und während du wartest hol immer wieder irgendwas von der
     UART und speichere es in letter)

   gib danach letter auf der UART aus
    (und zwar solange, solange die UART nicht frei ist)


d.h. dein COde wartet prinzipiell schon mal darauf, das was über die 
UART reinkommt. Und erst dann geht es weiter.

von Karl H. (kbuchegg)


Lesenswert?

> was mach ich falsch?

Du hast dir die programmtechnischen Details der UART Funktionen im 
Tutorial nicht gut genug angesehen. Und gerade in C kann jeder noch so 
kleine Fehler, jedes vergessene Satzzeichen "tödlich" sein.

von temporärer Gast (Gast)


Lesenswert?

Viele ähnliche Uart Probleme die letzten Tage. Seltsam.

von patrick b. (calalex)


Lesenswert?

Dussel schrieb:
> Und ist USBS in UCSRC nicht zwei Stopbit?

hab ich ersetzt:
1
UCSRC = (1 << URSEL) |(1 << UCSZ1) | (1 << UCSZ0);

von Olaf B. (omb)


Lesenswert?

Kann es sein, dass du die RS232 Buchse falsch belegt hast?
Laut http://de.wikipedia.org/wiki/RS-232

X1 PIN2 = Ausgang zum PC
X1 PIN3 = Eingang vom PC

X1 PIN2 muss an IC3 PIN14
X1 PIN3 muss an IC3 PIN13

Dann kann RTS und CTS noch gebrückt werden. Also X1 PIN7 und PIN8

Die Verbindung zwischen PIN4 und PIN6 entfernen.

von patrick b. (calalex)


Lesenswert?

Karl Heinz Buchegger schrieb:
> d.h. dein COde wartet prinzipiell schon mal darauf, das was über die
> UART reinkommt. Und erst dann geht es weiter.

ok,
1
void sendletter(unsigned char letter)
 hab ich rausgenommen.

die whileschleife hab ich so geändert, dass bei einem Tastendruck,
1
char test[10];

test gesendet werden soll.
1
while(1==1)
2
{
3
4
  test[0]='t';
5
        test[1]='e';
6
        test[2]='s';
7
        test[3]='t';
8
9
  if( !(PINB & (1<<PB0)))   // Taste gedrückt
10
  {  
11
    
12
    UDR= test;
13
14
  }
15
}
16
  return 0;

von spess53 (Gast)


Angehängte Dateien:

Lesenswert?

Hi

>Die Verbindung zwischen PIN4 und PIN6 entfernen.

Ist nicht falsch. Im Anhang die Beschaltung der RS232-Anschlüsse des 
STK500.

MfG Spess

von patrick b. (calalex)


Lesenswert?

spess53 schrieb:
>>Die Verbindung zwischen PIN4 und PIN6 entfernen.
>
> Ist nicht falsch. Im Anhang die Beschaltung der RS232-Anschlüsse des
> STK500.
>
> MfG Spess

ich hab aber 14 an 1
und in der Zeichnung soll 14 an 2

von Olaf B. (omb)


Lesenswert?

spess53 schrieb:
> Ist nicht falsch. Im Anhang die Beschaltung der RS232-Anschlüsse des
> STK500.

Das stimmt. Die Brücke kann drin bleiben. Die brückt dann auch noch DSR 
und DTR. Aber in seiner Schaltung stimmt der ganze Rest der Beschaltung 
ja nicht. Außer Pin 3 und Pin 5.
@Patrick: Hast du meinen Beitrag weiter oben gesehen?

von Karl H. (kbuchegg)


Lesenswert?

patrick bateman schrieb:

> test gesendet werden soll.

Und was soll der Blödsinn darstellen?
Hast du dir schon mal im AVR-GCC-Tutorial die entsprechenden 
Routinen angesehen?

Hast du überhaupt schon mal deine UART-Hardware (Verkabelung, den MAX) 
getestet?
AVR Checkliste

von temp (Gast)


Lesenswert?

Nunja, nachdem er sich in Beitrag "LCD Initialisierung scheitert Atmel8" 
schon für exakt dieses "Projekt" sein LCD hat machen lassen, gings mit 
danach funktionierendem LCD in 
Beitrag "Interner Pullup Widerstand, Buttonansteuerung klappt nicht" direkt mit den Tastern 
weiter.
Jetzt sind wir also beim UART angelangt. Das mit dem Entprellen hat er 
scheinbar im zweiten Thread überlesen, daher auch wohl der letzte 
Codeschnipsel.
Das nächste (wenn Code und Verkabelung mal passen) dürfte dann die 
vergessene Fuse für den Quarz sein.
Im nächsten Thread dürfen wir uns dann wohl über disfunktionale 
AD-Wandler freuen ;)

von amateur (Gast)


Lesenswert?

Wenn Deine reelle Schaltung eine gewisse Ähnlichkeit mit dem Schaltbild 
hat, könnte der Rechner genau das machen was er soll: Nämlich Resetten.

Soll er das nicht, könnte Pin1 = High etwas Schwung in die Sache 
bringen.

von amateur (Gast)


Lesenswert?

Sorry, oder hat der einen kräftigen Zieh-hoch?

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.