Forum: Mikrocontroller und Digitale Elektronik Interrupt avr


von Tom M. (tomfighter)


Lesenswert?

Hallo liebe µC.NET -Gemeinde

ich habe eine Frage bezüglich des AVR atmega16.

ich möchte verhindern, dass an PD2 bzw. PD3
ein Interrupt ausgelöst wird.

Generell habe ich ja die Möglichkeit über das
SREG - Register Interrupts durch den
Befehl
SREG = (1<<7); zu aktivieren
bzw. durch SREG = (0 << 7); generell zu verbieten.

Mit Hilfe des GICR-Registers können ja dann
die Interrupts einzeln (de)aktiviert werden:

GICR = 1<<INT0;
bzw.
GICR = 0<<INT0; (PD2-Interrupt)


Wenn ich PD2 als Ausgang definiere mit
PORTD = 1<<PD2;
kann PD2 auch nicht mehr als Interrupt "stören".

Gibt es noch eine Möglichkeit trotz aktivierter
Interrupts (global/SREG) und GICR mit der
Flankensteuerung (GIFR) diese Interrupts zu verhindern?
vielleicht unter Ausnutzung der Pull-Up-Schaltung an den
Pins?

Grüße

Tom Mizek

von Mike (Gast)


Lesenswert?

Tom Mizek schrieb:
> GICR = 0<<INT0;

Was soll da der Unterschied zu
1
GICR = 0;
sein?

Guck dir im C-Grundlagenbuch noch mal die Bit-Operationen an.

von Peter II (Gast)


Lesenswert?

Ich versteht das Problem nicht.

> ich möchte verhindern, dass an PD2 bzw. PD3
> ein Interrupt ausgelöst wird.
dann Aktiver sie in GICR nicht und gut ist.

von Tom M. (tomfighter)


Lesenswert?

Mike schrieb:
> Tom Mizek schrieb:
>> GICR = 0<<INT0;
>
> Was soll da der Unterschied zu
>
1
GICR = 0;
> sein?
>
> Guck dir im C-Grundlagenbuch noch mal die Bit-Operationen an.


Okay, löschen wir das Int0-Bit
durch

GICR &=~ (1<<INT0);

oder setzen es durch

GICR |= (1<<INT0)

gleiches gilt für INT1, (==>PD3)

wenn ich GICR = 0 setze wird das ganze Register 0 gesetzt und
nicht nur das Bit 0 oder?

von F. F. (foldi)


Lesenswert?

Auf Anhieb fällt mir nur ein sie dann zu sperren, wenn sie stören (ADC 
Messung) und wieder erlauben, wenn die Messung vorbei ist.
Den ATmega 16 kenne ich aber nicht.

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Tom Mizek schrieb:
> Generell habe ich ja die Möglichkeit über das
> SREG - Register Interrupts durch den
> Befehl
> SREG = (1<<7); zu aktivieren
> bzw. durch SREG = (0 << 7); generell zu verbieten.

Nö, so aber nicht. Du wolltest sicher schreiben
1
 SREG |= (1<<7) ; // Global IRQ freigeben
2
 SREG &= ~(1<<7); // und sperren
Schreibe nicht einfach das komplette SREG, das bringt Unglück, denn da 
sind noch andere Sächelchen drin.
Besser ist es sowieso, die Kompilerfunktionen zu nehmen:
1
sei(); // freigeben
2
cli(); // sperren
Zum Sperren normaler Ext. Ints hat Peter II alles gesagt.

von Tom M. (tomfighter)


Lesenswert?

danke euch allen,

ja stimmt hatte mich vertippt!!

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.