PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : UART per Interrupt



sunshine
16.03.2011, 13:42
Hallo,

ich nutze Codevision (gekaufte Version ohne Einschränkungen) und auf meinem Atmega128 2 UART Schnittstellen.

Diese habe ich mit dem Codewizard mit Interrupts erstellt. Ich habe den Interrupt jeweils für den Receive und für den Transmitter Buffer auf 8 gestellt.

Kann mir wer sagen, welche Auswirkungen die Größe des Buffers macht?

Muss ich irgendwas spezielles beachten, oder kann ich die Funktionen getchar, getchar1, putchar und putchar1 wie gewohnt benutzen und über die Interruptkonfiguration wird der Rest automatisch geregelt?

Danke, ich nutze Interrupts zum ersten Mal....

Cid
18.03.2011, 14:26
naja...
das Problem hatte ich im vorletzten Semester erst... Buffergröße vs. normaler Speicher...
bei 1kb Speicher und viel Datenmüll müssen die Buffer halt kleiner ausfallen

im Sendebuffer legst du alles ab, was du senden willst...
wir haben da ein Ringbuffersystem aufgebaut gehabt, so dass man immer max. Sendeplatz nutzen konnte - nie Speicher blockiert... egal btt
der Buffer ist dafür da, dass du die Daten direkt erzeugen kannst und darin ablegen kannst... die Daten können dann direkt - sobald die Leitung frei ist - übertragen werden...
Vorteil:
Daten können erstmal komplett erzeugt werden, bevor man sie sendet
µC muss nicht sinnlos rumidlen um den richtigen Moment für's Senden abzupassen

Empfangsbuffer ist genau andersrum
Daten, die ankommen, werden erstmal dort abgelegt und können später vom Programm verarbeitet werden
Vorteil:
Routine kann erstmal durchlaufen (sonst müsste man erstmal Register freiräumen, ...)
µC muss nicht ständig nachgucken, ob was ankommt und dann ein Register irgendwo hin schreiben, weil ja gleich wieder was ankommen könnte
(wenn man das mit Buffer ganz extrem sieht) µC muss nicht in nem Status festhängen und nichts tun, weil er auf den Rest eines Pakets wartet...

Die Buffergröße liefert ein wenig Bequemlichkeit... betrachten wir es mal aus der Sicht:

Warum die Größe wichtig ist/Wann sollte man ihn vergrößern?

wenn die Datenpakete größer sind und man sie komplett braucht (sonst müsste man sie in einen anderen Buffer zwischensichern) [Beispiel: Crypto-Coprozessor für Verfahren mit Blocklänge]
wenn die Anzahl der Pakete pro Zeit "groß" ist [Überlauf durch Stoßzeiten, UART eigentlich nur, wenn man nicht abräumt]
wenn das Programm geschützte Bereiche hat, in denen es auf Bufferinput nicht reagiert [z.B. ABS oder sowas, wo Parameter warten müssen]
wenn man sich sicher sein muss, dass kein Paket verloren geht [Daten die beim Sender weggeworfen werden nach dem Senden]


Kenne die Funktionen nicht, hatten uns da ne eigene Lib an Funktionen geschrieben, weil wir die Pakete unterschiedlich interpretiert haben... (Zeitstamp, Text, Messwerte, ...)... sollten aber auch mit veränderter Buffergröße funktionieren...

steveLB
19.03.2011, 22:56
Codevision AVR, hat den Codewizzard, vergleiche doch einfach den Code, einmal mit 8 und einmal mit mehr, dann siehst genau was der Unterschied ist. Ich würds auf 8 lassen, hast du die Help von Codevision mal aufgerufen und dort mal gesucht ?