Forum: Mikrocontroller und Digitale Elektronik Arduino2560 ext. Interrupt


von Wolfgang M. (procrash)


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)

von H.Joachim S. (crazyhorse)


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

      }
}

von Wolfgang M. (procrash)


Lesenswert?

Hehe wo haste denn das her? Ist das ein Autocodegenerierer von AVR 
Studio?

von Stefan E. (sternst)


Lesenswert?

Wolfgang Meyerle schrieb:
> - ECIRB enthält bit 01 für Interrupt 4
> - EIMSK hat Int4 auch aktiviert

Keines dieser Register hat irgendwas mit dem Pin PB4 zu schaffen. INT4 
ist an PE4. INT4 und PCINT4 sind zwei verschiedene Dinge.


PS: Und Frustration ist keine Entschuldigung für Doppelposts oder nichts 
sagende Titel.

von H.Joachim S. (crazyhorse)


Lesenswert?

Nö, CodeVision.
Ist aber im Prinzip unbrauchbar, da unlesbare Hex-Konstanten eingesetzt 
werden. Funktioniert dennoch (zumindest habe ich noch keine Fehler 
feststellen können). Man muss sich halt die Arbeit machen, das lesbar 
umzusetzen.

von Wolfgang M. (procrash)


Lesenswert?

Oh mann, danke
Das war das Brett vorm Kopf was mir gefehlt hat. Hätte ich mal besser 
ins DB geschaut.

Ich muss allerdings noch nachhaken. Wofür ist PCINT4 denn dann da?
Steht das nicht für Pin Change Interrupt?

von PIC (Gast)


Lesenswert?

Wolfgang Meyerle schrieb:
> Das war das Brett vorm Kopf was mir gefehlt hat. Hätte ich mal besser
> ins DB geschaut.

Was zum Henker? Hast du in der Bibel nachgeschaut oer wo??

von Stefan E. (sternst)


Lesenswert?

Wolfgang Meyerle schrieb:
> Ich muss allerdings noch nachhaken. Wofür ist PCINT4 denn dann da?
> Steht das nicht für Pin Change Interrupt?

Steht es.

von PIC (Gast)


Lesenswert?

Wolfgang Meyerle schrieb:
> Ich muss allerdings noch nachhaken. Wofür ist PCINT4 denn dann da?
> Steht das nicht für Pin Change Interrupt?

Wie du schon sagtest, du solltest mal ins DB gucken.

von Wolfgang M. (procrash)


Lesenswert?

Ne nicht wirklich. Habs flüchtig vom Arduino2560 Schaltplan...

von H.Joachim S. (crazyhorse)


Lesenswert?

Hm - und was willste nun? INT4 oder PCINT4 an PB4?

von Wolfgang M. (procrash)


Lesenswert?

Der Taster ist an Pin10 angeschlossen vom Arduino Board. Das sollte 
(sofern ich mich nicht wieder verlesen habe) PCINT4 sein oder? (siehe 
http://arduino.cc/en/uploads/Main/arduino-mega2560_R3-schematic.pdf)

Der ist in PCMSK0 auch ausmaskiert....

von H.Joachim S. (crazyhorse)


Lesenswert?

Taster per Int geht immer schief...
Polle den Eingang während eines ausreichend schnellen Timerinterrupts 
und entprelle per Software. Alles andere ist nicht zielführend.
Gibt hier Beispiele genug.

von Wolfgang M. (procrash)


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

von H.Joachim S. (crazyhorse)


Lesenswert?

Salami-Taktik?
Ich bin raus aus dem Spiel....

von Wolfgang M. (procrash)


Lesenswert?

Nein ist ok, lass gut sein. Ich muss das selber lösen krieg das schon 
hin. Vielleicht finde ich ja noch Codebeispiele

von PIC (Gast)


Lesenswert?

Wie ist der Taster angeschlossen?

von Wolfgang M. (procrash)


Lesenswert?

Der Taster hängt an PB4 mit externem Pull up Widerstand. Oszi zeigt mir 
an dass sobald ich ihn schliesse er auf GND gezogen wird. Das passt 
also. Pollen geht auch.

von Oliver J. (skriptkiddy)


Lesenswert?

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

von Wolfgang M. (procrash)


Lesenswert?

We ist dass denn eigentlich mit den externen Interrupts. Ich hab die Pin 
Change Interrupt Anschlüsse und ich hab die Int 0-Int 7?

von Wolfgang M. (procrash)


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

von Oliver J. (skriptkiddy)


Lesenswert?

Wolfgang Meyerle schrieb:
> Hatte ich ja vor.

Ich meine den Mikrocontroller aus dem Sleep-Modus aufwecken.

Gruß Oliver

von Wolfgang M. (procrash)


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?

von Wolfgang M. (procrash)


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

von Oliver J. (skriptkiddy)


Lesenswert?

Wolfgang Meyerle schrieb:
> Vergesst den Post. Seh es gerade. Anscheinen sind mehrere Pins
> zusammengefasst die einen Pin Change Interrupt auslösen...

Wie wäre es damit, wenn du erst einmal in Ruhe die entsprechenden 
Stellen im Datenblatt liest.

Gruß Oliver

von Wolfgang M. (procrash)


Lesenswert?

Guter Vorschlag. Ist aber auch ein wenig bescheiden beschrieben im DB 
für jemanden der sich das zum ersten mal anschaut.

von Oliver J. (skriptkiddy)


Lesenswert?

Wolfgang Meyerle schrieb:
> Guter Vorschlag. Ist aber auch ein wenig bescheiden beschrieben im DB
> für jemanden der sich das zum ersten mal anschaut.
Da muss wohl jeder durch, der sich ernsthaft mit Mikrocontrollern 
beschäftigen will.

Gruß Oliver

von Wolfgang M. (procrash)


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.

von Oliver J. (skriptkiddy)


Lesenswert?

Wolfgang Meyerle schrieb:
> 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.

Dafür gibt es Appnotes: AVR1200.

Gruß Oliver

von Wolfgang M. (procrash)


Lesenswert?

Die kenne ich noch nicht.

Danke für den Tipp.

von Oliver J. (skriptkiddy)


Lesenswert?

Diese Appnotes gibts für so ziemlich alles.

Gruß Oliver

von Wolfgang M. (procrash)


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

von Oliver J. (skriptkiddy)


Lesenswert?

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

Mein Tipp dazu. Einmal von Hand machen, eventuell sogar per Bit-Banging, 
danach eine verifizierte Lib nehmen (ala Fleury).

Gruß Oliver

von Wolfgang M. (procrash)


Lesenswert?

So werd ich das machen. Hab mir vor kurzer Zeit den Buspirate geholt. 
Der kann I2C. Insofern kann ich schon mal sehen ob logisch alles klappt 
mit dem Sensorauslesen.
Hat jemand von euch mal den Logic Analysator davon getestet. Bis 1 MHZ 
soll der ja ganz brauchbar sein...

von Oliver J. (skriptkiddy)


Lesenswert?

Wolfgang Meyerle schrieb:
> Hat jemand von euch mal den Logic Analysator davon getestet. Bis 1 MHZ

Den nicht, aber ich hab mir den Open-Bench-Logic-Sniffer geholt. Und zum 
Basteln ist der durchaus geeignet.

Gruß Oliver

von Wolfgang M. (procrash)


Lesenswert?

Nicht schlecht, 32 Kanäle mit 50Mhz, da geht was.
Für I2C müsste mir aber der BusPirate auch reichen oder? 400kBit ist 
doch da das Maximum, und langsamer geht immer wenn man nur damit 
rumspielen möchte...

von Oliver J. (skriptkiddy)


Lesenswert?

Wolfgang Meyerle schrieb:
> 400kBit ist
> doch da das Maximum
Nicht ganz richtig. "Mit Version 2.0 aus dem Jahr 1998 kam ein 
„Hochgeschwindigkeitsmodus“ mit max. 3,4 Mbit/s dazu" [1]

[1] http://de.wikipedia.org/wiki/I%C2%B2C#Geschichte

Gruß Oliver

von Wolfgang M. (procrash)


Lesenswert?

Ok. Touché, aber ich sag mal für den Einstieg reicht mir das erstmal.
Ziel ist es den Wii Motion Plus Sensor auszulesen, und da sollten mir 
die 400kbit erstmal reichen.

von Wolfgang M. (procrash)


Lesenswert?

Yipee. Es geht. Und da sagt mir mal einer Erfolgserlebnisse stellen sich 
um diese Uhrzeit nicht mehr ein.

So, jetzt kann ich beruhigt schlafen gehen...

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.