www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Tasks bei Atmel ATmega128


Autor: Furo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ist es bei einem ATmega128 möglich unabhängig von einem Hauptprogramm 
z.B. eine LED blinken zu lassen.
Dabei sollte aber das Hauptprogramm z.B. nicht durch einen 
Timer-interrupt unterbrochen werden.

Danke für Eure Antworten!

Gruß
Furo

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm ne Blinkled. Pin einschalten und sie blinkt
unabhängig bis der Pin wieder ausgeschaltet wird.

Sonst gehts nur mit Interrupt.

Autor: Furo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das bringt leider nichts. Der Takt muss variabel sein....

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht mit einem PWM Port.

Autor: AVRFan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, das ist möglich.  LED an Pin OC1A anschließen, T/C1 im CTC-Mode 
laufen lassen (Prescaler und Compare Match-Wert der Wunsch-Blinkfrequenz 
entsprechend wählen), Output Compare Mode auf "Toggle on Compare Match" 
setzen (COM1A1 = 0, COM1A0 = 1).  Das Togglen des OC1A-Pins erfolgt 
völlig autonom durch die Timerhardware.

>Dabei sollte aber das Hauptprogramm z.B. nicht durch einen
>Timer-interrupt unterbrochen werden.

Ich dachte immer, dass gerade das Hauptprogramm durch Interrupts 
unterbrochen werden können sollte (weil wenn nicht das, was sonst?)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AVRFan wrote:

> Ich dachte immer, dass gerade das Hauptprogramm durch Interrupts
> unterbrochen werden können sollte (weil wenn nicht das, was sonst?)

Ja, genau so isses.
Wer auf Interrupts verzichtet, der verzichtet auf 99% der 
Programmiermöglichkeiten.

Insbesondere auf dem großen ATmega128 Boliden kann ich mir keine 
Anwendung ohne Interrupts vorstellen (auf nem kleinen ATiny13 vielleicht 
mit viel Mühe).


Peter

Autor: Furo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PWM ist eine schöne Idee, aber leider ist der Port schon belegt..

Das ist ja nicht so, dass ich Interrupts generell nicht will.
ich brauche Sie sogar sehr. Nur wollte ich den µC nicht zusäzlich mit 
einer Interrupt belasten, um ein paar Ausgänge zu toggeln.

Da hat die neue Xmega-Serie Vorteile. ;)
Aber ich bin ja erst bei der Ressourcen-Planung. Ich programmier es dann 
mal mit Timern. Und mach es über eine Interrupt-Routine. Mal schauen, ob 
es irgendwelche Probleme gibt.

Autor: Sebastian Heyn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hängt von der Software ab, man könnte Zb an den Uart Port hängen und mit 
ganz niedriger Baudrate ab und zu mal (Je nach Programm) Was ausgeben. 
-> die LED Blinkt.

Autor: Furo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leider auch nicht frei.
Der Atmega hat nur noch einen freien Pin: PB0
Der Rest ist belegt.

Trotzdem Danke! ;)

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Furo wrote:
> PWM ist eine schöne Idee, aber leider ist der Port schon belegt..
>
> Das ist ja nicht so, dass ich Interrupts generell nicht will.
> ich brauche Sie sogar sehr. Nur wollte ich den µC nicht zusäzlich mit
> einer Interrupt belasten, um ein paar Ausgänge zu toggeln.

Ein Timer-Interrupt kann mehrere Dinge verwalten. Das bissel LED-Toggeln 
(oder gar morsen) macht eine State-machine im Timer-Int nebenbei.

>
> Da hat die neue Xmega-Serie Vorteile. ;)

Reize doch erstmal die vorhandenen Systeme aus, ehe Du nach Neuen rufst.

> Aber ich bin ja erst bei der Ressourcen-Planung. Ich programmier es dann
> mal mit Timern. Und mach es über eine Interrupt-Routine. Mal schauen, ob
> es irgendwelche Probleme gibt.

...

Autor: AVRFan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Der Atmega hat nur noch einen freien Pin: PB0
>Der Rest ist belegt.

Und das, was zum Anschluss an PB1 geplant ist, ist bei Deinem aparten 
Projekt auch nicht auf PB0 umlegbar, damit PB1 mit der Sonderfunktion 
OC1A für die BlinkLED freiwird?

Autor: Werner A. (homebrew)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bist du vielleicht der Meinung, dass man jeden Timer nur für eine 
Funktion nutzen kann? Was spricht denn dagegen, den Systemtimer der 
meinetwegen in ms zählt zu nehmen und die LED per modulo division 
toggeln läßt.
so ala
if ((systemtimer % 200) == 0){
  PORTB ^= ( 1 << PB0 );
}

Autor: Furo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@AVRFan:
Leider nein. SPI wird genutzt.

@Werner A.:
Ehrlich gesagt kann ich deinem Code nicht ganz Folgen.
Der Systemtimer ist doch auch nichts anders als ein Timer, der bei jedem 
Tick den Systemtimer um eins erhöht, oder?

Autor: Tunichgut (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Der Systemtimer ist doch auch nichts anders als ein Timer, der bei jedem
Tick den Systemtimer um eins erhöht, oder?

Also:

>Der Systemtimer ist .. ein Timer, der ... den Systemtimer ... erhöht

Duck und wech!

Autor: AVRFan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Leider nein. SPI wird genutzt.

Muss mich korrigieren, weil ATmega8 im Kopf gehabt. Berichtigung: OC1A 
liegt beim ATmega128 auf PB5.  Leg also das, was derzeit an PB5 hängt, 
um auf den noch freien PB0.  BlinkLED dann an PB5 und über OC1A blinken 
lassen.

Problem gelöst :-)

Autor: Werner A. (homebrew)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du schreibst doch dass du die Systemtimer sogar sehr brauchst.
Was machst du denn mit den Timerinterrupts? Eine Variable jede ms eins 
hochzählen lassen kostet nicht viel. Die LED-Routine kannst du dann ja 
ins Hauptprogramm auslagern.

Autor: Furo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Werner A. :
Ich glaub ich steh grad auf dem Schlauch, was versteht man nochmal unter 
einem Systemtimer?

@AVRFan:
Vergiss bitte umlöten. Das Layout steht.

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also wenn du den Timer nicht zu schnell Taktest vergehen für den AVR 
Tage bis der nächste Interrupt kommt. Da das Blinken wohl für den Mensch 
als Signalisierung gedacht ist (daher die Blinkfrequenz soll erkennbar 
sein) brauchst du den ja gar nicht so hoch Takten. Wenn dir der größte 
Teiler immernoch nicht reicht, schließe nen Uhrenquartz an den 
Timer/Counter Oscillator Pins an. Dann bekommst du auch die Interrupts 
auf Wunsch auch sekundenweise.

Autor: michel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
er könnte doch in dem timerinterrupt ne zählvariable erhöhen, deren wert 
abfragen und bei nem gewünschten wert einfach die led ein bzw 
ausschalten

Autor: Manfred B. (vorbeigeschlendert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Furo wrote:
> @Werner A. :
> Ich glaub ich steh grad auf dem Schlauch,

das glaub ich auch...

>Das ist ja nicht so, dass ich Interrupts generell nicht will.
>ich brauche Sie sogar sehr. Nur wollte ich den µC nicht zusäzlich mit
>einer Interrupt belasten, um ein paar Ausgänge zu toggeln.

dann erzähl einfach mal was im Moment mit denen machst...   wird auch 
einer in regelmäßigen Abständen ausgelöst (Timer) oder reagierst du 
damit nur auf externe Ereignisse?

Autor: Furo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich reagiere primär auf externe Ereignisse, auf die der Atmega reagiert 
und entsprechend "aggiert". Im Moment habe ich noch keine Zeile Code 
geschrieben, sondern mach mir grad so ein paar "grundlegende" Gedanken.

Einige Interrupt-Ereignisse, erfordern eine Kommunikation mit einem 
weiterem Basutein, gefolgt von einigen Algorithmen.

Mein Gedanke ist, dass ich soviele Algorithmen im µC selbst durchführe, 
bevor ich sie weiter schicke. Aus diesem Grund wollte ich soviel 
Ressourcen freihalten, wie es geht. Im extrem Fall, kann ich auch die 
Berechungen auf ein Minimum reduzieren und alle Komplexen "extern" 
Berechnen lassen.

Autor: AVRFan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Vergiss bitte umlöten. Das Layout steht.

Wenn das so ist und Du auch keinen Timerinterrupt verwenden willst, 
bleibt als Lösungsmöglichkeit übrig, die BlinkLED-Funktionalität in den 
bestehenden Code "einzuflechten" (d. h. ohne einen Interrupt zu 
bemühen).  Irgendein zeitliches Verhalten wird Deine Software aufweisen; 
davon gälte es dann, die Blinkfrequenz durch einen Zähler abzuleiten. 
Ob das in Deinem Fall geht, kann Dir allerdings niemand sagen, der den 
Code nicht kennt.  Das darfst Du Dir also selbst überlegen.

Autor: Werner A. (homebrew)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Systemtimer ist nur ein Timer des System...

Benutzt du in deiner bisherigen Software Timer0  Timer1  Timer2 (wenns 
den bei dem Prozessor gibt)?
Wenn ja wofür?
"normalerweise" wird ein Timer benutzt, der in einem festen 
Zeitintervall aufgerufen wird. Wenn man da noch eine globale Variable 
incrementiert ist die Systemzeit schon fertig. Damit kann man dann an 
verschiedensten Stellen Sachen zu festen Zeitpunkten machen. Z.b. Tasten 
alle 10 ms abfragen, Display alle 100 ms aktualisieren oder halt eben 
auch deine LED blinken lassen.

Stell doch einfach mal dein Programm online. Dann wirds glaub ich 
einfacher.
(zur Not beschreib mal was das Programm eigentlich macht)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Furo wrote:
> Aus diesem Grund wollte ich soviel
> Ressourcen freihalten, wie es geht.

Das ist grundsätzlich falsch.

Nur die Prozesse, die auch merkbare Auslastung bewirken, muß man im Auge 
behalten.

Eine Task mit CPU-Auslastung <0,1% muß man nicht wegrationalisieren, die 
kehrt man unter den Teppich und gut is.

Eine LED blinken alle 2.000.000 CPU Zyklen ist so eine nicht merkbare 
Task.


Peter

Autor: AVRFan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Also eigentlich will ich folgendes machen."

Bin gespannt, wie lange es noch bis dahin dauert... lach

Autor: Freizeitbastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. "Vergiss bitte umlöten. Das Layout steht."

2. "Im Moment habe ich noch keine Zeile Code
geschrieben, sondern mach mir grad so ein paar "grundlegende" Gedanken."

Das scheint mir ein gewagtes Vorgehen ...

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.