Forum: Mikrocontroller und Digitale Elektronik ATMega128 UART Testen


von Andreas Kasper (Gast)


Angehängte Dateien:

Lesenswert?

hallo

ich soll für mein studium eine software für den atmega128 entwickeln. 
ein teil davon ist den uart in betrieb zu nehmen. i hab jetzt mal einen 
code geschrieben. das problem is, dass i keine hardware zum testen habe. 
ich wollte nun im avr-studio das programm simulieren, aber auf dem Tx 
pin steht immer nur eine 1. - mache ich etwas falsch, oder kann man das 
im avr studio ned simulieren?? falls es dort ned zu simulieren geht und 
jemand einen mega128 hat dann würde es mir sehr weiter helfen wenn er 
das programm testet und mir sagt ob es geht oder ned.

vielen dank
andreas kasper

von Magnus Müller (Gast)


Lesenswert?

Wenn ich mich nicht irre, sieht man im I/O-View von AVRStudio nie 
einen USART-Pin wackeln.

Code muss ich erst mal durchsehen...

Gruß,
Magnetus

von Magnus Müller (Gast)


Lesenswert?

>  // 8 DATA Bit
>  set_bit( UCSR0C, UCSZ00 );
>  set_bit( UCSR0C, UCSZ01 );
>  set_bit( UCSR0B, UCSZ02 );

Hiermit setzt du die Datenlänge nicht auf 8, sondern auf 9 Bits! Korrekt 
wäre an dieser Stelle:

// 8 DATA Bit
set_bit( UCSR0C, UCSZ00 );
set_bit( UCSR0C, UCSZ01 );
clear_bit( UCSR0B, UCSZ02 );

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

>  // RX Enable
>  set_bit( UCSR0B, TXEN0 );

Der Kommentar passt nicht ganz zum Code ;-)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

>  void uart_send( uint8_t zeichen )
>  {
>    while ( ! ( UCSR0A & ( 1 << UDRE0 ) ) )
>      UDR0 = zeichen;
>  }

Das ist Nonsense. Diese Funktion würde UDR0 erst beschreiben, wenn schon 
zu sendende Daten drin wären (klingt paradox... isses in dem Fall auch!)

Mach es lieber so:

void uart_send( uint8_t zeichen )
{
  while (!(UCSR0A&(1<<UDRE0));  // Warte, bis Puffer frei ist
  UDR0 = zeichen;               // jetzt das Byte ins UDR schreiben
}

Gruß,
Magnetus

von Andreas Kasper (Gast)


Lesenswert?

vielen dank!!

solche fehler sollten ja eigentlich nicht passieren wenn man sich 
richtig konzentriert.

so wie es aussieht kann i den code heute noch testen.

lg
andi

von Tobi O. (der_ossi)


Lesenswert?

>do
>{
>
>  uart_send( 'a' );
>} while ( 1 );

versuch hier lieber erstmal:

do
{

  uart_send( 'a' );
} while ( 0 );

dann wird es nur einmal ausgefuehrt... Das muesste ja reichen... Ich hab 
bei der Simulation immer wieder probs gehabt, wenn ich in einer schleife 
dauerhaft etwas gesendet habe

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>dann wird es nur einmal ausgefuehrt...
und was macht der Controller nach der Schleife? Rennt ins Nirvana!

Wenn man sich uart_send() genauer anguckt, und den Fehler, den Magnus 
Müller schon angemäkelt hat, beseitig, wird wunderschön regelmässig ein 
"a" übertragen.
Sonst kann eigentlich nur ein Hardware-Fehler vorliegen.

Es bietet sich aber auch an, die Register komplett neu zu beschreiben 
und nicht nur Bits zu setzen - es könnten (sollten aber eigentlich 
nicht) noch irgendwelche Bits in den Register gesetzt sein, die zu 
"wirrem" Verhalten des Controllers führen können.

von Tobi O. (der_ossi)


Lesenswert?

>und was macht der Controller nach der Schleife? Rennt ins Nirvana!

na dann kann man ihn ja in eine einfach schleife setzen, die nix macht 
;)

zb. while( 1 );

kommt ja bei der simulation nich drauf an :)

aber hast natuerlich recht... wenn das 'a' regelmaessig ankommt is 
natuerlich auch gut ;)

von Andreas Kasper (Gast)


Angehängte Dateien:

Lesenswert?

danke für die unterstützung.

leider konnte ich das programm immer noch nicht auf der hardware testen, 
da gestern alle plätze im labor belegt waren. also hab ich die software 
im avr studio erweitert und simuliert (dort funktioniert sie 
anscheinend). trotzdem würde es mir sehr helfen wenn trotzdem jemand das 
programm testen könnte und mir ein kurzes feedback geben.

vielen dank
andreas kasper

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.