PCINT benutzen Atmega

OP #2505334
Ich habe ein kleines Problem ... Meine fertig geroutete Platine weißt 
einen Fehler auf. Ich brauche einen Interrupt für mein Ethernet. Habe 
das Webserver Projekt vom Radig der den INT2 benutzt. Nun habe ich die 
Interruptleitung vom ENC28J60 auf PB1 gelegt. PB1(T1/CLKO/PCINT9) ist 
aber nicht INT2...

Kann ich PCINT9 auch als Interrupt benutzen? Ich weiß noch nichteinmal 
was PCINT überhaupt ist... Da ich vermeiden möchte mit Drähten 
rumzuspielen wollte ich vorher nochmal hier nachfragen!

Danke
Gast
Hi

PC erzeugt bei jeder Änderung einen Interrupt. In der ISR musst du halt 
feststellen welche Flanke und bei mehreren Pins einer Gruppe, welcher es 
war.

MfG Spess
OP
Hmm und wie mache ich das ?

ETH_INT_ACTIVE soll auf 1 gesetzt werden wenn der Interrupt kommt.

So steht es vom Radig im Code:

 #define ETH_INTERRUPT           INT2_vect
 #define ETH_INT_ACTIVE          (!(ENC_PIN & (1<<ENC_INT)))
 #define ETH_INT_ENABLE  EIMSK |= (1<<INT2)
 #define ETH_INT_DISABLE EIMSK &= ~(1<<INT2)

Wie kann ich da nun den PCINT9 integrieren. BIn da gerade echt ratlos ^^
Gast
Hi

>Wie kann ich da nun den PCINT9 integrieren. BIn da gerade echt ratlos ^^

Und ich kein C-Programmierer.

PCINT9 gehört zum Interrupt PCINT1. Um den freizugeben muss PCIE1 in 
PCICR gesetzt werden. Damit PCINT9 den Interrupt auslöst muss außerdem 
PCINT9 in  PCMSK1 gesetzt werden.

Ohne Gewähr:

 #define ETH_INTERRUPT           PCINT1_vect
 #define ETH_INT_ACTIVE          (!(ENC_PIN & (1<<ENC_INT)))  ??????
 #define ETH_INT_ENABLE  PCMSK1 |= (1<<PCINT9)
 #define ETH_INT_DISABLE EIMSK &= ~(1<<PCINT9)

Beim zweiten define weiß ich nicht in welchem Zusammehang das verwendet 
wird.
Das PCIE1 in PCICR musst du noch irgendwo in der Initialisierung setzen.

MfG Spess
OP
Hab ich gemacht wie du es beschrieben hast aber irgendwie funktioniert 
das nicht. Mein uC startet auch irgendwie alle 10 sekunden neu ... 
zumindest im UART zeigt er mir das er sich dauern wieder selbst 
initialisiert.

Scheinbar nen Timeout oder sowas.... hmmmm

in der main() habe ich direkt am Anfang:

PCICR |= (1<<PCIE1);
PCMSK1 |= (1<<PCINT9);

Komisch...

Danke aufjedenfall schonmal bis hierhin!
Gast
Hi

>Mein uC startet auch irgendwie alle 10 sekunden neu ...
>zumindest im UART zeigt er mir das er sich dauern wieder selbst
>initialisiert.

Hast du auch eine Interruptroutine für PCINT1 ?

MfG Spess
Gast
Hallo Andre,
das mit dem PCINT habe ich auch vor einigen Tagen gemacht.
Funktioniert eine ganze Zeit lang recht gut. Irgendwann
hängt sich der Webserver aber auf bzw. reagiert nicht
mehr auf den PCINT. Ansonsten lief der AVR noch. Falls das
bei dir auch so ist kannst du den PCINT auch komplett
weglassen und den ENC28J60 einfach pollen. Das frisst ein
wenig Rechenzeit, ist aber nicht so viel.

Du musst dann nur in stack.c zwei Zeilen wegkommentieren:
1
//----------------------------------------------------------------------------
2
//ETH get data
3
void eth_get_data (void)
4
{
5
  if(eth.timer)
6
  {
7
    tcp_timer_call();
8
    arp_timer_call();
9
    eth.timer = 0;
10
  }
11

12
// Polling geht irgendwie besser als mit PCINT zu arbeiten;)
13
// Aus irgendeinem Grund bleibt der Webserver irgendwann hängen.
14
// Der AVR selbst läuft noch, der Webserver reagiert nicht mehr.
15

16

17
//  if(eth.data_present)
18
  {
19
  #if USE_ENC28J60
20
//    while(ETH_INT_ACTIVE)
21
    {
22
  #endif
holger schrieb:
> Irgendwann
> hängt sich der Webserver aber auf bzw. reagiert nicht
> mehr auf den PCINT.

Das liegt einfach daran, daß es mehrere Interruptquellen gibt.
Dann bleibt der Pin auf aktiv und es gibt keine Flanke. Daher ist ein 
Pegelinterrupt besser.

Aber es geht auch mit Flankeninterrupt. Man schreibt den Handler als 
Schleife und testet zum Schluß den Pin, Ist er immer noch aktiv, wird 
die Schleife nochmal durchlaufen.


Peter

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.