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


von Sascha Weitkunat (Gast)


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...

von Markus Burrer (Gast)


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.

von Sascha Weitkunat (Gast)


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!

von Sascha Weitkunat (Gast)


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...

von Christian (Gast)


Angehängte Dateien:

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

von Diminator (Gast)


Lesenswert?

hHabe auch zurzeit so ein ähnliches Problem.

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

von Christian (Gast)


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

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.