Forum: Compiler & IDEs Problem mit Übertragung zu Controller


von Mathes (Gast)


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)
  {
  }
}

von (prx) A. K. (prx)


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.

von Mathes (Gast)


Lesenswert?

jö sorry,
hab ein Oszi drangehängt am TXD pin

meinst du so? die while(1) in der main

while(1)
  {
   EUSART_Transmit_data(data);
  }

hab das auch schön probiert.

von (prx) A. K. (prx)


Lesenswert?

Yep, dann müsste mehr los sein. Wobei ich die Steuerbits aber nicht 
kontrolliert habe, diese EUSART war mir bisher noch nicht untergekommen.

Probier das doch erst einmal ohne diese EUSART Funktionen und Register, 
also klassisch mit 8 Bits pro Frame.

von Mathes (Gast)


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

von (prx) A. K. (prx)


Lesenswert?

Dem Oszi dürfte die Baudrate egal sein.

von Mathes (Gast)


Lesenswert?

mal andere frage.
am STK500 gibt es doch zwei rs232 anschlusse, kan ich von da direkt an 
die com1 am pc oder muss ich ein max232 bauen?

von (prx) A. K. (prx)


Lesenswert?

Der zweite vom STK ist extra dafür da.

von Mathes (Gast)


Lesenswert?

vielen dank,
ich probiere es gleich mit dem Terminal von windows

von (prx) A. K. (prx)


Lesenswert?

Aber nicht mit 16 Datenbits.

von Mathes (Gast)


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;
}

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.