Int bzw. PCINT

pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1340
Registered: 02 / 2009
Subject:

Int bzw. PCINT

 · 
Posted: 20.09.2010 - 23:53  ·  #1
Hallo Leute,

ich habe ein Problem :( mir gehen meine Interrupt-Pins aus.

Da bei meinem 2560 die ersten 4 PINS doppelt belegt sind mit Funktionen die ich aber brauche:
INT0: I2C_CLOCK
INT1: I2C_DAT
INT2: RXD1
INT3: TXD1

Kann ich diese leider nicht für meine Bauteile-Interrupts benutzen. Die anderen PINs sind bereits wie
folgt belegt:

INT4: MIRF_CoPro_IRQ (AES CoPro)
INT5: WIZNET_IRQ (WizNet Ethernetchip)
INT6: CAN_CTRL1_IRQ (Can Controller MCP2515)
INT7: CAN_CTRL2_IRQ (Can Controller MCP2515)

Und somit habe ich bereits meine ganzen normalen INTs belegt.

Da ich aber ein Expansion-Port auf meiner Leiterplatte vorsehe, möchte ich dort mind. 2-3 IRQs als Reserve vorhalten.

Wie ist das den mit den ganzen PCINTx (Pin Change Interrupt) zu verstehen, kann man denn diese evtl. als externen Interrupt benutzen? Und wenn ja, wie muss ich dies Softwaretechn, vorsehen und muss ich etwas bei der Verschaltung beachten?

Gruß
Thorsten
mc-electronic
Benutzer
Avatar
Gender: n/a
Location: Sauerland NRW
Posts: 372
Registered: 03 / 2008
Subject:

Re: Int bzw. PCINT

 · 
Posted: 21.09.2010 - 10:09  ·  #2
Hallo Thorsten,

persönlich würde ich eine andere Lösung bevorzugen: Nach meiner Erfahrung gibt es hier und da Probleme mit dem Atmel I2C Hardware-Interface. (Gab auch mal ein Thread hier im Forum). Ich habe dann auf das AVRco Software Interface umgestellt. (Danach waren auch meine I2C Probleme weg)

Statt TWIMaster importieren, den I2CPort Importieren
dann...
Define
I2Cport = PortD; {use port PortD} // Or some other Port...
I2Cclk = 0,36; // 148 / 100 kHz, 36 / 400 kHz
I2Cdat = 1; // data-pin

und im Programm dann mit I2CInp und den anderen zugehörigen Befehlen arbeiten.

Damit bekommst Du Int0 und Int1 schon mal frei.

Gruß, Michael
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Int bzw. PCINT

 · 
Posted: 21.09.2010 - 13:55  ·  #3
Hallo Thorsten,

PCints (PinChangeInterrupts) sind Eigenschaften bestimmter Ports bei den AVRs. Welche Ports dies unterstützen hängt vom CPU Typ ab.
Wird ein PCint importiert und definiert, löst ein Status Wechsel am betroffenen Port Pin einen Interrupt aus, ähnlich einem normalen externen Interrupt.

btw.
Der XMega TWI scheint problemlos zu arbeiten. Man hat in Norwegen dazu gelernt :devil:

rolf
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1340
Registered: 02 / 2009
Subject:

Re: Int bzw. PCINT

 · 
Posted: 21.09.2010 - 14:53  ·  #4
Hallo Rolf.

Quote by rh

PCints (PinChangeInterrupts) sind Eigenschaften bestimmter Ports bei den AVRs. Welche Ports dies unterstützen hängt vom CPU Typ ab.
Wird ein PCint importiert und definiert, löst ein Status Wechsel am betroffenen Port Pin einen Interrupt aus, ähnlich einem normalen externen Interrupt.


Also wenn ich das dann richtig verstehe, gibt es dann einen Sammelinterrupt, und ich muss in der Interrupt-Routine dann abfragen welcher PortPin das ganze ausgelöst hat, wenn ich mehr als einen Pin als PCINT definiere. Oder?

@Michael: Also ich habe mittlerweile schon mehrere I2C-Bausteine am Hardware-I2C am laufen, bis jetzt hatte ich noch keine Probleme. Klar könnte ich das ganze auf Software umstellen, bei 16 MHz sollte das kein Problem sein, zumal ich eh keine Zeitkritischen Abfragen auf dem I2c fahre. Ist eine gute Idee. Aber die Lösung mit dem PCINTx ist auch ok, da hat der 2560 3x8 PINs für sowas, das sollte eigentlich reichen.

Gruß
Thorsten
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Int bzw. PCINT

 · 
Posted: 21.09.2010 - 16:26  ·  #5
Hallo Thorsten,

nein, eine Abfrage welcher Pin der Auslöser war, ist nicht notwendig. Der AVRco bietet für jeden als Interrupt definierten Pin einen separaten Interrupt. Z.B.:
Interrupt PCint00; // PinB.0 mega168
In ACCB wird dabei die auslösende Flanke übergeben.
Mehr dazu im Compiler Manual Seite 77

rolf
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1340
Registered: 02 / 2009
Subject:

Re: Int bzw. PCINT

 · 
Posted: 21.09.2010 - 16:41  ·  #6
Hallo Rolf.

Quote by rh

nein, eine Abfrage welcher Pin der Auslöser war, ist nicht notwendig. Der AVRco bietet für jeden als Interrupt definierten Pin einen separaten Interrupt. Z.B.:
Interrupt PCint00; // PinB.0 mega168
In ACCB wird dabei die auslösende Flanke übergeben.
Mehr dazu im Compiler Manual Seite 77


Danke für die Info :) damit habe ich wieder genug Interrupt-Ports.
Was ist eigentlich mit diesen I2C-Problem, ist das noch aktuell? Oder gibt es diese Probelem mit der aktuellen Version von AVRco nicht mehr?

Gruss

Thorsten
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Int bzw. PCINT

 · 
Posted: 21.09.2010 - 19:30  ·  #7
Hallo Thorsten,

der AVR TWI (non-XMega) hat zwei kleine Probleme.
1. sog. glitches auf den Leitungen. Damit umschreibt Atmel die Empfindlichkeit :D der TWI Leitungen. Der AVRco versucht das durch spezielle Behandlungen zu umgehen. Geht aber nicht immer.
2. ein schlechtes Timing zum Abschluss eines Transfers. Hat für die meisten I2C Slaves keine Bedeutung, ausgenommen z.B. LM76, der nimmt übel.

Aber wenn das Teil in der App läuft, gibt es eigentlich keine Probleme. Wie gesagt, mit dem XMega TWI ist das alles super gelöst! Bis auf einen kleinen Bug (siehe errata) den der AVRco aber im Griff hat.

rolf
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 14 · Cache Hits: 14   126   140 · Page-Gen-Time: 0.021187s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI