Forum: Mikrocontroller und Digitale Elektronik Interrupt ATMEGA8


von newbiee (Gast)


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:
1
// ********** Impulszähler Start **********
2
3
ISR(TIMER1_CAPT_vect)
4
{
5
     pulse ++;// ISR-Code
6
    //später rein gekommen zum debuggen
7
  PORTB |= (1 << 3);
8
  for(i=0;i<100000;i++){ } 
9
  PORTB &= ~(1 << 3); 
10
}
11
// ********** Impulszähler Ende **********
12
13
// ICP Interrupt initialisieren
14
TIMSK |= (1<<TICIE1);  //((TIMSK | 0b00100000);
15
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.

von Interrupter (Gast)


Lesenswert?

Hast Du auch den Timer Int. und den Globalen Int. eingeschaltet?

von newbiee (Gast)


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
1
TCNT1H = 0;
2
TCNT1L = 0;
Das habe ich nicht ich getan. Werde ich morgen direkt einmal testen.
Habe die Hardware nicht hier.

Danke!

Gruß

von Interrupter (Gast)


Lesenswert?

Welchen Prozessor verwendest Du?

von crazy horse (Gast)


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.

von newbiee (Gast)


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?
1
// ICP Interrupt initialisieren
2
TIMSK |= (1<<TICIE1);  //((TIMSK | 0b00100000);
3
TCCR1B = (TCCR1B | 0b00100000);
Danke nochmals,
Gruß

von crazy horse (Gast)


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.

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.