Forum: Compiler & IDEs RS232 -Kommunikation


von Olli (Gast)


Lesenswert?

Hallo,
ich versuche über die RS232-Schnittstelle mit meinem ATmega8 zu 
kommunizieren.
Ich arbeite mit einem Max232 und habe eine LED angeschlossen um zu sehen 
ob Signale ankommen. - Ja es wird was gesendet :P

Also muss ein Fehler in meinem Programmcode sein.

Hier mal die wichtigen Stellen aus meinem Code ich hoffe ihr könnt mir 
sagen was ich nicht drin habe.
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <util/delay.h>
4
#include <inttypes.h>
5
6
#define F_CPU 8000000UL
7
8
9
#define BAUD 9600L                
10
11
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) 
12
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))   
13
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000)
14
15
16
ISR (USART_RXC_vect) { 
17
   // irgendwas machen
18
}
19
20
int main (void){
21
    
22
  UCSRA |= (1<<RXCIE);                // UART RX Interrupt einschalten 
23
24
  sei(); 
25
26
  while(1){
27
  }
28
}

eigentlich sollte doch sobald ein Signal ankommt die ISR ausgeführt 
werden oder sehe ich das was falsch?
Also ich hab gesehen das alle Variablen die in der ISR stehen als 
"volatile" gekennzeichnet werden müssen sonst sind sie wegoptimiert.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Interrupt einschalten allein reicht nicht. Du musst mindestens auch den 
Empfänger (RX) des UART einschalten (enable). Dafür gibt es ebenfalls 
ein Bit in einem UART Register.

Die Baudrate und den Frameaufbau würde ich auch setzen, selbst wenn es 
ein Minimalprogramm sein soll. Bzw. beim Copy&Paste aus dem Beispielcode 
der diversen Tutorials würde ich die zwei Zeilen nicht extra weglöschen 
;-)

von Olli (Gast)


Lesenswert?

also der Teil noch dazu?
1
  UCSRA |= (1<<RXEN);
2
  UBRRH = UBRR_VAL >> 8;
3
  UBRRL = UBRR_VAL & 0xFF;
Wo liegt der Unterschied zwischen UCSRA und UCSRB z.B.? Hab begriffen 
das es sich um das Kontrollregister handelt aber nutzt der dann ein 
anderen Port?

Müsste ich dann nicht UCSRD nutzen wenn ich an PD0 den RX habe? (UCSRD 
gibt es aber glaube ich nicht) darum verstehe ich das nicht oder 
verwechsel ich da irgendwas?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Olli wrote:
> also der Teil noch dazu?
>
>
1
  UCSRA |= (1<<RXEN);
2
>   UBRRH = UBRR_VAL >> 8;
3
>   UBRRL = UBRR_VAL & 0xFF;
4
>

Zum Beispiel, wobei ich nicht kontrolliert habe, ob das stimmt. Ich 
traue dir soweit, dass Du richtig abschreiben kannst ;-)

> Wo liegt der Unterschied zwischen UCSRA und UCSRB z.B.? Hab begriffen
> das es sich um das Kontrollregister handelt aber nutzt der dann ein
> anderen Port?

Das sind Fragen auf die das Datenblatt des µC ganz genaue Antworten 
gibt,

> Müsste ich dann nicht UCSRD nutzen wenn ich an PD0 den RX habe? (UCSRD
> gibt es aber glaube ich nicht) darum verstehe ich das nicht oder
> verwechsel ich da irgendwas?

Dito. Und ja, Du verwechselt da was. Es geht hier nicht um die PORT / 
PIN Geschichte, sondern UART hat mehrere Kontrollregister und die wurden 
A, B, C durchgekennzeichnet. Bei AVRs mit mehreren UARTs kommt noch eine 
Zahl dazu...

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.