mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik USART ich seh den Fehler nicht


Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HAllo Leute
ich versuch grad ein Zeichen das ich sende mir wieder vom Controller 
zurück senden zu lassen.
Aber irgendwie funktioniert meine Routine nicht und ich seh den Fehler 
nicht.
Interrupts sind aktiviert.
Es soll mit 9600 und 8N1 kommuniziert werden.
Die Bits UCSZ! und UCSZ0 habe als initialvalue ja bereits 1.
Also sollte das stimmen. Abe weis trotzdem nicht weiter.
Die CPU ist ein Amtega 32.
Wo steckt der Fehler? KAnn eigentlich nur was an den Registern sein aber 
hab nix gefunden beim Durchgehen.
#include <stdint.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdlib.h>
#include <string.h> // Für "strcmp"

#define Takt 8000000
#define BAUD1 9600        // Baudrate

#define UBRR_VAL1 ((Takt/16/BAUD1)-1)   // Schnittstelle BUS

unsigned char test;
int empfangen;
ISR(USART_RXC_vect)
{
  test = UDR;
  empfangen = 1;
}



ISR (TIMER0_OVF_vect)
{
  PORTB |= (1 << PB0);
}

ISR (TIMER0_COMP_vect)
{
  PORTB &= ~(1<< PB0);
}

int main(void)
{

  UCSRB |= (1<<RXEN);
  UCSRB |= (1<<TXEN);                // USART1 TX einschalten
  UCSRB |= (1<<RXCIE);

  UCSRC |= (1<<URSEL);    // USART1 Asynchron 8N1
  UBRRH = UBRR_VAL1 >> 8;
  UBRRL = UBRR_VAL1;


  sei();
  UDR ='g';
/*
  DDRB = 0xFF;
  TIMSK |= (1 << TOIE0) | (1 << OCIE0);
  OCR0 = 0x80;

  PORTB |= (1 <<PB0);
  TCCR0 |= (1 << CS00)| (1 << CS02);
  */
  if (empfangen == 1 )
  {
    while ( !( UCSRA & (1<<UDRE)) )
        ;
    UDR = test;
    UDR = 'f';
    empfangen = 0;
  }
  while (1);
  return 0;
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
volatile unsigned char test;
volatile int empfangen;

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ähm
  if (empfangen == 1 )
  {
    while ( !( UCSRA & (1<<UDRE)) )
        ;
    UDR = test;
    UDR = 'f';
    empfangen = 0;
  }
  while (1);

Du solltest das Abfragen, ob ein Zeichen eingetroffen ist, innerhalb der 
Hauptschleife machen. So schnell kannst du ein Zeichen gar nicht 
schicken, dass es in den paar µs detektiert wird, die du dem programm 
Zeit gibst, ehe es sich in der Endlosschleife fängt und nichts mehr tut.

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.