Forum: Mikrocontroller und Digitale Elektronik Tasks bei Atmel ATmega128


von Furo (Gast)


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

von holger (Gast)


Lesenswert?

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

Sonst gehts nur mit Interrupt.

von Furo (Gast)


Lesenswert?

Das bringt leider nichts. Der Takt muss variabel sein....

von Gast (Gast)


Lesenswert?

Vielleicht mit einem PWM Port.

von AVRFan (Gast)


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

von Peter D. (peda)


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

von Furo (Gast)


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.

von Sebastian Heyn (Gast)


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.

von Furo (Gast)


Lesenswert?

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

Trotzdem Danke! ;)

von Hannes L. (hannes)


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.

...

von AVRFan (Gast)


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?

von Werner A. (homebrew)


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
1
if ((systemtimer % 200) == 0){
2
  PORTB ^= ( 1 << PB0 );
3
}

von Furo (Gast)


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?

von Tunichgut (Gast)


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!

von AVRFan (Gast)


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 :-)

von Werner A. (homebrew)


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.

von Furo (Gast)


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.

von Timmo H. (masterfx)


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.

von michel (Gast)


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

von Manfred B. (vorbeigeschlendert)


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?

von Furo (Gast)


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.

von AVRFan (Gast)


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.

von Werner A. (homebrew)


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)

von Peter D. (peda)


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

von AVRFan (Gast)


Lesenswert?

"Also eigentlich will ich folgendes machen."

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

von Freizeitbastler (Gast)


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

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.