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)
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 } }
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.
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.
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?
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??
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.
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.
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....
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.
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...
Nein ist ok, lass gut sein. Ich muss das selber lösen krieg das schon hin. Vielleicht finde ich ja noch Codebeispiele
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.
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
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?
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...
Wolfgang Meyerle schrieb: > Hatte ich ja vor. Ich meine den Mikrocontroller aus dem Sleep-Modus aufwecken. Gruß Oliver
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?
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...
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
Guter Vorschlag. Ist aber auch ein wenig bescheiden beschrieben im DB für jemanden der sich das zum ersten mal anschaut.
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
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.
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
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... ;-)
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
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...
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
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...
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.