www.mikrocontroller.net

Forum: Compiler & IDEs Problem mit USART


Autor: Greenhorn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin gerade dabei die Welt der Mikrocontroller(ich verwende den 
AtMega8) zu entdecken ;) und habe mir in den Kopf gesetzt erst einmal, 
nachdem mein erstes Programm mit blinkenden LEDs funktionierte, ein 
Programm zu schreiben, mit dem man über den PC LEDs an und ausschalten 
können soll... Doch dabei haperts.
Dies ist der Code:
#include <avr/io.h>
#include <avr/interrupt.h>

#define F_CPU 3686400L 
#define BAUD        9600UL
#define UBRR_BAUD   ((F_CPU/(16UL*BAUD))-1)

#define sbi(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define cbi(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))

// USART initialisieren
void uart_init(void)
{
    // Baudrate einstellen (Normaler Modus)
    UBRRH = (uint8_t) (UBRR_BAUD>>8);
    UBRRL = (uint8_t) (UBRR_BAUD & 0x0ff);

    // Aktivieren von receiver
    UCSRB = (1<<RXEN);

    // Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
    UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}

int main(void)
{  
    uint8_t buffer;

    // USART initialisieren
    uart_init();

    while (1)
    {
        // Warten bis Daten empfangen wurden
        if(UCSRA & (1<<RXC)){
          // Empfangsregister auslesen
          buffer = UDR;
    sbi(PORTB, buffer);
      }
    }
}

Ich habe drei LEDs an den Pins0-2 des PortB, doch egal welchen Wert ich 
am PC über die rs232 rausschicke, leuchtet nur die LED am Pin0! Woran 
kann das liegen? Und wie kann ich dieses Fehlverhalten korrigieren?

Es wäre nett, wenn ihr mir helfen würdet ;)

Autor: Suchhelfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast DDRB vergessen, komisch dass überhaupt was leuchtet.

Autor: Greenhorn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, danke, der nun ist DDRB definiert... und die LED leuchtet heller als 
zuvor... aber es leuchtet immer nur noch die eine an Pin0,  auch wenn 
ich die an Pin1 oder Pin2 ansteuere... es leuchtet immer nur Pin0, woran 
kann das liegen?

Autor: Greenhorn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, ich glaube, ich hab das Problem gefunden...

Es muss hier
// Warten bis Daten empfangen wurden
        if(UCSRA & (1<<RXC)){
          // Empfangsregister auslesen
          buffer = UDR;
          sbi(PORTB, buffer);
      }
dran liegen...

Ich habe gerade entdeckt, dass man die Programme im AVRStudio auch 
simmulieren kann... Und während des Simmulierens bin ich drauf gestoßen, 
dass UDR gelöscht wird, wenn ich den Status des RXC abfrage...

Ich habe es darauffolgend mit einem Interrupt probiert, dessen code ich 
hier im Tutorial auf µc.net gefunden habe und es wieder simmuliert, und 
komischer Weise tritt das selbe Problem auf!!
SIGNAL (SIG_UART_RECV) {
  unsigned char recv;

  recv=UDR;         //Zeichen vom Register holen
  UDR=recv;         //Zeichen zurücksenden
  sbi(PORTB, recv);
}

WAS MACHE ICH FALSCH??
ich versteh es nicht!!!

Bitte helft mir!!!!

Autor: Werner B. (werner-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Greenhorn schrieb:
> nun ist DDRB definiert

1. Wie hast du DDRB definiert?
    Empfehlung: siehe Unten.
2. Ich kapiere nicht was du mit sbi(PORTB, buffer) erreichen willst.
   sbi ist seit (mindestens 5) Jahren "veraltet".
3. Die Emulation hat einige Macken und kann nicht alles
   richtig nachbilden.

Wenn du die Bits 0-2 des Port B per USART kontrollieren willst...
   #define PORTB_LEDMASK  ((1<<0)|(1<<1)|(1<<2))
   DDRB |= PORTB_LEDMASK; /* Bit 0-2 auf OUTPUT setzen */
   ...
   ...
   data = UDR;
#if USE_PORTB_BITMASK
   data &= PORTB_LEDMASK;     /* Maskiere die unteren drei Bits */
   PORTB = (PORTB & PORTB_LEDMASK) | data;  /* Uebertrage Bitmaske nach PORT B */
#else
   data &= 3;     /* Maskiere die unteren zwei Bits */
   if(data > 2) data = 0;  /* Beschraenken auf Wertebereich 0-2 */
   PORTB = (PORTB & PORTB_LEDMASK) | (1 << data);
#endif

P.S.
4. SIGNAL ist auch "veraltet"
5. F_CPU sollte in den Projektoptionen bzw. im Makefile
   definiert werden.
   Es häufen sich in letzter Zeit wieder die Anfragen
   wegen "multiple definition" von F_CPU

PPS
Weiss jemand wie man depricated "sinnvoll" Übersetzt?

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.