www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt ATMEGA8


Autor: newbiee (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo *,

habe mal wieder ein kleines Problem zw. Hard- & Software.

Ich möchte wenn an PB0 ein low (GND) anliegt, einen Interrupt starten 
ausführen der in der Routine einen Zähler Incrementiert. Im AVR Studio 
4.0 klappt dies ohne Probleme, aber in Hardware leider nicht. Habe den 
internen Pullup an PB0 aktiviert und einen Taster angeschlossen der 
gegen GND kurzschließt. Wie gesagt per Simulation alles OK, aber 
Hardware .... :-(
Kann mir jemand sagen, ob der GCC coder richtig ist, oder ob ich dort 
wieder einmal einen "Logicfehler" drinnen hab?!

Hier einmal der GCC Teil, für den Interrupt:
// ********** Impulszähler Start **********

ISR(TIMER1_CAPT_vect)
{
     pulse ++;// ISR-Code
    //später rein gekommen zum debuggen
  PORTB |= (1 << 3);
  for(i=0;i<100000;i++){ } 
  PORTB &= ~(1 << 3); 
}
// ********** Impulszähler Ende **********

// ICP Interrupt initialisieren
TIMSK |= (1<<TICIE1);  //((TIMSK | 0b00100000);
TCCR1B = (TCCR1B | 0b00100000);

Zu Debuggzwecken habe ich die Interruptroutine erweitert und eine LED an 
PB2 angeschlossen. Aber nichts. Der ATMEGA8 springt nicht in die 
Interruptroutine.

Danke schon mal an euch.

Autor: Interrupter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du auch den Timer Int. und den Globalen Int. eingeschaltet?

Autor: newbiee (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, den Globalen Int. habe ich eingeschaltet.
Vor meiner while Schleife steht ein sei()

Aber den Timer Int. ....

Ich denke du meinst das hier
TCNT1H = 0;
TCNT1L = 0;
Das habe ich nicht ich getan. Werde ich morgen direkt einmal testen.
Habe die Hardware nicht hier.

Danke!

Gruß

Autor: Interrupter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welchen Prozessor verwendest Du?

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PORTB |= (1 << 3);
  for(i=0;i<100000;i++){ }
PORTB &= ~(1 << 3);

Und dann die LED an PortB.2??
Kann auch gut sein, dass die Schleife, da offensichtlich nichts 
sinnvolles drin, wegoptimiert wird, liegt aber an Compiler und dessen 
Einstellungen.

Ansonsten läuft den Timer gar nicht (CS00..CS02 in TCCR1B), ICP-ISR 
sollte aber eigentlich trotzdem angesprungen werden?? Weiss ich gar 
nicht, nie probiert.

Bleibt noch diese Zeile:
TCCR1B = (TCCR1B | 0b00100000);
magic numbers? wahrscheinlich meinst du ICES1, du setzt aber Bit5, das 
gibts gar nicht, zumindest nicht dokumentiert.

Bleibt als letztes das Prellen des Schalters.

Autor: newbiee (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Interrupter: steht oben im text : ATMEGA8

@  crazy horse: das mit der Hardware (LED) stimmt. Ist jedenfalls der 
richtige PORTB an dem das LED hängt. Entprellen eigentlich auch egal, da 
auf jeden Fall der Interrupt angesprungen werden soll. Kommt der 
Kontakt, dann rein in den Interrupt. Und das passiert ja nicht :-(

OK. Ist das erste Mal für mich, das ich was mit einen Interrupt progge.

Das mit der Schleife habe ich mal rein gemacht, damit die LED lange an 
ist.  Werde dann auch noch mal den Tipp mit der Schleife befolgen, wenn 
nichts geht (irgendeine Variabel hoch zählen lassen, oder so).

Wie müsste denn die Initialisierung aussehen von dem Teil des Codes?
// ICP Interrupt initialisieren
TIMSK |= (1<<TICIE1);  //((TIMSK | 0b00100000);
TCCR1B = (TCCR1B | 0b00100000);
Danke nochmals,
Gruß

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tja, das ist die Frage, ob du die LED noch blitzen siehst, wenn die 
Schleife (die die Verzögerung sein soll) wegoptimiert wird. Ich weiss es 
nicht ob, nur ne Vermutung - da hilft nur ein Blick ins listing.

"Wie müsste denn die Initialisierung aussehen von dem Teil des Codes?
TCCR1B = (TCCR1B | 0b00100000); "

Woher soll ich das wissen? Ich weiss doch nicht, was die Zeile bedeuten 
soll bzw. was du damit bezweckst.

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.