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