Hallo Ihr, ich steige momentan von Bascom auf C um und stoße dabei häufig auf Probleme die früher ohne Probleme liefen. z.B. der UART Interrupt. Ich lasse das angefügte Programm auf einem Mega 8 laufen. Doch leider funktioniert der Interrupt nicht. Hardware ist auch ok, das habe ich mit einem anderen Programm ohne Interrupt getestet (gleicher Takt und Baudrate). Ich hab auch das Datenblatt und die Suche hier im Forum bemüht aber ich finde den Fehler einfach nicht. Ich wäre echt dankbar wenn da jemand drüber schauen könnte. Das Beispiel ist übrigens von www.kreatives-chaos.com (Super Seite übrigens) Danke schon mal Georg
> ich steige momentan von Bascom auf C um und stoße dabei häufig auf > Probleme die früher ohne Probleme liefen. Klar, weil BASCOM ja praktisch eine Art Laufzeitsystem mitliefert (soweit ich weiß). Solange du damit auskommst, ist das natürlich komfortabel, weil solche Dinge wie die Interrupts der Entwickler für dich bereits ordentlich bearbeitet hat. > Doch leider funktioniert der Interrupt nicht. Probier's doch mal mit dem (globalen) Einschalten der Interrupts. ;-) Ein sei() irgendwo nach dem Initialisieren der Hardware könnte Wunder helfen. Nur mal so: /* Daten aus dem Puffer lesen ... */ buffer = UDR; /* ... warten bis der Sendepuffer leer ist ... */ while ( !( UCSRA & (1<<UDRE)) ) ; /* ... und gleich wieder zurück schicken */ UDR = buffer; Da musst du eigentlich nicht warten. Die Daten können ja nicht schneller einlaufen, als man sie auch wieder senden kann. Da der Sender einen einstufigen Puffer hat (außer dem Schieberegister mit dem aktuell gerade in der Sendung befindlichen Zeichen gibt es noch ein Pufferregister, das man während des Schiebens bereits wieder schreiben kann), muss man nichtmal ein einziges Bit testen. Die Routine reduziert sich also zum etwas lustig anmutenden: UDR = UDR;
Hallo Jörg, Dein Tip war natürlich entscheident. Habe sei() auch schon selber probiert aber wohl nicht an der richtigen Stelle. Ich dachte eigentlich die Interrupts sind automatisch durch das aufrufen der avr/interrupt.h eingeschaltet. Danke auch für den UDR=UDR;-Tip Funktioniert einwandfrei.
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.