Problem mit USART

Gast #1869698
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:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3

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

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

11
// USART initialisieren
12
void uart_init(void)
13
{
14
    // Baudrate einstellen (Normaler Modus)
15
    UBRRH = (uint8_t) (UBRR_BAUD>>8);
16
    UBRRL = (uint8_t) (UBRR_BAUD & 0x0ff);
17

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

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

25
int main(void)
26
{  
27
    uint8_t buffer;
28

29
    // USART initialisieren
30
    uart_init();
31

32
    while (1)
33
    {
34
        // Warten bis Daten empfangen wurden
35
        if(UCSRA & (1<<RXC)){
36
          // Empfangsregister auslesen
37
          buffer = UDR;
38
    sbi(PORTB, buffer);
39
      }
40
    }
41
}

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 ;)
Gast #1869744
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?
Gast #1869867
Lesenswert?
• ▲
▼
ok, ich glaube, ich hab das Problem gefunden...

Es muss hier
1
// Warten bis Daten empfangen wurden
2
        if(UCSRA & (1<<RXC)){
3
          // Empfangsregister auslesen
4
          buffer = UDR;
5
          sbi(PORTB, buffer);
6
      }
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!!
1
SIGNAL (SIG_UART_RECV) {
2
  unsigned char recv;
3

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

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

Bitte helft mir!!!!
#1870046
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...
1
   #define PORTB_LEDMASK  ((1<<0)|(1<<1)|(1<<2))
2
   DDRB |= PORTB_LEDMASK; /* Bit 0-2 auf OUTPUT setzen */
3
   ...
1
   ...
2
   data = UDR;
3
#if USE_PORTB_BITMASK
4
   data &= PORTB_LEDMASK;     /* Maskiere die unteren drei Bits */
5
   PORTB = (PORTB & PORTB_LEDMASK) | data;  /* Uebertrage Bitmaske nach PORT B */
6
#else
7
   data &= 3;     /* Maskiere die unteren zwei Bits */
8
   if(data > 2) data = 0;  /* Beschraenken auf Wertebereich 0-2 */
9
   PORTB = (PORTB & PORTB_LEDMASK) | (1 << data);
10
#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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.