mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Beispiel für TWI-Slave ohne Interrupt gesucht


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte einen ATmega16 als TWI-Slave betreiben, wobei aber die 
I2C-Verarbeitung NICHT als Interrupt realisiert ist, sondern in einer 
Endlosschleife im Hauptprogramm läuft.

Grund dafür ist, dass in einer Interruptroutine ein Schrittmotor 
angesteuert werden soll und diese Routine soll nicht durch einen zweiten 
Interrupt gestört oder verzögert werden.
In meinem jetzigen Programm wird der Motor häufig gestört, wenn die 
TWI-Kommunikation dazwischenfunkt. Bei TWI im Hauptprogramm müsste die 
TWI-Verarbeitung halt kurz auf das Ende des Motor-IRQs warten, das wäre 
aber nicht schlimm.

Wo finde ich ein kleines Beispiel für einen TWI-Slave ohne Interrupt,
möglichst in Assembler ?


Gruß,
Martin

Autor: Andreas K. (ergoproxy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was wäre wenn du die Interupts in der Routine des Motors erst 
deaktivierst und dann wieder anschaltest, wenn du fertig damit bist?

Gruß ErgoProxy

Autor: Dino S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>In meinem jetzigen Programm wird der Motor häufig gestört,

Das kann nur bei relative schlichter Programmierung oder 
Schrittfrequenzen > 20kHz der Fall sein.
Aber wenn Du unbedingt den TWI-Int vermeiden möchtest, laß ihn doch 
einfach deaktiviert und frage hin und wieder das Flag ab.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Andreas und Dino,

>Was wäre wenn du die Interupts in der Routine des Motors erst
>deaktivierst und dann wieder anschaltest, wenn du fertig damit bist?

danke, das macht der Prozessor sowieso, weil das I-Flag innerhalb einer 
Interruptroutine weitere Interrupts verhindert.
Das Problem ist eher, dass wenn bereits ein TWI-Interrupt läuft (dann 
auch weitere Interrupts gesperrt sind), ein anstehender Motor-IRQ bis zu 
Ende der TWI-Routine warten muss.
Wenn ich in der TWI-Routine weitere (Motor-)Interrupts freigebe, treten 
weitere TWI-Interrupts auf, was eigentlich nicht sein sollte (?).
>Das kann nur bei relative schlichter Programmierung oder
>Schrittfrequenzen > 20kHz der Fall sein.

Die Interruptroutine für den Motor läuft mit 64 KHz, fragt einen Encoder 
ab und sendet bei jedem vierten Aufruf neue Daten zum Motortreiber, also 
mit 16 KHz. In den anderen drei Aufrufen werden Berechnungen 
durchgeführt (Schrittzähler erhöhen, Mikrostep-Sinustabelle auslesen 
usw.). Die CPU ist etwa 2/3 ihrer Zeit im Interrupt.
Die Störungen bringen den Motor nicht aus dem Tritt, also keine großen 
Probleme. Man fühlt und hört es aber am Motor, etwa wie ein leichter 
Lagerschaden oder Sandkörnchen im Lager. Nicht so gut, wenn man eine 
Präzisionsmaschine (Teleskopmontierung) damit antreiben will.

>Aber wenn Du unbedingt den TWI-Int vermeiden möchtest, laß ihn doch
>einfach deaktiviert und frage hin und wieder das Flag ab.

Danke, ich wusste nicht, das es so einfach ist. Einen TWI-Master habe 
ich so schon programmiert, aber ich dachte, ein Slave könnte vom 
sendenden Master 'überfahren' werden, wenn er mal nicht rechtzeitig 
reagiert.

Autor: Dino S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>aber ich dachte, ein Slave könnte vom
>sendenden Master 'überfahren' werden,

Das gerade nicht! Das ist der Vorteil vom IIC gegenüber USART 
Übertragung. Der Nachteil ist der, daß ein fehlerhafter Slave den Bus 
unbegrenzt blockieren kann. Ein timeout vorzusehen (ggf. watchdog), kann 
hilfreich sein.

>Die Interruptroutine für den Motor läuft mit 64 KHz, fragt einen Encoder
>ab und sendet bei jedem vierten Aufruf neue Daten zum Motortreiber,

Dann läuft Dein Controller schon mit 16-20MHz. Vielleicht gelingt es 
Dir, die 64kHz (Über-)Abtastung zu reduzieren. Auch ein Umschalten der 
Mikroschritte auf Vollschrittbetrieb ab 2-3kHz kann den Controller 
deutlich entlasten. Mikroschritte sind nur für langsame Bewegung 
sinnvoll.

Autor: Andreas K. (ergoproxy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nochmal ganz kurz:
In die Motorinterruptroutine kommt an den Anfang das beenden der 
globalen Interupts am Ende schaltest du sie wieder ein.

In die TWIinterruptroutine kommt am Anfang einfach das Aktivieren 
weiterer Interrupts  -> es kann eigendlich(kenn den Prog ned) nurnoch 
der Motorinterrupt kommen und der Beendet ja die Interupts. Aus der 
Schachtelung ergibt sich das der TWI immer unterbrochen werden kann aber 
der Motor immer durchläuft. Problem wäre nur wenn innerhalb der 
TWI-Verarbeitung ein weiterer Interuppt für TWI ausgelöst wird. Würde 
halt Chaos geben, aber da müsste ich halt wissen wie genau du was 
auslöst, m das genau sagen zu können.

Gruß ErgoProxy

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.