PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : UART Sendepuffer-Abfrage mit Bascom



Heideltrudel
01.08.2007, 09:04
Hallo erstmal,
ich habe probleme mit einem AT90S8535. Ich programmiere mit Bascom.
Der Proz soll eine Schleife durchlaufen und über die UART Zeichen ausgeben.
Der Proz ist so schnell, dass wohl der Sendepuffer überschrieben wird und dann wildes Zeug gesendet wird. Den Befehl Loop until Ucsra.txc = 0 kann ich nicht verwenden.
Die Abfrage UDR oder UCR hatte auch keinen durchschlagenden Erfolg.
Weiss einer mehr zu meinem Problem ???

Vitis
02.08.2007, 00:29
den txc kann man nicht nur als Flag verwenden,
die UART kann auch nen Interrupt bei Zeichen gesendet
ausführen. Dann nächstes Zeichen in den Puffer und fröhlich weiter im Text.

on utxc puffer_leer
enable utxc
enable interrupts

Heideltrudel
02.08.2007, 16:43
Hallo Vitis,
ist echt toll mit dem Interrupt, aber so viel ich weiss, muss doch nach jedem auslösen des Interrupts auch wieder ein Return kommen !?
Ich überlege gerade wie ich das anstelle.
Mein Programm übernimmt einen Wert vom ADC. Dieser wird ein bischen umgeformt , in eine Variable gepackt , zusammen mit noch anderen und alle zusammen an die UART (Sender) geschickt. Danach wird wieder der ADC abgefragt.
So habe ich eine Schleife. Die UART sendet mit 2400 Baud und ist somit das Langsamste inder Schleife. Wie kann ich denn jetzt den Interrupt UTXC dort einbauen ? Ich kann doch nicht immer die ADC-Schleife abfragen und Berechnungen anstellen, die in Variablen abgespeichert werden und irgendwann löst der Interrupt aus, zu einer Zeit wo die berechneten Variable nicht zueinander passen, die dann übertragen werden ?!
MfG Jürgen

Vitis
02.08.2007, 19:11
ist doch an sich gar kein Problem.
Du hast eine Messroutine, welche
Dir Werte in Variablen speichert.
Zu irgendeinem Zeitpunkt willst Du die Variablen übertragen
und günstigstenfalls dies auch noch Byteweise.
Nun kopierst Du Deine Messdaten in ein Array von Bytes
und schickst das erste Byte an die UART z.B.

UDR=sendebyte(1)
oder am besten halt gleich nen Zähler verwenden:

zaehler=1
UDR=sendebyte(zaehler)

in deiner TXC Interruptroutine erhöhste Du einfach den
Arrayzähler um jeweils 1

also incr zaehler

und schickst das nächste Byte an die UART

also: UDR = sendebyte(zaehler)

dies machste natürlich nur so lange bis ein ganzer
Messdatensatz drüben ist also beispielsweise

incr zaehler
if zaehler < 10 then
UDR = sendebyte(zaehler)
end if

fürü zehn zu übertragende Bytes ... thats it

Heideltrudel
03.08.2007, 21:12
Hallo Vitis,
der Ablauf ist mir im Prinzip klar. Ich sende mehrere Bytes hintereinander.
Wie bastel ich denn jetzt den Sendepuffer-Leer-Interrupt dort rein. In eine Warteschleife kann ich Den Prozessor nicht führen, denn da kommt er nicht wieder raus. Er müsste eigentlich die Sendeschleife durchlaufen und dort bleiben. Sobald der Puffer leer ist müsste er zur ADC-Abfrage springen per Interrupt , Berechnungenanstellen und wieder zum Sender. Aber wo baue ich den Return-Befehl ein, den der Interrupt benötigt ??? !!!