Problem mit Übertragung zu Controller

Gast #1225051
Lesenswert?

Hallo liebe AVR gemeinde,
hab Problem mit meinem  at90pwm216.
Hab ein kleines Program, das 16 Bit sendet soll, er überträgt nur dann 
wenn ich denn Write Flash Baten klick neben dem Connect obwohl eine 
while schleife existiert.
Weis jemand die Lösung für mein Problem.
Vielen dank!

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


  void EUSART_Transmit_data( unsigned int data )
  {
  // Wartet, bis Transmit lehr ist
  while ( !( UCSRA & (1<<UDRE)))
  {
  };
  //Die datei wird in den Buffer geladen und dann gesendet
  EUDR = data>>8;
  UDR = data;
  }

int main (void)
{
  UBRRL = 207;  //Setzt Baudrate des Transmitters auf 1200;
  UCSRC = 0b00001000; //Setzt die Stop-Bits auf 2;
  MUBRR = 833; //Setzt Baudrate des reveivers auf 1200 und Frequenz auf 
1MHz
  EUCSRA = 0b10110111; //Hier wird die Anzahl der zu senden Bits 
eingestellt (16)
  EUCSRB = 0b00011010;  //EUSART-Mode wird eingeschaltet
  UCSRB = 0b00011000;  //EUSART Transmitter wird eingeschaltet
  unsigned int data = 0b1010100101111001;

  EUSART_Transmit_data(data);
  while(1)
  {
  }
}
#1225055
Lesenswert?

Die Schleife tut ja auch nix. Dein Programm übertragt nach dem Start 
einmalig 16 Bits und dreht dann intensiv Däumchen. Nach Reset (oder 
Neuprogrammierung) geht das dann wieder von vorne los. Wenn sich daran 
was ändern soll, dann muss die Übertragung in die Schleife rein und 
nicht davor.

Apropos: Wer sitzt denn am anderen Ende der Übertragung? PCs sind über 
UART-Transfer mit 16 Datenbits nicht wirklich glücklich.
Gast #1225076
Lesenswert?

kann es an der Baudrate liegen? ODER
 benutze extern 4MHz.


UBRRL = 207;  //Setzt Baudrate des Transmitters auf 1200;
  UCSRC = 0b00001000; //Setzt die Stop-Bits auf 2;
  MUBRR = 833; //Setzt Baudrate des reveivers
Gast #1225105
Lesenswert?

hab ein programm aus dem buch, muss eigentlich funktionieren.


#define TAKT 4000000UL
#define UART_BAUDRATE 9600UL

#define UART_SETTING ((TAKT/16UL/UART_BAUDRATE)-1)



void USART_Init()     //(unsigned int baud )  //beispiel USART 
Initialization
{
   //Baudrate einstellen
  UBRRH = (unsigned char)(UART_SETTING>>8);
  UBRRL = (unsigned char)(UART_SETTING);

  //Empfänger und Sender einstellen
  UCSRB = (1<<RXEN)|(1<<TXEN);

  //Set frame format: 8data, no parity & 2 stop bits Asynchron
  UCSRC = 
(1<<UMSEL)|(0<<UPM1)|(0<<UPM0)|(1<<USBS)|(0<<UCSZ0)|(1<<UCPOL); 
//UCPOL=1 Steigende Flanke

}
void USART_Transmit( unsigned int data ) //im Beispiel einfach (char 
dat)
{
  // Warte bis Buffer bereit
  while ( !( UCSRA & (1<<UDRE)));   //erst ins EUDR die 16 Bits laden
                  //befor das niedrigste Bit ins UDR geschrieben wird
                  //das schreiben ins UDR ermöglicht das Starten der 
Übertragung
  // Put data into buffer, sends the data
  EUDR = data>>8;
  UDR = data;
}

unsigned int USART_Receive( void )
{

  // Wait for data to be received
  while ( !(UCSRA & (1<<RXC)) );
  return UDR;
}

void string(char *str)
{
  unsigned char i;
  for(i=0; i<255; i++) //Maximal 255 Zeichen ausgeben
  {
    if(str[i] !=0)
      USART_Transmit(str[i]);
      else
      break; //Ende des Strings erreicht
  }
}


int main (void)
{
  USART_Init();
  string("Test - RS232 [OK]...\r\n\r\n");

  while (1)
  {
  }

  return 0;
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren