www.mikrocontroller.net

Forum: Compiler & IDEs RS232 -Kommunikation


Autor: Olli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <inttypes.h>

#define F_CPU 8000000UL


#define BAUD 9600L                

#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) 
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))   
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000)


ISR (USART_RXC_vect) { 
   // irgendwas machen
}

int main (void){
    
  UCSRA |= (1<<RXCIE);                // UART RX Interrupt einschalten 

  sei(); 

  while(1){
  }
}

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.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 
;-)

Autor: Olli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also der Teil noch dazu?
  UCSRA |= (1<<RXEN);
  UBRRH = UBRR_VAL >> 8;
  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?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.