Atmega8 USART

OP #324988
Lesenswert?

Vorher habe ich in AtmegaMiniModul (mit Atmega8 16AI) den Transport über
RS232 zum PC implementiert. Aber jetzt ich kann in Robo008 (mit
Atmega8-16PU) die Daten über RS232 zum PC nicht richtig transportieren.
In Computer kann ich nur immer 0 bekommen. Ich denke, alle sind Atmega8,
nur verschiedenes packaging, deshalb benutze ich die gleichen Code. Und
ich habe die Schaltungen verglichen, es gibt auch kein großes
Unterschied, nur Treiberbaustein in AtmegaMiniModul ist MAX202CSE,
während in Robo008 MAX232, alle andere Verbindungen sind gleich.
Ich habe die TXD und RXD Porte von Atmega8 16AI und ATmega8-16PU
jeweils mit ein RS422 Treiberbaustein angeschloßen, und auch den
gleichen Ergebnis. Atmega8 16AI transportiert richtig, Atmega8-16PU
transportiert immer 0, immer falsch.
Hat jemand den gleiche Fall mal getroffen? Hat jemand eine Idee
darüber?
Vielen Dank!
Gast #324991
Lesenswert?

Vermutlich ist das Timing im Programm-Code aber noch auf eine der beiden
Taktfrequenzen festgelegt. Die Baudrate u.ä. wird meist per Makro im
Programm (vom Preprozessor) berechnet.
Damit hat das Makefile IMHO nichts zutun.
OP #324992
Lesenswert?

Mein Programm ist so einfach wie folgend:
void USART_Init( unsigned int baud )
{

  /* Set baud rate */
  unsigned int ubrr = 1000000/baud-1;

  UBRRH = (unsigned char)(ubrr>>8);
  UBRRL = (unsigned char)ubrr;
//  UBRRH=0x00;
//  UBRRL=0x67;
  /* Enable Receiver and Transmitter */
  UCSRB = (1<<RXEN)|(1<<TXEN);
  /* Set frame format: 8data, 2stop bit */
  UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
}
void USART_Transmit( unsigned char data )
{
  /* Wait for empty transmit buffer */
  while ( !( UCSRA & (1<<UDRE)) )
    ;
  /* Put data into buffer, sends the data */
  UDR = data;
}

In main Programm:
  USART_Init(9600);
  for(int i =0; i< 10; i++)
  {
  USART_Transmit(0xa0);
  }

Ich kann niergendwo für Einstellung des Timing finden.
OP #325004
Lesenswert?

Ich habe so geschrieben:

#define fosc 14745600

....
  unsigned int ubrr = fosc / (16 * baud) - 1;

  UBRRH = (unsigned char)(ubrr>>8);
  UBRRL = (unsigned char)ubrr;

Dann kann es die Werte für UBRR automatisch rechnen.

Wenn du fragst, rechne ich selbst.
wenn baud = 9600, dann soll UBRRH = 0x00, UBRRL = 0x5f sein.

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