-
So da bin ich...
Ich bin gerade daran Interrupts zu erlernen und komme auch nach durchlesen des Datenblattes nicht weiter.
Könnt ihr mir eine ganz einfache Lösung zeigen wie ich einen Interrupt verwende (einfach nur lich an lich aus oder ähnliches).
Ich benutzte AT90s8535 und benutzte den Compiler "CodeVisionAVR"
-
Tut mir leid, zum Codevision kann ich im Detail nix sagen.
Im Prinzip läuft das Ganze aber immer gleich
du definierst beim WinAvr z.B,
Code:
volatile char bByte = 0;
SIGNAL(SIG_xxxxxxx)
{
bByte |= 1;
}
main()
{
// definieren speziellen Interrupt & enablen
sei(); / Alle Interrupts enablen
while (1)
{
if ( bByte & 1) // warten auf interrupt
{
bByte &= ~1; // zurücksetzen
// mach irgendwas
}
}
}
Das ist nur ein Strickmuster, aber so läuft's im Prinzip
-
Code:
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <avr/io.h>
volatile char bByte = 0;
SIGNAL(SIG_INTERRUPT0)
{
bByte |= 1;
}
main()
{
DDRA = 0xFF;
DDRD = 0x00;
PORTA=0xF0;
PORTD=0xFF;
// definieren speziellen Interrupt & enablen
sei(); // Alle Interrupts enablen
while (1)
{
if ( bByte & 1) // warten auf interrupt
{
bByte &= ~1; // zurücksetzen
PORTA=~PORTD;
}
}
}
bringt bei mir garnichts habe ich irgendwas vergessen oder falsch gemacht?
-
Da fehlt noch das Enablen vom Interrupt0. Da mußt du nachschauen
ich glaub MCUCSR /GIFR ist zuständig
-
habe leider nichts passendes gefunden. Villeicht hat das ja schon jemand benutzt?
-
im Register GICR musst du den externen Interrupt0 aktivieren, also in deinem Fall INT0 auf 1 setzen
dann musst du noch im Register MCUCR festlegen, wann der Interrupt ausgelöst werden soll, mit ISC01=0 und ISC00=1 wird der Interrupt bei jedem Wechsel(0V->5V, 5V->0V) der Spannung am Pin für den externen Interrupt ausgelöst
-
Code:
GICR=GICR | 1 << INT0;
MCUCR=MCUCR & ~(1<<ISC01);
ich habe vermutet das du das so meinst ist aber falsch
kannst du das auch in code ausdrücken mit registern habe ich bei avr keine erfahrung
Code:
MCUCR = 2; // INT0 interrupt on falling edge
edge = 0; // 0 = falling edge 1 = rising edge
stand von vorn herein drinne ist das richtig?
-
hier mein funktionsfähiger code :-({|=
Code:
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <avr/io.h>
volatile char bByte = 0;
SIGNAL(SIG_INTERRUPT0)
{
bByte |= 1;
}
main()
{
DDRA = 0xFF;
DDRD = 0x00;
PORTA=0xF0;
PORTD=0xFF;
sei(); // Alle Interrupts enablen
// definieren speziellen Interrupt & enablen
MCUCR = 2; //
GICR=0x40;
while (1)
{
if ( bByte & 1) // warten auf interrupt
{
bByte &= ~1; // zurücksetzen
PORTA=~PORTA;
}
}
}
-
Hallo Dark emporer,
ich hab mahl das AT90s8535.pdf durchgeguckt
um die einzelne INT0 interrupt ein zu schalten braucht mann
GIMSK |= 0x40;
(General Interrupt MaSK register) Seite 25 der .pdf
gruss
Henk