Forum: Mikrocontroller und Digitale Elektronik Konzept für USART + ADC + PWM


von Phil (Gast)


Lesenswert?

Hallo Leute,

ich sitze momentan an einem kleinen Problem.

Und zwar möchte ich mir eine LED Steuerung entwerfen und dazu einen 
Sensor abfragen und per USART/RS232 mit dem PC kommunizieren.

Jetzt habe ich mich schon belesen über das Auslesen des ADC und des 
USART.

Meine Frage ist, wie ich das am besten zeitlich regeln sollte.

Ich habe eine ISR die alle 32us aufgerufen wird. In ihr werden diverse 
"Zeitzähler" inkrementiert und der ADC ausgelesen. Der ADC braucht für 
eine Wandlung 8us, also warte ich nicht auf ihn mit while sondern frag 
per if die Wandlung ab.

Nun möchte ich über den USART 10 bit senden und empfangen können. Ich 
habe gelesen, dass man für 10bit bei 9600 baud rund 1ms benötigt! Wie 
kann ich das jetzt steuern, dass ich "parallel" senden/emfpangen kann, 
OHNE dabei meine ISR mit den Timern unregelmäßig werden zu lasen?

Philipp

von Marcel V. (antis)


Lesenswert?

Hallo,

- muss denn eine so hohe Sampling Rate sein?
- was ist denn das für ne Anwendung?
- senden/empfangen parallel geht sowieso nicht, da beides über das UDR 
Register muss
- warum keine höhrere Baudrate?
- was hat das mit dem PWM aus der Überschrift auf sich?
- Interrupts haben vorrang. Wenn du Daten sendest, dann werden die nur 
ins UDR geschrieben und dann war es das, der Code wird dann weiter 
abgearbeitet. Das senden geschieht dann eigentlich im Hintergrund. Ich 
denke nicht, dass dein Timing da durcheinander kommt.


mfg
antis

von spess53 (Gast)


Lesenswert?

Hi

Der verwendete Controller ist wahrscheinlich geheim?

MfG Spess

von Phil (Gast)


Lesenswert?

Marcel V. schrieb:
> - muss denn eine so hohe Sampling Rate sein?
>
> - was ist denn das für ne Anwendung?

selbst wenn ich die Samplingrate runter schraube komme ich auf min. 
16us.

Der Timer den ich verwende ist der Timer 1, welcher als fast PWM läuft. 
Ich würde den gerne benutzen, da ich eine Hardware(!) PWM machen möchte 
und bei meinem Controller, dem AT90PWM3B, nur 2 Timer zur Verfügung 
habe. Jeweils beide sind für meine 3 RGB LEDs.

> - warum keine höhrere Baudrate?

Weil ich erst mit der ganzen USART geschichte beginne und überall in den 
Tuts mit 9600 baud übertragen wird. Sicherlich kann man das noch 
hochstellen, aber es muß erstmal so gehen.

> - Interrupts haben vorrang. Wenn du Daten sendest, dann werden die nur
>
> ins UDR geschrieben und dann war es das, der Code wird dann weiter
>
> abgearbeitet. Das senden geschieht dann eigentlich im Hintergrund. Ich
>
> denke nicht, dass dein Timing da durcheinander kommt.

Also sollte ich mir einen Interrupt fürs Empfangen schreiben, aber fürs 
senden nicht ?

Ich möchte am Ende mal meine RGB LEDs per PC einstellen können. Sprich 
3*8bit+Startbit+Stopbit senden. Was bei 9600 baud ca. 3ms sind. Selbst 
bei 19200 baud sind das noch 1,5ms.

Wie kann ich das also anstellen,dass meine Interrupts laufen UND ich 
meine Daten empfangen kann.

spess53 schrieb:
> Der verwendete Controller ist wahrscheinlich geheim?

Mit Nichten der Herr. Es ist ein AT90PWM3B.

von Falk B. (falk)


Lesenswert?

@  Phil (Gast)

>Ich habe eine ISR die alle 32us aufgerufen wird.

Stolze 30kHz. Warum so fix?

> In ihr werden diverse
>"Zeitzähler" inkrementiert und der ADC ausgelesen. Der ADC braucht für
>eine Wandlung 8us, also warte ich nicht auf ihn mit while sondern frag
>per if die Wandlung ab.

???

Der ADC läuft parallel zur CPU. Man kann die Wandlungszeit für andere 
Dinge nutzen.

>Nun möchte ich über den USART 10 bit senden und empfangen können. Ich
>habe gelesen, dass man für 10bit bei 9600 baud rund 1ms benötigt!

Stimmt ;-)

> Wie
>kann ich das jetzt steuern, dass ich "parallel" senden/emfpangen kann,
>OHNE dabei meine ISR mit den Timern unregelmäßig werden zu lasen?

Und DU willst mit dem Kenntnisstand das zu Wege bringen?
Mein Rat. Back erstmal kleinere Brötchen.
Rat Nr. 2. Netiquette.

MFG
Falk

von Falk B. (falk)


Lesenswert?

@  Phil (Gast)

>Ich möchte am Ende mal meine RGB LEDs per PC einstellen können. Sprich
>3*8bit+Startbit+Stopbit senden. Was bei 9600 baud ca. 3ms sind. Selbst
>bei 19200 baud sind das noch 1,5ms.

Und wozu brauchst du dann 30 kHz am ADC?
PWM macht der Zäjler selber, ohne CPU-Last.

>Wie kann ich das also anstellen,dass meine Interrupts laufen UND ich
>meine Daten empfangen kann.

Mit Interrupt ;-)

Dir fehlen einige Grundlagen und Kenntnisse. Die musst du dir erst 
erarbeiten. Dann kannst du das Ding angehen.

MFG
Falk

von Marcel V. (antis)


Lesenswert?

Also ich kann aus der Sache immer noch nicht schlussfolgern, warum man 
für ein paar LEDs ne 30kHz Samplingrate braucht und das mit den Timings 
so kompliziert ist.

Wie bereits geschrieben wurde läuft der ADC sowieso nebenbei. Musst du 
nur starten und wenn er fertig ist Werte abholen. Im FreeRunning Mode 
sogar nur Werte abholen. Das Verarbeiten sollte dann recht fix gehen, 
wenn da nicht die höchste Mathematik hintersteht.

Ausgabe über RS232, wie erwähnt, kann dann byteweise gemacht werden. 
Erstes Byte ins UDR und dann solange abfragen, bis dieses wieder leer 
ist um es mit dem nächsten Byte zu füttern. Dabei meine ich jetzt nicht, 
dass du an der Stelle mit ner while(...) ewig wartest, sondern bei jedem 
Programmdurchlauf schaust, ob die Daten schon durch sind. Dann kannst du 
nebenbei auch ne Menge machen. Empfangen kannste über nen Interrupt. 
Stichwort Ringspeicher um die Daten schnell abzuspeichern. Baudrate von 
115,2k sind keine Seltenheit und auch nicht anders zu handeln, als 9,6k 
oder andere.

Aber ich kann meinen Vorrednern nur Recht geben. Da fehlen anscheinend 
noch die Grundlagen.

Trotzdem gutes Gelingen.

mfg
antis

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.