Interrupt Problem

OP #394765
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)
OP #394768
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
Gast #394769
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?
Gast #394770
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^^
OP #394771
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)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren