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
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
> // 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
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
>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
>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.
>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 ;)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.