Forum: Mikrocontroller und Digitale Elektronik Interrupt Problem


von Scales O. (scales)


Lesenswert?

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)

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>(ich benutz den 16-Bit Timer Modus, der Wert wird während dem
>Interrupt neu gesetzt)

Benutze einen PWM-Modus!

von Scales O. (scales)


Lesenswert?

msit sorry ich habs wieder vergessen,
ich benutz einen 8051 Mikrocontroller (AT89C51ED2) soweit ich das
mitbekommen hab gibts da keinen PWM Modus

von Scales O. (scales)


Lesenswert?

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

von Schoasch (Gast)


Lesenswert?

>>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?

von Alexander (Gast)


Lesenswert?

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^^

von Scales O. (scales)


Lesenswert?

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
Noch kein Account? Hier anmelden.