mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART bei ATmega/88 Atmega168


Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche gerade, einen ATmega88 gegen einen ATmega168 zu tauschen. 
Dabei gibt's Probleme mit dem UART. Der folgende Code funktioniert beim 
Atmega88 wunderbar, beim ATmega168 aber nicht:

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

#define F_CPU 18432000
#define __OPTIMIZE__

// Baudrate
#define BAUD 115200

// Berechnungen zur Baudrate:
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
 
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
#endif

//Forwarddeklarationen 
void USART_Init( unsigned int ubrr);
void USART_Transmit( unsigned char data);
unsigned char USART_Receive( void );

char text1[4];

int main() 
{
        //USART initialisieren
  USART_Init(UBRR_VAL);
  uint8_t i=0;

  while(1)
  {
      i++;        
      itoa(i, text1, 16);
      USART_Transmit(text1[0]);
      USART_Transmit(text1[1]);            
      USART_Transmit(0x0A); //LF
      USART_Transmit(0x0D); //CR
        }        
  return 0;
}

void USART_Init( unsigned int ubrr) 
{
  //Set baud rate
  UBRR0H = (unsigned char)(ubrr>>8);
  UBRR0L = (unsigned char)ubrr;
  //Enable receiver and transmitter
  UCSR0B = (1<<RXEN0)|(1<<TXEN0);
  // Set frame format: 8data, 2stop bit
  UCSR0C = (1<<USBS0)|(3<<UCSZ00);
}

void USART_Transmit( unsigned char data )
{
  //Wait for empty transmit buffer
  while ( !( UCSR0A & (1<<UDRE0)) );
  //Put data into buffer, sends the data
  UDR0 = data;
}

unsigned char USART_Receive( void )
{
  // Wait for data to be received
  while ( !(UCSR0A & (1<<RXC0)) );
  // Get and return received data from buffer
  return UDR0;
}

die Routinen USART_Init, USART_Transmit und USART_Receive habe ich aus 
dem Datenblatt zum ATmega 48/88/168 entnommen, die Application Note 
"AVR095 - Migrating between ATmega48, 88 and 168" ist mir bekannt - sie 
enthält leider nichts, was auf einen Unterschied am UART zwischen den 3 
Prozessoren hinweisen würde. Andere Baudraten oder 
Stopbitkonfigurationen funktionieren mit dem ATmega88 auch, nicht aber 
mit dem 168. Ich benutze AVR Studio und achte darauf, mein device 
richtig einzustellen, wenn ich den Prozessor wechsle, auch am Programmer 
(usbprog am ISP) stelle ich immer zwischen dem 88 und dem 168 um.

... Weiss jemand, was ich noch ändern könnte ? - Oder, was ich übersehen 
habe?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fuses vergleichen.

Autor: Seppl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Checke mal ob die ISR-Vektoren stimmen.
Testweise Uart per Polling abfragen.....

Gruß

Seppl

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zwar keine Antwort auf Deine Frage, aber eine Anmerkung:
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) 
wird für Baudrates zwischen 4096 und 65535 falsche Werte liefern 
(Integer-Überlauf).  Verwende doch einfach die Makros aus 
<util/setbaud.h>.

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.