ATMega168 INT0 ohne ISR

Gast #2456965
Lesenswert?
• ▲
▼
Hallo liebe Gemeinde,

ist vermutlich eine blöde Anfängerfrage...
ich möchte gern alle 5 sec prüfen, ob seit der letzten Prüfung eine 
fallende Flanke an INT0 vorlag. Ich möchte allerdings nicht die ISR für 
den INT0 nutzen. Im Simulator des AVR Studio 4.18 und 5 geht das auch 
prima. PINB1 schaltet alle 5 sec um, PINB0 nur wenn fallende Flanke 
vorlag.
Die fallende Flanke wird am gesetzten Flag INTFR0 im EIFR Register 
erkannt.
Wenn ich die hex in meinen Microcontroller übertrage, gibt es keine 
Reaktion auf die fallende Flanke die ich durch einen Taster auf GND 
simuliere. Kann mal bitte jemand auf meinen Codeschnipsel schauen ob ich 
hier vieleicht einen Denkfehler gemacht habe? Oder verhält sich der 
Mega168 in real anders als der Simulator?

Vielen Dank im Voraus!
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3

4
#define CPU_CLOCK 3686400 
5

6
ISR(TIMER1_COMPA_vect){
7
  if (bit_is_set(EIFR,INTF0))
8
  {
9
    EIFR|=(1<<INTF0); // write one for clear interrupt flag
10
    PORTB^=(1<<PINB0); // change state of PINB0
11
  }
12
  PORTB ^=(1<<PINB1); // change state of PINB1
13
};
14

15
int main(void)
16
{
17
  PORTD |=(1<<PIND2); // Pull up enable - PIN for external INT0 (button is low active)
18
  EICRA |= (1<< ISC01);  //INT request on falling edge
19
  DDRB |= (1<<PINB0)|(1<<PINB1); // PB0, PB1 as output
20
  
21
  // configure timer0
22
  OCR1A = 18000; //OCR1A for 5 seconds
23
  TCCR1B|= (1<<WGM12); //clear timer on match
24
  TCCR1B|=(1<<CS10)|(1<<CS12); //scaler =1024
25
  TIMSK1|= (1<<OCIE1A); // enable Timer1 Compare match A ISR
26
  sei();
27
  
28
  // infinite loop
29
  while(1)
30
    {
31
        asm("NOP"); 
32
    };
33
}
#2457026
Lesenswert?
• ▲
▼
Alex_PvG schrieb:
> hier vieleicht einen Denkfehler gemacht habe?
Und zwar einen gewaltigen.

Wenn ein Interrupt ausgelöst wird, MUSS eine Isr vorhanden sein, sonst 
macht der Controller einen Reset.

Alex_PvG schrieb:
> if (bit_is_set(EIFR,INTF0))
>   {
>     EIFR|=(1<<INTF0); // write one for clear interrupt flag
Sowas in einem Timer-Interrupt abzufragen, ist nicht der Weisheit 
letzter Schluss.

char nInt0 = 0;

ISR(INT0_vect)
{
   nInt0 = 1;
}

ISR(TIMER1_COMPA_vect)
{
  if (nInt0)
  {
    nInt0 = 0;

    Mach was...
  }
}

Alex_PvG schrieb:
> while(1)
>     {
>         asm("NOP");
>     };
Das "nop" kannst du weglassen. Es reicht, wenn er einfach nur auf der 
Stelle trampelt.

mfg.
#2457054
Lesenswert?
• ▲
▼
Thomas Eckmann schrieb:
> Alex_PvG schrieb:
>> hier vieleicht einen Denkfehler gemacht habe?
> Und zwar einen gewaltigen.
>
> Wenn ein Interrupt ausgelöst wird, MUSS eine Isr vorhanden sein, sonst
> macht der Controller einen Reset.

Er hat doch den INT0 gar nicht zur Behandlung durch eine ISR 
freigegeben. Im EIMSK ist das entsprechende Bit nicht gesetzt worden.
Er fragt lediglich das Flag im Flagregister ab. Und das ist durchaus 
legitim, wenn auch das Rücksetzen fehlerhaft gemacht wurde (was aber zur 
Zeit nicht das Problem darstellt)
Gast #2458564
Lesenswert?
• ▲
▼
Hallo,

vielen Dank für die vielen Hinweise. Hatte gestern leider keine Zeit 
reinzuschauen. PINB1 toggelt wie erwartet im geplanten Zeitintervall. 
CPU läuft mit externem Baudratenquarz, fuses sind entsprechend gesetzt.

Das Löschen des Interrupt flags durch schreiben eines Bits
1
EIFR|=(1<<INTF0)
habe ich aus der ATMEL Beschreibung des Prozessors. Funktioniert im 
Simulator auch so.

Ich muss dann wohl mal schauen ob der PIND2 (INT0) eventuell abgeraucht 
ist. Mal anderen Prozessor ausprobieren...

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.