www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega 168 PinB0 value at edge (PCINT0)


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

ich versuche gerade an einem Atmega 168 (eines iRobot Creates) ein 
Infrarot reciever zu installieren. Leider komme ich seit ein paar Tagen 
nicht weiter. Das IRD Signal ist an PINB0 angeschlossen. Das ganze soll 
durch einen Interrupt ausgeführt werden. Der Interrupt funktioniert 
soweit auch, nur das ich kein Signal bekomme. Der Interrupt sieht wie 
folgt aus:

ISR(PCINT0_vect)
/* vormals: SIGNAL(siglabel) dabei Vectorname != siglabel ! */
{


     if(count < 16){

    ir_edge_time[count]=ICR1; //Stores the counter value at signal edge
    count++;


  }
  else
  {
    read_IR(); // translates the bits

  }



  if (TCCR1B & (1<<ICES1))
   {
      TCCR1B &= ~(1<<ICES1);         // falling edge next
    LED2On;

    }
   else
   {
      TCCR1B |= (1<<ICES1);          // rising edge next
    LED2Off;

  }
}


Ich denke das der Fehler bei ICR1 liegt. Durch die LED Tests bin ich mir 
sicher, dass der Interrupt ausgeführt wird.


Die initalisierung für diesen Interrupt sieht wie folgt aus:

void initialize(void)
{
  cli();

  // Set I/O pins
  DDRB = 0x00; //Input
  PORTB = 0xFF; //Pull ups eingschaltet



  PCICR |=(1<<PCIE0); // PCIE0 pin change interrupt auf  0 bis 7 
aktiviert
  PCMSK0|=(1<<PCINT0);   // pcint0 aktivieren
  // Turn on interrupts
  sei();
}


Vielleicht hat ja jemand eine Idee oder hatte schon ein ähnliches 
Projekt


Grüße

Daniel

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>    ir_edge_time[count]=ICR1; //Stores the counter value at signal edge

Wenn der "counter" gar nicht läuft, wird der "value" natürlich immer 0 
sein.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm, so wie ich das jetzt verstehe ist ICR1 falsch.. hat denn PCINT0 auch 
einen zählenden wert? Habe leider nichts dazu gefunden. Timer1 anstatt 
PCINT0 kann ich nicht nehmen, da es halt ein changed pin i
Interrupt bleiben soll.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniel schrieb:
> hm, so wie ich das jetzt verstehe ist ICR1 falsch.. hat denn PCINT0 auch
> einen zählenden wert? Habe leider nichts dazu gefunden. Timer1 anstatt
> PCINT0 kann ich nicht nehmen, da es halt ein changed pin i
> Interrupt bleiben soll.

Sorry, dass ich das jetzt sagen muss, aber das ist ja völlig konfus.

Timer1 kannst du nicht nehmen? Was dachtest du, wo ICR1 zu gehört? Wieso 
soll es unbedingt ein "changed pin i Interrupt" bleiben? Wie hattest du 
vor, die Zeit zwischen zwei Pin-Change-Events zu ermitteln?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.