Forum: Mikrocontroller und Digitale Elektronik ATmega644 UART


von Sepp H. (vali1991)


Lesenswert?

Hallo,

bin ein µC - Neuling, möchte ASCII zeichen an ein Terminalprogramm am PC 
mit Hilfe der UART schicken. Wäre Hilfreich, wenn jemand ein kurzes 
Beispiel, wenn möglich in C bringen könnte. Habe schoin verschiedenste 
Beispiele ausprobiert, doch ohne Erfolg. Das letzte Beispiel war 
folgendes:

______________________________________________________________________

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

#define FOSC 1843200// Clock Speed
#define BAUD 9600
#define MYUBRR FOSC/16/BAUD-1

const int baud = 51;  //wegen 8MhZ Clock
const char* data = "Hallo\0";  //Char-Pointer

int main() {

  //test
  DDRC = 0x01;            --Kontrollregister
  //PORTC = 0xFF;

  USART_Init (baud);
  while(1) {
  USART_Transmit(data);
  }
  //USART_receive();

  sei();         //... die Interrupts abfangen
}

void USART_Init(int baud) {

  /* Set baud rate */
  UBRRL = (char)baud;

  /* Enable  transmitter */
  UCSRB = (1<<TXEN);
  UCSRB =  (1<<UDRIE); //KO: entweder UDRIE oder TXIE

  /* Set frame format: asynchron, 1 stop - bit, 8 data - bit */
  UCSRC = (0<<URSEL)|(0<<USBS)|(2<<UCSZ0); //KO: Frameformat im Prinzip 
egal, muss aber mit Gegenseite übereinstimmen

}



// transmit

void USART_Transmit(const char* data ) {
  /* Wait for empty transmit buffer */
  while ( !( UCSRA & (1<<UDRE)) );
  /* Put data into buffer, sends the data */
  UDR = data[0];
}

// C:\WinAVR-20100110\avr\include\avr\iom64.h
ISR(USART0_TX_vect) {

}


// receive

void USART_receive() {

  //init receive
  UCSRB = (1<<RXEN);

  //wait for unread data in the register
  while(!(UCSRA & (1<<RXC)));
  return UDR;

}

__________________________________________________________________

Komme nicht weiter, wäre echt super, wenn mir jemand helfen könnte, 
danke.

MfG Vali1991

von Thomas E. (thomase)


Lesenswert?

Sepp Horst schrieb:
> Habe schoin verschiedenste
> Beispiele ausprobiert, doch ohne Erfolg. Das letzte Beispiel war
> folgendes:
Da hilft nur noch "Alles markieren" und Strg + x.

Dann löten wir einen Draht am RS232-Stecker zwischen Pin 2 und Pin 3
und du kannst mit dem Terminal schreiben und die Zeichen werden gleich 
wieder empfangen. Schon mal das erste Erfolgserlebnis.

Zuerst nimmt man sich das Datenblatt vor und guckt sich an, welche 
Register eingestellt werden müssen.
Das ist beim 644 gar nicht so dramatisch:

#ifndef F_CPU
#define F_CPU 8000000UL   //(!)wichtig ist das UL(!)
                         //sonst verrechnet sich  der Compiler
#endif

#define Baud 19200

UCSR0B |= (1 << RXCIE0) | (1 << TXCIE0) | (1 <<RXEN0) | (1 << TXEN0);
UBR0 = (F_CPU+_Baud*8)/(_Baud*16)-1;
sei();

Jetzt bauchen wir noch 2 Interrupt-Handler:

ISR(USART0_RX_vect)
{
  //Und hier löten wir jetzt den Draht ein
  char nUdr = UDR0;
  UDR0 = nUdr;
}

ISR(USART0_TX_vect)
{
  //Die macht erstmal gar nichts
}

Wenn du jetzt mit dem Terminal deines Vertrauens, ohne lokales Echo, 
schreiben kannst, steht deine Verbindung. Das ist schon mal die halbe 
Miete.

Wenn das funktioniert, lässt du ihn selber was senden:

void Senddata(char* data)
{
   int nInd=0;
   while(data[nInd])
   {
      while (UCSR0A & (1 << TXC0)){}
      UDR0 = data[nInd++];
   }
}

Senddata("Hello World");


mfg.

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.