Forum: Mikrocontroller und Digitale Elektronik MRC Borad Empfangen und senden


von Koshiro (Gast)


Lesenswert?

Hallo,

ich arbeite noch nicht sehr lange mit meinem mrc board, ich habe aber 
ein programm geschrieben, sodass ich über ein terminal programm Zeichen 
zu meinem board schiken kann und diese werden mir als acsii code auf dem 
board angezeigt. das ganze passiert über die serielle schnittstelle. 
hier mal der code:


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


int x = 65;

void usart1_init(unsigned long baudrate) // Initialize USART0
{
  UBRR1H  = 0;
  UBRR1L = 0x10; // set baud rate UBRRN sei 12 für 8 MHZ und 38400
  UCSR1B = (1<<RXEN) | (1<<TXEN); // enable receiver and transmitter
  UCSR1C = 0x06;// 8 Datenbit 1 Stoppbit no parity
}


void usart1_tx (char data) // transmit byte via usart0
{
  while (!(UCSR1A & (1 << UDRE1))); // wait for empty transmit buffer

  UDR1 = data; // put data to buffer = send data
}


void uart1_send(unsigned char *buf, unsigned int size)    //  sendet 
Daten über UART
{
  for(int i=0; i<=size;i++)
  {
    while ( !(UCSR1A &(1<<UDRE1)));  /* warten bis Senden moeglich 
*/
    {
      }
    UDR1 = buf[i];
  }
}



void main()
{
  DDRA = 0xFF;

  usart1_init(16);

  while(1)
  {
    unsigned char buffer;
           // Warten bis Daten empfangen wurden
        while ( !(UCSR1A & (1<<RXC)) )
            ;

        // Empfangsregister auslesen
        buffer = UDR1;

    PORTA= buffer;
        /* PORTA = 0x01;
     _delay_ms(3000);
       PORTA = 0x00;
     _delay_ms(3000);
     */

  }
}

ich will jetzt nurnoch das das borad nicht nur empfangen sondern auch 
senden kann, und das will eifach nicht klappen. ich hab jetzt 
stundenlang seiten durchsucht, und ihr seid meine letzte hoffnung^^

ich bedanke mich schonmal im vorraus für die hilfe :-)

lg
koshiro

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Hälst du nix von den Routinen und Beispielen im AVR UART Tutorial in der 
Artikelsammlung oder kennst du die nicht?

1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
void usart1_init(unsigned long baudrate) // Initialize USART0
5
{
6
  UBRR1H = 0;
7
  UBRR1L = 0x10; // set baud rate UBRRN sei 12 für 8 MHZ und 38400
8
  UCSR1B = (1<<RXEN) | (1<<TXEN); // enable receiver and transmitter
9
  UCSR1C = 0x06;// 8 Datenbit 1 Stoppbit no parity
10
}
11
12
unsigned char usart1_rx(void) // receive byte via usart1
13
{
14
  while ( !(UCSR1A & (1<<RXC)) )
15
    ;
16
  // Empfangsregister zurückgeben
17
  return UDR1;
18
}
19
20
void usart1_tx (char data) // transmit byte via usart1
21
{
22
  while (!(UCSR1A & (1 << UDRE1)))
23
    ; // wait for empty transmit buffer
24
  UDR1 = data; // put data to buffer = send data
25
}
26
27
void uart1_send(unsigned char *buf, unsigned int size)    
28
{
29
  for(int i=0; i<=size; i++)
30
  {
31
    usart1_tx( buf[i] );
32
  }
33
}
34
35
int main(void)
36
{
37
  DDRA = 0xFF;
38
  usart1_init(16);
39
  while(1)
40
  {
41
    unsigned char buffer;
42
    buffer = usart1_rx(); // Zeichen empfangen 
43
    usart1_tx(buffer);    // und als Echo zurücksenden
44
    PORTA = buffer;       // Lokale Ausgabe
45
  }
46
}

Wenn das nicht funktioniert, dann den Loopback-RS232 Test machen, um die 
Hardware zu prüfen: AVR aus der Fassung nehmen, RXD und TXD in der 
Fassung brücken und vom PC aus etwas senden. Das Gesendete sollte als 
Echo zurück kommen.

von Koshiro (Gast)


Lesenswert?

Ich danke dir für die schnelle antwort :-) ich denke das wird mir auf 
jeden fall weiter helfen, besten dank.

ich hatte mal ein avr uart tutorial aber das war ziemlich kompliziert 
erklärt und bin da nur teilweise durchgestiegen ^^

lg
koshiro

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.