www.mikrocontroller.net

Forum: Compiler & IDEs Problem mit Übertragung zu Controller


Autor: Mathes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)
  {
  }
}

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mathes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mathes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dem Oszi dürfte die Baudrate egal sein.

Autor: Mathes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der zweite vom STK ist extra dafür da.

Autor: Mathes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen dank,
ich probiere es gleich mit dem Terminal von windows

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber nicht mit 16 Datenbits.

Autor: Mathes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.