Forum: Compiler & IDEs Interupt INT0 geht bei Tiny25 nicht?


von Patrick (Gast)


Lesenswert?

Hallo,

ich versuche den INT0 des Tiny25 in Betrieb zu nehmen, aber leider 
klappt es nicht. Mit dem INT0 will ich einen Puls ausmessen

Port vorbereiten..

DDRB  &= ~(1<<DDB0);  /* Pin PB0 als Eingang */
PORTB |= (1<<PB0);    /* internen Pull-Up an PB0 aktivieren */

/* Int0 steigende Flanke / INT0 enable PB0 */
MCUCR = 0x03;
GIMSK = (1 << INT0);
sei();

in der Routine sollte der Einsprung erfolgen wenn ein Flankenwechsel 
kommt...

SIGNAL(SIG_INTERRUPT0)
{
  if( MCUCR == 0x03) // Testen auf steigende Flanke
  {
  TCNT1 = 0; // Timer1 Reset
  TCCR1 = ( 1 << CS10 | 1 << CS12 );
  MCUCR = 0x02; // INT0 fallende Flanke
  return;
  }

  if( MCUCR == 0x02 ) // Testen auf fallende Flanke
  {
  TCCR1 = 0x00; // Timer1 Stoppen
  Pulsdauer = TCNT1; // Timer1 Wert = Pulsdauer
  MCUCR = 0x03; // INT0 auf steigende Flanke
  return;
  }
}

das gleiche hatte ich schon mit einem Tiny13 gemacht und da geht es ohne 
Problem, beim Tiny25 reagiert aber der Int nicht auf einen 
Flankenwechsel am Pin (mit Oszi nachgemessen..)

was mach ich falsch???

Gruss Patrick

von Magnus Müller (Gast)


Lesenswert?

Fehler über Fehler....

Patrick schrieb:
> ich versuche den INT0 des Tiny25 in Betrieb zu nehmen, aber leider
> klappt es nicht. Mit dem INT0 will ich einen Puls ausmessen

Feststellung: INT0 liegt auf PB2

> Port vorbereiten..
>
> DDRB  &= ~(1<<DDB0);  /* Pin PB0 als Eingang */
> PORTB |= (1<<PB0);    /* internen Pull-Up an PB0 aktivieren */

Feststellung: Auf PB0 liegt nicht INT0 sondern PCINT0

> /* Int0 steigende Flanke / INT0 enable PB0 */
> MCUCR = 0x03;
> GIMSK = (1 << INT0);
> sei();
>
> in der Routine sollte der Einsprung erfolgen wenn ein Flankenwechsel
> kommt...
>
> SIGNAL(SIG_INTERRUPT0)

In "meinem" Datenblatt nennt sich das "INT0". Und wenn ich mich nicht 
irre, ist SIGNAL veraltet.

von Magnus Müller (Gast)


Lesenswert?

Magnus Müller schrieb:
>> SIGNAL(SIG_INTERRUPT0)
>
> In "meinem" Datenblatt nennt sich das "INT0". Und wenn ich mich nicht
> irre, ist SIGNAL veraltet.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#ISR

von Patrick (Gast)


Lesenswert?

aua.. schande über mein Haupt... stimmt ich hab den PCINT0 mit dem INT0 
verwechselt. Kann ich mit dem PCINT0 überhaupt einen Puls ausmessen?

Gruss Patrick

von Magnus Müller (Gast)


Lesenswert?

Natürlich kannst du das. PCINT0 reagiert auf jeden Flankenwechsel .
D.h. der Interrupt wird sowohl bei 0->1 als auch bei 1->0 Wechseln 
ausgelöst.

von Patrick (Gast)


Lesenswert?

und wie bekomme ich mit ob es eine steigende Flanke oder fallende war? 
geht nur mit dem INT0 oder?

Gruss Patrick

von Magnus Müller (Gast)


Lesenswert?

Patrick schrieb:
> und wie bekomme ich mit ob es eine steigende Flanke oder fallende war?

Prüfe in der ISR den Zustand des Pins. Wen der Pin high ist, war es eine 
positive Flanke. Ist der Pin LOW, war es eine negative.

von Patrick (Gast)


Lesenswert?

gute Idee werde ich so machen... danke

Gruss Patrick

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
Noch kein Account? Hier anmelden.