ich will mit einem Mircocontroller eine LED per PWM ansteuern und gleichzeitig mit einem Computer über RS232 "reden" soweit funktioniert das auch, die PWM läuft über den Timer 0 Interrupt und RS232 hab ich per software implementiert wenn grade nichts per RS232 gesendet wird funktioniert alles, wird aber beispielweise etwas empfangen, werden dafür die Interrupts deaktiviert (sonst würde die Übertragung ja aus dem Takt geraten sobald ein Interrupt dran ist) das Dumme daran ist nun, wenn ein Interrupt grade genau beim Empfangen an der Reihe ist, dann wird der einfach ignoriert Dadurch läuft der Timer übrig ohne auf den richtigen Wert gesetzt zu werden (ich benutz den 16-Bit Timer Modus, der Wert wird während dem Interrupt neu gesetzt) also wie schaffe ich es dass weder die PWM noch die RS232 aus demTakt gerät? den UART will ich nicht benutzen, das wär zu einfach, das muss auch so irgendwie gehen das müsste irgendwie so sein, dass der Interrupt gemerkt wird, und sobald Interrupts wieder zu gelassen sind abgearbeitet wird (klar ganz stimmen würde es auch nicht, aber die Abweichung wär ziemlich gering)
>(ich benutz den 16-Bit Timer Modus, der Wert wird während dem >Interrupt neu gesetzt) Benutze einen PWM-Modus!
msit sorry ich habs wieder vergessen, ich benutz einen 8051 Mikrocontroller (AT89C51ED2) soweit ich das mitbekommen hab gibts da keinen PWM Modus
ein Anfang wärs jedenfalls wenn ich in dem Moment in dem ich Interrupts deaktivier auch den Timer deaktivier, sobald ich die Interrupts wider anmach, mach ich auch den Timer wieder an dann gibts schonmal keinen Überlauf mehr und die Abweichung ist nur noch ziemlich klein, würd mich aber trotzdem interessieren obs irgendwie noch besser geht
>>den UART will ich nicht benutzen, das wär zu einfach, das muss auch >>so irgendwie gehen. lol warum einfach wenns kompliziert auch geht.(oder eben nicht) wie sieht denn deine Emfpangsroutine aus?
Sowas von schwachsinnig den usart nich zu nutzen. Damit wärn doch alle deine probs behoben und es ist doch unsinnig den usart nich zu nutzen wenn der chip einen hat ... dann hättest du noch viel raum für andere anwendungen im chip oder du könntest einen haufen strom spaaren ;-) also kommt drauf an woran du es betreibst wenn das ne solarzelle is ist es viel strom^^
ich mach das sowiso nur um was dabei zu lernen, wenn ich einfach den UART nehm wär der Lerneffekt ziemlich gering hier die Empfangsroutine: ;zu sendendes Byte in A übergeben in: mov R1, #08 ;Zähler mit 8 initalisieren (8 Datenbits) jb P3.0, $ ;warten bis das Stopbit vom Pc kommt clr TR0 ;PWM-Timer und somit gleichzeitig Interrupt abschalten call wait ;halbe Baudrate warten (damit in der Mitte abgetastet wird) in_1: call wait ;komplette Baudrate lang warten call wait ; mov c, P3.0 ;Bit in Carry einlesen rrc a ;A mit Carry als 9tem Bit rotieren djnz R1, in_1 ;Zähler runterzählen bis alle 8 Bit empfangen setb TR0 ;timer wieder aktivieren ret die wait Funktion wartet immer genau die Hälfte der Baudrate, damit mein ich den halben Abstand zwischen dem senden von 2 Bits der Code ist nicht wirklich von mir, auf www.erikbuchmann.de hab ich mir durchgelesen wie es geht und habs dann selbst neu geschrieben, aber ich denk mal das Ergebniss ist ziemlich ähnlich geworden aufjedenfall ist die abweichung immernoch viel zu hoch (ist auch kein Wunder die Empfangsroutine dauert ja vergleichsweise ziemlich lang)
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.