PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PCINT Frage



manhunt
11.04.2009, 20:39
Hallo

Controller: ATMEGA168

Frage sind die PCINT pins jetzt normal Interrupt fähig, also wenn ich dort zb einen Sensor der sich mit fallender Flanke meldet anschließe lässt sich damit dann ein Interrupt auslösen?

edit:
Achja frohe Ostern..

lg manhunt

McJenso
11.04.2009, 22:21
Hallo,

so pauschal? Ja, warum fragst du?

Gruß

Jens

linux_80
11.04.2009, 23:40
Hallo,

und PCINT bedeutet Pin Change Interrupt, ein IRQ wird deshalb bei beiden Richtungen einer Flanke ausgelöst. Wenn eine bestimmte Richtung gefragt ist, muss man erst das PIN in der ISR abfragen.

manhunt
12.04.2009, 10:10
Danke sehr und wie Aktiviere ich diese Interrupts bzw wo finde ich das ISR define den in iomx8.h (interrupt.h) gibt es nur defines für PCINT0-2 von 3...23 ist keine Spur.

lg manhunt

linux_80
12.04.2009, 10:45
Moin,

PCINT geht nur Byte- bzw. Portweise, Du musst Dir den Port suchen an dem der gewünschte PCINT anliegt, und diese ISR aktivieren. Dann gibts noch eine Maske, in der man angeben kann welches Bit/Pin eines Ports den IRQ auslösen kann. Wenn man mehr als einen PCINT abfragen will, muss man in der ISR als erstes den Port(PIN) einlesen, um zu sehen welchen denn nun den IRQ ausgelöst hat, dann erst kommt das was man so in einer ISR macht ;)

Der Rest steht im DB des AVR :D
Frohes (Ostereier-) suchen :Ostern

manhunt
12.04.2009, 10:48
Danke schon verstanden.....

Frohe Ostern

oberallgeier
12.04.2009, 10:51
Hi manhunt,


... wie Aktiviere ich diese Interrupts bzw wo finde ich das ISR define den in iomx8.h (interrupt.h) gibt es nur defines für PCINT0-2 von 3...23 ist keine Spur ...Hmmm, Deine Frage ging doch nach dem mega168 - oder nicht?

Du holst Dir bei Atmel (http://www.atmel.com/dyn/products/datasheets.asp?family_id=607)das entsprechende Datenblatt, also das vom mega168 (http://www.atmel.com/dyn/resources/prod_documents/doc2545.pdf). Dort ist im Kapitel 12. External Interrupts abgehandelt wie Du 1) entweder einen der beiden Pinne extINT0 oder ~1 für steigende oder fallende Flanke definierst in Table 12-1. Interrupt 1 Sense Control, oder 2) im Abschnitt 12.2.6 PCMSK2 – Pin Change Mask Register 2 ist beschrieben, wie Du die anderen Pinne für diesen PCI programmieren kannst. Es ist nicht schwer (sogar ich habs hingekriegt), musst halt ein bisschen durcharbeiten.

Viel Erfolg

manhunt
12.04.2009, 13:09
Danke oberallgeier für die genaue Erläuterung, auch dir frohe Ostern...

lg

oberallgeier
12.04.2009, 16:35
Mist - ich versuche schon immer wieder diese automatischen Links auszutricksen - schreibe z.B. 5ervo (fünf ervo) für S ervo, damit nicht >> Servo << *) dasteht *gggg* - und nun habe ich diese automatische Verlinkung zu At mel - die ich garnicht wollte. Aber Du hast ja noch dieses "bei" dastehen, mit dem Link auf die Dok-Seite von At mel.

*) Anmerkung: .... da ich ja für ungewollt verlinkte Seiten nicht haften will *ggggg*.

manhunt
12.04.2009, 17:30
Naja für die Umwandlungen kannst du ja nichts, dafür haften höchstens die Roboternetz Admins weil Sie diese [wissentlich] gesetzt haben...

lg manhunt

oberallgeier
13.04.2009, 18:36
Hallo Sportsfreund, manhunt,

wie kommst Du mit den Interrupts voran? Läuft schocn was?

manhunt
13.04.2009, 18:44
Hi oberallgeier

Ja geschrieben hätte ich schon was nur fehlt mir Grad die Hardware es zu testen. (is a bissal schwer in den Osterfeiertagen was zu bekommen)


*/ALLES ohne gewähr und noch nicht getestet!!! */


#include <avr/io.h>
#include <avr/interrupt.h>

#define INTERN
#include "init.h"
#undef INTERN


#define START_PIN PINC

// Starting PIN, PINC5 or PCINT13
#define START PINC5

void init(void) {

PCICR |= (1<<PCIE1); //PCINT1 interrupt (for PCINT14...8
PCMSK1 |= (1<<PCINT13); // enables Interrupt trigger for PCINT13
return;
}

ISR(PCINT1_vect) {

if(!(START_PIN & (1<<START))) // For example do something if flag was falling....
RUN ^= 1; //Globale Variable


return;
}


edit: für andere um Kommentare und Defines erweitert