www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Attiny UART senden und empfangen


Autor: Phil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute!

Benötige bitte eure Hilfe.
Mein Programm soll folgendes können.

Wenn Pin0 von PortB 1 ist soll "1" gesendet werden.
Wenn Pin1 von PortB 1 ist soll "2" gesendet werden.
Wenn Pin2 von PortB 1 ist soll "3" gesendet werden.
Wenn Pin3 von PortB 1 ist soll "4" gesendet werden.

Das funktioniert auch soweit.
Es soll aber auch eine "9" gesendet werden, wenn eine "9" empfangen 
wurde.

Wenn ich im Hauptprogramm nun //USART_Receive(); auskommentiere dann 
funktioniert aber das senden nach dem Tastendruck nicht mehr.

Wie könnte ich das Problem anders lösen?

philip

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

#define F_CPU       1000000UL

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

int x;
unsigned char zeichen;
unsigned char empfangen;

int main(void)
{
  init_io();
  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');
  PORTD|=(1<<PD6);
  
  while(1)
    {  

    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);
    }
    //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;
  // Aktivieren des Empfängers, des Senders und des "Daten empfangen"-Interrupts
    UCSRB = (1<<RXEN)|(1<<TXEN);
    // Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
    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 */
}

void USART_Receive()
{
  //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');
  }  
}


Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Phil schrieb:
> Wenn ich im Hauptprogramm nun //USART_Receive(); auskommentiere dann
> funktioniert aber das senden nach dem Tastendruck nicht mehr.
...
>
> void USART_Receive()
> {
>   //Wait for data to be received
>   while (!(UCSRA & (1<<RXC)) );
> 

Wait heißt auf deutsch "Warten" und genau das macht es auch.

Versuchs mal mit:
  if((UCSRA & (1<<RXC)) ){
...
  }


Peter

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.