www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt Problem


Autor: Scales O.j. (scales)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: inoffizieller WM-Rahul (Gast)
Datum:

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

Benutze einen PWM-Modus!

Autor: Scales O.j. (scales)
Datum:

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

Autor: Scales O.j. (scales)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Schoasch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Alexander (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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^^

Autor: Scales O.j. (scales)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.