www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMega88 und INT0


Autor: Ben Holländer (holltsb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
habe folgendes Problem. Benutze einen Atmega 88 und möchte gerne an INT0
einen Taster betreiben.( Soll später für aufwecken benutz werden).

Momentan habe ich nur den Code geschrieben, um den INT 0 Anschluß
zu initialisieren.
Folgendes passiert:
Es wird nach einschalten der Versorgungsspannung bzw. nach einem Reset
direkt ein Int0 ausgelöst.
Was mache ich nur falsch?

Habe schon alles mögliche probiert.
z.B. Setzen von EIFR vor aktivierung von EIMSK. Hat nichts bewirkt.
Taster an PB0, Led an PC4 gegen vcc geschaltet

int main(void)
{     DDRB = 0b11111100;
      PORTB |= (1<<P2) |1<<P1);   // Pullups

      sbi(PORTC,4);
      EIFR = 0b00000011;
      EIMSK = 0b000000001;
      sei();
}
SIGNAL(SIG_INTERRUPT0)
  // signal handler for external interrupt int0
{
  cbi(PORTC,4);
  delay_ms(100);
  sbi(PORTC,4);
}


Bin für jede Hilfe dankbar
Gruß

Ben

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du eigentlich irgendwo noch eine Endlosschleife eingebaut?

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ben Holländer wrote:
> int main(void)
> {     DDRB = 0b11111100;
>       PORTB |= (1<<P2) |1<<P1);   // Pullups
Wer oder was sind P1 und P2?

>       sbi(PORTC,4);
Die sbi- und cbi-Makros sind afair veraltet.

>       EIFR = 0b00000011;
>       EIMSK = 0b000000001;
Zähle bitte mal die Nullen und Einsen...

Und dann gewöhne Dir die Schreibweise mit den Bitnamen an, die im 
Artikel Bitmanipulation beschrieben ist. Dann muss auch nicht jeder 
erst im Datenblatt nachsehen, was Du da alles gesetzt hast.

> SIGNAL(SIG_INTERRUPT0)
SIGNAL ist ebenfalls veraltet. Schau bitte im AVR-GCC-Tutorial nach, 
wie es geht!

Autor: Ben Holländer (holltsb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
vielen Dank für die Tips.
Habe das hanze mal überarbeitet:

Funktioniert immer noch nicht. Taster an PB0, Led an PC4 gegen vcc

int main(void)
{
  DDRC |= (1<<PC4);
  DDRB &= ~(1<<PB0);   // Eingang

  PORTB |= (1<<PB0);  // Pull up
  PORTC |= (1<<PC4);
  EICRA &= ~(1<<ISC01);
  EICRA &= ~(1<<ISC00);
  EIMSK |= (1<<INT0);
  sei();
  while(1);
}

ISR(INT0_vect)
  // signal handler for external interrupt int0
{
  PORTC &= ~(1<<PC4);
  delay_ms(100);
  PORTC |= (1<<PC4);

}


Bin für jede Hilfe dankbar

Autor: Juergen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ISR(INT0_vect)
> {
>   ...
>   delay_ms(100);
>   ...
> }

100ms im Interrupt zu verwarten ist auch nicht die vornehme Art ...

Autor: Ben Holländer (holltsb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
die Zeitverzögerung dient ja nur zum Test dazu
das man ein led blinken war nimmt.
Gruß

Ben

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Taster an PB0, ...

Das ist aber nicht der INT0-Pin. Das ist PD2.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ben Holländer wrote:
> habe folgendes Problem. Benutze einen Atmega 88 und möchte gerne an INT0
> einen Taster betreiben.( Soll später für aufwecken benutz werden).

Fürs Aufwecken eignet sich besser der Pin-Change-Interrupt.
Fürs Entprellen eignet sich besser ein Timerinterrupt.
Also macht man Aufwecken und Entprellen besser separat.


Peter

Autor: Michael Appelt (micha54)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

steht nichgt bereits alles da ? Die ansteigende Flanke soll eine INT0 
generieren. Schalte den Pullup ein und Du hast eine ansteigende Flanke.

Nachtrag: Schreib ein INTF0 nach EICRA, das löscht das Interruptflag.
EICRA |= (1<<INTF0);

Weiterhin macht der Pullup keine Sinn, wenn Du auf eine ansteigende 
Flanke wartest.


Gruß,
Michael

Autor: Ben Holländer (holltsb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
@ Stefan Ernst
Tausend Dank.
Natürlich wars das. INT0 und PCINT0 vertauscht.
So ein Mist. Layout kann ich jetzt erstmal neu zeichnen.

Super Forum hier.

Nochmals Vielen Dank für die Hilfe.

Gruß
Ben

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael Appelt wrote:
> Nachtrag: Schreib ein INTF0 nach EICRA, das löscht das Interruptflag.
> EICRA |= (1<<INTF0);
Nö. In EICRA stehen keine Interrupt-Flags! Das hat er in seiner 
ursprünglichen Version schon richtig gemacht mit EIFR.

> Weiterhin macht der Pullup keine Sinn, wenn Du auf eine ansteigende
> Flanke wartest.
Ein Pull-Up hat nichts damit zu tun, was für eine Flanke man haben will, 
sondern nur damit, wie der Taster angeschlossen ist. Wenn der Taster 
gegen Gnd angeschlossen ist, dann internen Pull-Up aktivieren, wenn er 
gegen VCC angeschlossen ist (was bei AVRs i.d.R. unsinnig und damit 
unüblich ist), dann externen Pull-Down anschließen.

Im ersten Fall gilt Taster gedrückt -> fallende Flanke, Taster 
losgelassen -> steigende Flanke.

Ben Holländer wrote:
>   EICRA &= ~(1<<ISC01);
>   EICRA &= ~(1<<ISC00);
Damit konfigurierst Du den Interrupt auf Low-Level-sensitiv. Das ist 
vermutlich nicht das, was Du willst...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ben Holländer wrote:
> Natürlich wars das. INT0 und PCINT0 vertauscht.
> So ein Mist. Layout kann ich jetzt erstmal neu zeichnen.

Ich wüßte nicht warum.
PCINT0 ist doch ideal zum Aufwecken.


Peter

Autor: Michael Appelt (micha54)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johannes M. wrote:
> Nö. In EICRA stehen keine Interrupt-Flags! Das hat er in seiner
> ursprünglichen Version schon richtig gemacht mit EIFR.

Ja, mein Fehler.

>> Weiterhin macht der Pullup keine Sinn, wenn Du auf eine ansteigende
>> Flanke wartest.
> Ein Pull-Up hat nichts damit zu tun, was für eine Flanke man haben will,
> sondern nur damit, wie der Taster angeschlossen ist. Wenn der Taster

Ein Pullup triggert bereits ohne Taster eine ansteigende Flanke.

> Im ersten Fall gilt Taster gedrückt -> fallende Flanke, Taster
> losgelassen -> steigende Flanke.

Taster gedrückt = 3 fallende und 2 steigende Flanken, Taster losgelassen 
dito insertiert. Taster prellen sowieso, da ist die Richtung der FLanken 
wurst.

Aber das Problem war ja bereits gelöst...

Gruß,
Michael

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.