mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik USART vom ATmega128 will nicht...


Autor: Sascha Weitkunat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche schon länger den USART vom ATmega128 zum senden zu 
überreden, leider nur mit mäßigem Erfolg. In der Grundlegenden Struktur 
ist ja nicht viel falsch zu machen:

------------schnipp------------
// usart
outp((1<<RXEN)|(1<<TXEN), UCSR0B);

outp(0x00, UBRR0H);
outp(0x19, UBRR0L);

outp(0x90, UDR0);
------------schnipp------------

Ich bin eigentlich auf 9600 Baud aus, leider spielt der AVR nicht mit. 
Das ganze steckt im Moment auf dem STK300, auf dem Board ist ein Quarz 
mit dubiöser Aufschrift, "8.0000". Nun funktioniert leider keine 
denkbare einstellung des UBRR0L registers! Es kommen bestenfalls falsche 
Werte an, aber niemals 90h!

Um das ganze gleich nochmal vollkommen durchzutesten hab ich folgendes 
gemacht:

------------schnipp------------
// ================================================================
//  Includes
// ================================================================

#include <io.h>
#include <iom128.h>
#include <signal.h>
#include <sig-avr.h>
#include <interrupt.h>

// ================================================================
//  Definitions
// ================================================================

#define CPU_CLOCK    4000000  // 4MHz
#define UART_BAUD_RATE  9600  // 9600BPS

// ================================================================
//  Functions
// ================================================================


// ================================================================
//  Variables
// ================================================================


// ================================================================
//  Interrupts
// ================================================================

/*SIGNAL (SIG_INTERRUPT0)
{
  outp(0x42, UDR0);
}

SIGNAL (SIG_INTERRUPT1)
{
  outp(0x41, UDR0);
}*/

// ================================================================
//  Main Program
// ================================================================

int main(void)
{
  // init ports
  outp(0xFF, DDRB);
  outp(0x00, DDRD);

  // interrupts
  outp((1<<INT0)|(1<<INT1), EIMSK);
  outp((1<<ISC00)|(1<<ISC10), MCUCR);

  // usart
  outp((1<<RXEN)|(1<<TXEN), UCSR0B);

  //outp(0x00, UBRR0H);
  //outp(0x19, UBRR0L);

  sei();

  outp(0xFF, PORTB);

  unsigned char lo, hi;
  unsigned char i, j, k;

  for (hi = 0; hi < 255; hi++)
  {
    for (lo = 0; lo < 255; lo++)
    {
      outp(hi, UBRR0H);
      outp(lo, UBRR0L);

      for (i = 0; i < 255; i++)
        for (j = 0; j < 80; j++)
          k++;

      outp(0x90, UDR0);
    }
  }

  outp(0x00, PORTB);

  for (;;)
  {
  }

  return 0;
}
------------schnipp------------

Leider kommt nicht ein einziges mal 90h an, da ist was faul... Irgendwie 
sehe ich aber keine Fehler, alle möglichen Werte für die Baud-Select 
Register sind ja durchgekaut, trotzdem gehts nicht...

Autor: Markus Burrer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du denn auch die Fuses des Mega128 so umprogrammiert, das der 
externe Quarz auch verwendet wird? Im Lieferzustand läuft der mit einem 
internen Oszillator mit ca 1MHz. Da kannst Du lange rumexperimentieren.

Autor: Sascha Weitkunat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie gesagt, es handelt sich um das STK300 mit diesen, mehr oder eher 
weniger tollen, Adapter für den Chip - also Fabrikneu ist er nicht. Die 
Fuses sahen eigentlich Ok aus, nach einen weiteren Blick ins Datenblatt 
kann ich das auch nur bestätigen.

CKOPT  = 1

CKSEL0 = 0
CKSEL1 = 1
CKSEL2 = 1
CKSEL3 = 1

SUT0   = 0
SUT1   = 1

Ich bin mir bei der Quarzfrequenz allerdings auch nicht ganz sicher, 
8MHz können es eigentlich nicht sein, denn der ATmega103 läuft ja nur 
mit max. 6MHz!

Autor: Sascha Weitkunat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt wirds noch besser..

Ich habe in mein STK300 ein 11.0592MHz Quarz eingelötet der auch 
wunderbar schwingt, nun schreibe ich folgendes in die Register:

outp(0x00, UBRR0H);
outp(  71, UBRR0L);

Damit sollte der UART auf 9600 eingestellt sein, aber nichts ist, das 
Terminalprogramm liefert "€€€€€€€€€€€€€€€€€€€€ ".

Ich weiss mir nichtmehr zu helfe, ist der ATmega128 hinüber? 
Timer/Counter, TWI und SPI sind übrigens in Ordnung, deswegen wundert 
mich das doch etwas...

Autor: Christian (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hatte auch mal Probleme mit der USART - mittlerweile gehts, wenn du 
willst kann ich dir mal ein Beispielprogramm von mir posten....
Im Anhang findest du meine Lockbit Konfiguration - keine Garantie (wenn 
dein MC hernach nicht mhr reagiert - bei mir gehts auf jeden Fall...)
Dene Lockbits sind genau andersrum als die Hackerl, die ich in ony Prog 
gesetzt habe ( Hakerl entspricht einer 0???)

Viel Erfolg!!!

mfg

Autor: Diminator (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hHabe auch zurzeit so ein ähnliches Problem.

@  Christian könntest du bitte dein Bsp. posten?

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hoffentlich funktionierts so auch tatsächlich - bei mir im kompletten 
Programm eingebaut gehts auf jeden Fall...

mfg



#include <io.h>
#include <interrupt.h>
#include <sig-avr.h>

unsigned char recval;

SIGNAL(SIG_UART1_TRANS)
{
/* character of string to uart */
outp(100, UDR1);         //sendet 100 zur USART

}

SIGNAL(SIG_UART1_RECV)
{
recval = inp (UDR1); /* read data from uart buffer */

}
int main(void)
{
/* init the uart for receiving and transmitting of data */
outp((1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN),UCSR1B);
outp(103, UBRR1L); /* init speed @ 16Mhz 9600baud*/
sei(); /* enable interrupts */

outp(100, UDR1);
for(;;){}
}

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.