Forum: Compiler & IDEs Problem mit USART


von Greenhorn (Gast)


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 ;)

von Suchhelfer (Gast)


Lesenswert?

Du hast DDRB vergessen, komisch dass überhaupt was leuchtet.

von Greenhorn (Gast)


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?

von Greenhorn (Gast)


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

von Werner B. (werner-b)


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?

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.