www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATtiny2313 + UART + Empfangen + Problem


Autor: Phil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Habe ein kleines Problem:
Wenn ich vom Computer eine '9' sende, will ich, dass der AVR eine '9' 
zurücksendet.
Leider funktioniert der Code nicht - vielleicht kann mir wer helfen, 
danke!


#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

extern void init_io(void);
void USART_Init( unsigned int baud );
void USART_Transmit( unsigned int data );
unsigned char USART_Receive( void );

int x;
unsigned char zeichen;

int main(void)
{
  //cli();
  init_io();
  //init_timer0();
  //sei();

  USART_Init(9600);

  for(x=0;x<3;x++)
  {
    PORTD|=(1<<PD6);
    _delay_ms(200);
    PORTD &=~(1<<PD6);
    _delay_ms(200);
  }

  USART_Transmit('9');

  while(1)
    {  
    PORTD|=(1<<PD6);
    if(PINB & (1<<PINB0))
    {
      USART_Transmit('1');
      while(PINB & (1<<PINB0));
      _delay_ms(300);
    }
    if(PINB & (1<<PINB1))
    {
      USART_Transmit('2');
      while(PINB & (1<<PINB1));
      _delay_ms(300);
    }
    if(PINB & (1<<PINB2))
    {
      USART_Transmit('3');
      while(PINB & (1<<PINB2));
      _delay_ms(300);
    }
    if(PINB & (1<<PINB3))
    {
      USART_Transmit('4');
      while(PINB & (1<<PINB3));
      _delay_ms(300);
    }
    zeichen=USART_Receive();
    }
}

      
//-------
//INIT_IO
//-------
//Initialisierung der Port-Pins
void init_io(void)
{
  DDRD |= 0xFF;
  DDRB |= 0x00;
}

void USART_Init( unsigned int baud )
{
 
    UBRRH = 0;
    UBRRL = 12;
  /* Enable receiver and transmitter */
  UCSRB = (1<<RXEN)|(1<<TXEN);
  /* Set frame format: 8data, 2stop bit */
  UCSRC = (1<<USBS)|(3<<UCSZ0);
}

void USART_Transmit( unsigned int data )
{
  while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
    {
    }
 
    UDR = data;                    /* schreibt das Zeichen x auf die Schnittstelle */

}

unsigned char USART_Receive( void )
{
  /* Wait for data to be received */
  while ( !(UCSRA & (1<<RXC)) )
  /* Get and return received data from buffer */
  zeichen=UDR;
  if (zeichen == '9')
  {
    USART_Transmit('9');
  }  
  zeichen='0';
  return zeichen;
}


Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Leider funktioniert der Code nicht - vielleicht kann mir wer helfen,
>danke!

WAS funktioniert nicht?

>    UBRRH = 0;
>    UBRRL = 12;

Das funktioniert nur bei einer bestimmten CPU Frequenz
die ich mir hier jetzt sicher nicht ausrechnen werde.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Phil schrieb:
  /* Wait for data to be received */
  while ( !(UCSRA & (1<<RXC)) )
Da fehlt schon mal ein Semikolon oder ein {}.

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.