Arduino2560 ext. Interrupt

#2748782
Lesenswert?

Hallo,

ich weiss es ist zwar ein Doppelposting aber mein Arduino2560 Board 
treibt mich noch zur Verzweiflung. Ich versuche schon seit gestern einen 
externen Interrupt für PinB4 zu konfigurieren und irgendwie will das 
ganze noch nicht.

Kann sich jemand mal die Mühe machen (der sich damit auskennt) was man 
dafür laut Datenblatt setzen muss?

- Globale Interrupts sind per sei aktiviert
- ECIRB enthält bit 01 für Interrupt 4
- EIMSK hat Int4 auch aktiviert
- PCMSK0 ist auch gesetzt

fehlt da vielleicht noch was?


Kann AVR Studio ein setzen eines Pins simulieren, sodass in diesem Fall 
in der Software ein Interrupt ausgelöst wird sobald ich PINB4 manuell 
setze?

(Mod: nichtssagendes Topic editiert)
#2748794
Lesenswert?

der böse wizard, mach es selbst lesbar:
#include <mega2560.h>

// Pin change 0-7 interrupt service routine
interrupt [PC_INT0] void pin_change_isr0(void)
{
// Place your code here

}

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef OPTIMIZE_SIZE
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In 
Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T 
State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In 
Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T 
State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In 
Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T 
State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In 
Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T 
State0=T
PORTD=0x00;
DDRD=0x00;

// Port E initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In 
Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T 
State0=T
PORTE=0x00;
DDRE=0x00;

// Port F initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In 
Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T 
State0=T
PORTF=0x00;
DDRF=0x00;

// Port G initialization
// Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State5=T State4=T State3=T State2=T State1=T State0=T
PORTG=0x00;
DDRG=0x00;

// Port H initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In 
Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T 
State0=T
PORTH=0x00;
DDRH=0x00;

// Port J initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In 
Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T 
State0=T
PORTJ=0x00;
DDRJ=0x00;

// Port K initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In 
Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T 
State0=T
PORTK=0x00;
DDRK=0x00;

// Port L initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In 
Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T 
State0=T
PORTL=0x00;
DDRL=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// OC1C output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2A output: Disconnected
// OC2B output: Disconnected
ASSR=0x00;
TCCR2A=0x00;
TCCR2B=0x00;
TCNT2=0x00;
OCR2A=0x00;
OCR2B=0x00;

// Timer/Counter 3 initialization
// Clock source: System Clock
// Clock value: Timer3 Stopped
// Mode: Normal top=0xFFFF
// OC3A output: Discon.
// OC3B output: Discon.
// OC3C output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer3 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR3A=0x00;
TCCR3B=0x00;
TCNT3H=0x00;
TCNT3L=0x00;
ICR3H=0x00;
ICR3L=0x00;
OCR3AH=0x00;
OCR3AL=0x00;
OCR3BH=0x00;
OCR3BL=0x00;
OCR3CH=0x00;
OCR3CL=0x00;

// Timer/Counter 4 initialization
// Clock source: System Clock
// Clock value: Timer4 Stopped
// Mode: Normal top=0xFFFF
// OC4A output: Discon.
// OC4B output: Discon.
// OC4C output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer4 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR4A=0x00;
TCCR4B=0x00;
TCNT4H=0x00;
TCNT4L=0x00;
ICR4H=0x00;
ICR4L=0x00;
OCR4AH=0x00;
OCR4AL=0x00;
OCR4BH=0x00;
OCR4BL=0x00;
OCR4CH=0x00;
OCR4CL=0x00;

// Timer/Counter 5 initialization
// Clock source: System Clock
// Clock value: Timer5 Stopped
// Mode: Normal top=0xFFFF
// OC5A output: Discon.
// OC5B output: Discon.
// OC5C output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer5 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR5A=0x00;
TCCR5B=0x00;
TCNT5H=0x00;
TCNT5L=0x00;
ICR5H=0x00;
ICR5L=0x00;
OCR5AH=0x00;
OCR5AL=0x00;
OCR5BH=0x00;
OCR5BL=0x00;
OCR5CH=0x00;
OCR5CL=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
// INT3: Off
// INT4: Off
// INT5: Off
// INT6: Off
// INT7: Off
EICRA=0x00;
EICRB=0x00;
EIMSK=0x00;
// PCINT0 interrupt: Off
// PCINT1 interrupt: Off
// PCINT2 interrupt: Off
// PCINT3 interrupt: Off
// PCINT4 interrupt: On
// PCINT5 interrupt: Off
// PCINT6 interrupt: Off
// PCINT7 interrupt: Off
// PCINT8 interrupt: Off
// PCINT9 interrupt: Off
// PCINT10 interrupt: Off
// PCINT11 interrupt: Off
// PCINT12 interrupt: Off
// PCINT13 interrupt: Off
// PCINT14 interrupt: Off
// PCINT15 interrupt: Off
// PCINT16 interrupt: Off
// PCINT17 interrupt: Off
// PCINT18 interrupt: Off
// PCINT19 interrupt: Off
// PCINT20 interrupt: Off
// PCINT21 interrupt: Off
// PCINT22 interrupt: Off
// PCINT23 interrupt: Off
PCMSK0=0x10;
PCMSK1=0x00;
PCMSK2=0x00;
PCICR=0x01;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x00;

// Timer/Counter 1 Interrupt(s) initialization
TIMSK1=0x00;

// Timer/Counter 2 Interrupt(s) initialization
TIMSK2=0x00;

// Timer/Counter 3 Interrupt(s) initialization
TIMSK3=0x00;

// Timer/Counter 4 Interrupt(s) initialization
TIMSK4=0x00;

// Timer/Counter 5 Interrupt(s) initialization
TIMSK5=0x00;

// USART0 initialization
// USART0 disabled
UCSR0B=0x00;

// USART1 initialization
// USART1 disabled
UCSR1B=0x00;

// USART2 initialization
// USART2 disabled
UCSR2B=0x00;

// USART3 initialization
// USART3 disabled
UCSR3B=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
ADCSRB=0x00;
DIDR1=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// Global enable interrupts
#asm("sei")

while (1)
      {
      // Place your code here

      }
}
#2748822
Lesenswert?

Ist ja im Endeffekt kein Taster den ich dran anschliessen möchte, 
sondern vielmehr ein TTL Baustein, aber ich hab mir gedacht backste mal 
zuerst kleine Brötchen um zu sehen ob der Interrupt überhaupt auslöst. 
Geht aber leider immer noch nicht, muss wohl nochmal im DB wühlen um zu 
verstehen warum...
#2748842
Lesenswert?

Oliver J. schrieb:
> H.joachim Seifert schrieb:
>> Taster per Int geht immer schief...
>
> Entsprechend entprellt geht da gar nichts schief, aber es macht IMHO nur
> zum Aufwecken Sinn.
>
> Gruß Oliver

Hatte ich ja vor. Wollte die LED nur anschalten um zu sehen ob der
Interrupt auslöst, und dann an lassen. Insofern kann ich mir eine
Entprellung sparen und all den ganzen Mist. Ich wills doch nur testen...
#2748848
Lesenswert?

Ein Blick ins DB lässt mich aber stutzig werden. Schau ich ins PCICR 
Register sehe ich dass ich nur PCIE0 1 und 2 aktivieren kann. Ich hab 
aber am uC mehr als PCINT0, 1 und 2.
Die Interrupt Tabelle enthält auch nur die ersten 3 Interrupts. Kann mir 
mal einer erklären wieso ich dann mehr an den Pins habe?
#2748851
Lesenswert?

Wolfgang Meyerle schrieb:
> Ein Blick ins DB lässt mich aber stutzig werden. Schau ich ins PCICR
> Register sehe ich dass ich nur PCIE0 1 und 2 aktivieren kann. Ich hab
> aber am uC mehr als PCINT0, 1 und 2.
> Die Interrupt Tabelle enthält auch nur die ersten 3 Interrupts. Kann mir
> mal einer erklären wieso ich dann mehr an den Pins habe?

Vergesst den Post. Seh es gerade. Anscheinen sind mehrere Pins 
zusammengefasst die einen Pin Change Interrupt auslösen...
#2748870
Lesenswert?

Da hab ich ja wohl Glück das ich dass nur Hobbymässig machen will.
Trotzdessen finde ich die DB recht knapp und knackig erklärt. Wieso zur 
Hölle schreiben die z.B. nicht einen Part für Pin Change Interrupts, und 
einen für den Rest sondern vermischen dass ganze obwohl das eine mit 
anderen nichts zu tun hat.
Für nen alten Hasen ist das mit Sicherheit kein Problem, mich als 
Grünspecht kostet der Mist allerdings ne Weile bis ich da durchsteige.

Im Forum hier selbst in der Wiki steht ja leider auch (noch) nichts 
ausführlicheres dazu. Hab mir durchaus das erstmal einen Überblick in 
den Tutorials über Interrupts verschafft.
#2748880
Lesenswert?

Werd mal stöbern.

Habs mal eben im Simulator reingehackt so wie ich mir das denke. Kaum 
macht mans richtig, funktioniert es. Jetzt muss ich nur noch checken 
warum der gleiche Code in Eclipse auf dem Board nicht tut, aber dass 
sollte jetzt ein Kinderspiel sein.

Werd mir die Appnotes mal genauer ansehen. Vielleicht findet man da noch 
die eine oder andere nützliche Beschreibung.

Als nächstes steht I2C an was ich mir ansehen muss. Dass wird sicher 
noch ein Spass... ;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren