Forum: Mikrocontroller und Digitale Elektronik einzelne interrupts ein- bzw ausschalten


von andi (Gast)


Lesenswert?

hallo bin grad wieder mal beim programmieren auf ein kleines problemchen 
gestoßen. und zwar hab ich das problem, dass ich mit meinem atmega16 
zwei timer mit interrupts benutze. jetzt stehe ich vor dem problem, dass 
mir bisher nur die möglichkeit die interrupts global ein- bzw. 
auszuschalten mit sei() bzw. cli().

in meinem fall ist es aber wichtig, dass ich die interrupts einzeln ein- 
und ausschalten muss, weil sonst mein piezosummer ständig piepst.

hier mein kurzer programmausschnitt:
1
ISR(TIMER2_OVF_vect)
2
{
3
  PORTB |= (1<<PB4);
4
}
5
               //PWM für LEDs
6
ISR(TIMER2_COMP_vect)
7
{
8
  PORTB &=~ (1<<PB4);
9
}
10
 
11
12
ISR(TIMER0_COMP_vect)
13
{
14
PORTD ^= (1<< PD6);      //PD6 togglen für Piezosummer
15
}
16
17
int main(void)
18
{
19
  DDRB = 0xFF;   //Gesamtes Portregister als Ausgang
20
  DDRD = 0b11110000; // PD0 bis PD3 als Eingang
21
 
22
  PORTB = 0b00000000;    //Alle Pins von PortB auf 0
23
  PORTB |= (1<<PB3);    //SCL auf high => Reset von Schieberegister aus
24
  DDRD |= (1<<PD6);    //Ausgang für Piezosummer
25
  PORTD &=~ (1<<PD6);    //  nötig, da Piezo schwingt, wenn er dauerhaft an Vcc liegt
26
27
28
  
29
  /* Timer2 Initialisierung */
30
  
31
  TCCR2 |= (1<<CS22) | (1<<CS21);                //Prescaler auf 256
32
  TIMSK |= (1<<TOIE2) | (1<<OCIE2);    // Interrupt bei Overflow und  Compare Match
33
 
34
  /* Timer0 Initialisierung */
35
36
  TIMSK |= (1<< OCIE0);  //Interrupt bei Compare Match (hier Zählerstand auf 0 zurücksetzen, da CTC- Modus)
37
  TCCR0 = (1<<WGM01);    // CTC- Modus
38
  TCCR0 |= (1<<CS00) | (1<<CS01); //Prescaler auf 64
39
  
40
  sei();                //globale Interrupts ein
41
 
42
 
43
  LED_Fading();
44
  long_delay(1000);
45
46
  lauflicht();
47
  long_delay(1000);
48
49
  lichtschweif();
50
  long_delay(1000);
51
  schlussakkord_schnell();
52
53
  while(1)
54
  {  
55
    
56
  }
57
58
  return 0;
59
}

mein problem ist jetzt, dass der interrupt von timer0 nur ausgeführt 
werden darf, wenn der piezo töne von sich geben soll.

wer kann mir weiterhelfen?

mfg andi

von Michael R. (mexman) Benutzerseite


Lesenswert?

Hallo Andi,

schau bitte mal auf Deinen Bildschirm.
Genau oberhalb des Fensters, in dem Du Deine Postings schreibst.

Was steht da?


Ich Kopier´s hier nochmal hin:

###################################
Groß- und Kleinschreibung verwenden
###################################

Scheinbar kannst Du das, denn in Deinem Code finde ich prima 
Grossbuchstaben.
Aber herzlichen Dank dafuer, dass Du - im Unterschied zu vielen Anderen 
- wenigstens weisst, wann man "dass" mit zwei "s" schreibt und auch 
Satzzeichen kennst Du.
Dann duerfte die "Shift"-Taste doch auch noch zu bedienen sein, oder?


Gruss

Michael






> hallo bin grad wieder mal beim programmieren auf ein kleines problemchen
> gestoßen. und zwar hab ich das problem, dass ich mit meinem atmega16
> zwei timer mit interrupts benutze. jetzt stehe ich vor dem problem, dass
> mir bisher nur die möglichkeit die interrupts global ein- bzw.
> auszuschalten mit sei() bzw. cli().
>
> in meinem fall ist es aber wichtig, dass ich die interrupts einzeln ein-
> und ausschalten muss, weil sonst mein piezosummer ständig piepst.
>
> hier mein kurzer programmausschnitt:
>
> mein problem ist jetzt, dass der interrupt von timer0 nur ausgeführt
> werden darf, wenn der piezo töne von sich geben soll.
>
> wer kann mir weiterhelfen?
>
> mfg andi

von Michael D. (michael_2001)


Lesenswert?

Nun,

Du hast hier:
1
TIMSK |= (1<<TOIE2) | (1<<OCIE2);    // Interrupt bei Overflow und  Compare Match
2
TIMSK |= (1<< OCIE0);  //Interrupt bei Compare Match (hier Zählerstand auf 0 zurücksetzen, da CTC- Modus)
die Interrupts eingeschaltet.

Z.B. durch setzen des entsprechenden Bits auf Null kannst Du sie auch 
wieder ausschalten. Achte darauf, das Du die anderen Bits nicht 
unbeabsichtigt änderst.

Siehe dazu auch den Artikel: 
http://www.mikrocontroller.net/articles/Bitmanipulation

von spess53 (Gast)


Lesenswert?

Hi

>hier mein kurzer programmausschnitt:

Sieht nicht so aus.

> TIMSK |= (1<<TOIE2) | (1<<OCIE2);    // Interrupt bei Overflow und  Compare 
Match

Wenn man die Interrupts durch Setzen der Bits einschaltet, kann man sie 
durch Löschen auch wieder ausschalten.

Man sollte wenigstens verstehen, was man kopiert.

MfG Spess

von andi (Gast)


Lesenswert?

ganz ehrlich. ich halte es in so einem forum nicht für nötig die 
shiftaste zu benutzen. manchmal kommt es mir hier so vor, als könnte 
eine korrekte Groß- und Kleinschreibung leute glücklich machen.

aber das war jetzt ja auch nicht der grund für meinen post. ich habe ja 
ein ganz anderes problem.

mfg

von Grossschreiber (Gast)


Lesenswert?

andi schrieb:
> ganz ehrlich. ich halte es in so einem forum nicht für nötig die
> shiftaste zu benutzen.
>
dann hast du ja Glück, dass du jemanden in diesem Forum gefunden hast, 
der es für notig hielt dir zu antworten...

Ich finde diese Ignoranz dt. Rechtschreibung zeugt von einer gehörigen 
Portion Ignoranz und Aroganz!

von andi (Gast)


Lesenswert?

spess53 schrieb:
> Hi
>
>>hier mein kurzer programmausschnitt:
>
> Sieht nicht so aus.
>
>> TIMSK |= (1<<TOIE2) | (1<<OCIE2);    // Interrupt bei Overflow und  Compare
> Match
>
> Wenn man die Interrupts durch Setzen der Bits einschaltet, kann man sie
> durch Löschen auch wieder ausschalten.
>
> Man sollte wenigstens verstehen, was man kopiert.
>
> MfG Spess

danke spess. es ist nicht so, dass ich nicht verstehe was ich 
programmiere. aber hatte wohl grad einfach ein brett vor dem kopf. hab 
viel zu kompliziert gedacht.

mfg

von andi (Gast)


Lesenswert?

Grossschreiber schrieb:
> andi schrieb:
>> ganz ehrlich. ich halte es in so einem forum nicht für nötig die
>> shiftaste zu benutzen.
>>
> dann hast du ja Glück, dass du jemanden in diesem Forum gefunden hast,
> der es für notig hielt dir zu antworten...
>
> Ich finde diese Ignoranz dt. Rechtschreibung zeugt von einer gehörigen
> Portion Ignoranz und Aroganz!

tut mir leid. ich weiß echt nicht was das problem einiger hier ist. was 
bringt es denn bitte außer mehr zeitaufwand wenn man hier auf penible 
Groß/Kleinschreibung achtet.
dieses forum beschäftigt sich mit mikrocontrollern und allem was dazu 
gehört. dazu ist es eine hervorragende möglichkeit bei fragen und 
antworten zu diesem thema mit anderen auszutauschen bzw. anderen zu 
helfen.

vielleicht sollte sich der ein oder andere hier im forum mal darüber 
gedanken machen, ob er nicht in einem "deutschgrammatikforum" besser 
aufgehoben wäre.

mfg andi

von Grossschreiber (Gast)


Lesenswert?

andi schrieb:
> tut mir leid. ich weiß echt nicht was das problem einiger hier ist. was
> bringt es denn bitte außer mehr zeitaufwand wenn man hier auf penible
> Groß/Kleinschreibung achtet.
>
...wenn deine Programme auch so oberfläch hingeschludert sind, na dann 
gute Nacht.

von Hc Z. (mizch)


Lesenswert?

andi schrieb:
> was
> bringt es denn bitte außer mehr zeitaufwand wenn man hier auf penible
> Groß/Kleinschreibung achtet.

Es erleichtert das Lesen.  Ohne groß/klein drückst Du aus, dass Dir der 
Leser egal ist.  Soll er sich ruhig ein bisschen mehr Mühe geben als 
mit.

Statt dass sich der ganze Rest bemüht, könnte sich der Eine, der 
schreibt, vielleicht Mühe geben?  Wäre das nicht besser?

Der Sinn ist mit Groß/Kleinschreibung einfach schneller zu erfassen (und 
manchmal nur mit ihr:  er hat in moskau liebe genossen).

von spess53 (Gast)


Lesenswert?

Hi

>vielleicht sollte sich der ein oder andere hier im forum mal darüber
>gedanken machen, ob er nicht in einem "deutschgrammatikforum" besser
>aufgehoben wäre.

Warum fragst du dann nicht in einem englischsprachigen Forum?

Für mich ist ist eine (möglichst) korrekte Schreibweise, incl. 
Groß-/Kleinschreibung ein Ausdruck der Bildung. Und die schaltet man 
auch nicht einfach an und ab. Also wenn du deine, hoffentlich vorhanden, 
Bildung weiter verheimlichen willst, dann bleib bei deiner Schreibweise.

MfG Spess

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.