Forum: Mikrocontroller und Digitale Elektronik Interupt löst nicht aus, was mach ich falsch?


von Tobi (Gast)


Lesenswert?

Hi

Ich benutze einen ATmega48.
Hier mein "Test Code".
1
#define  F_CPU 8000000
2
#include <stdio.h>
3
#include <avr\io.h>
4
#include <avr\interrupt.h>
5
#include <util\delay.h>
6
7
#define sbi(ADDRESS,BIT) ((ADDRESS) |= (1<<(BIT)))
8
#define cbi(ADDRESS,BIT) ((ADDRESS) &= ~(1<<(BIT)))
9
10
//--------------------------------------------------------------------
11
// INT0_vect - INT0 Interrupt an Eingang PORTD2 bei fallender Flanke
12
//--------------------------------------------------------------------
13
SIGNAL(SIG_INTERRUPT0)
14
{
15
  PORTC = 0b00000001;
16
}
17
//--------------------------------------------------------------------
18
// INT1_vect - INT1 Interrupt an Eingang PORTD3 bei fallender Flanke
19
//--------------------------------------------------------------------
20
ISR(INT1_vect)
21
{
22
  PORTC = 0b00000001;
23
}
24
//--------------------------------------------------------------------
25
// TIMER0_OVF_vect - Timer0 Interrupt bei Überlauf
26
// aktuelle Einstellung:  14.063 Hz  71.111 ms
27
//--------------------------------------------------------------------
28
ISR(TIMER0_OVF_vect)
29
{
30
  TCNT0 = 248;
31
}
32
//------------------------------------------------------------------------
33
// Initialisierungen
34
//------------------------------------------------------------------------
35
void init()
36
{
37
  // Ports initialisieren
38
  cbi(DDRD,2);   // PORTD2 auf Eingang mit PullUp
39
  sbi(PORTD,2);
40
  EIMSK|=0b01000000;   // INT0 Interrupt an Eingang PORTD2 bei fallender Flanke
41
  MCUCR|=0b00000010;
42
  cbi(DDRD,3);   // PORTD3 auf Eingang mit PullUp
43
  sbi(PORTD,3);
44
  EIMSK|=0b10000000;   // INT1 Interrupt an Eingang PORTD3 bei fallender Flanke
45
  MCUCR|=0b00010000;
46
  //--- Timer 0 initialisieren ---
47
  TCCR0B =0x05;   // Teiler 1/1024
48
  sbi(TIMSK0,0);   // Interrupt bei Überlauf
49
  TCNT0 = 248;
50
  //--- Interrupts erlauben ---
51
  sei();
52
}
53
54
/////////////////////////////////////////////////////////////////////////////
55
// Main-Funktion
56
/////////////////////////////////////////////////////////////////////////////
57
main()
58
{
59
  DDRC=0xff;
60
  PORTC=0;
61
62
63
  while (true)    // Mainloop-Begin
64
  {
65
    
66
    //...
67
  }
68
  // Mainloop-Ende
69
}

Nur warum lösen die Interupts nicht aus?

gruß

von Thomas K. (muetze1)


Lesenswert?

init() wird nicht aufgerufen?

Warum verwendest du eigentlich die alte Schreibweise bei den ISR?

von holger (Gast)


Lesenswert?

>Nur warum lösen die Interupts nicht aus?

Weil du init() nicht aufrufst.

von Tobi (Gast)


Lesenswert?

Ups, doch mach ich, hab zuviel aus dem Originalprogramm rausgelöscht...

von Tobi (Gast)


Lesenswert?

Der Timer läuft, es geht nur um INT0 und INT1.

von Stefan E. (sternst)


Lesenswert?

Wieder mal ein Fall von "wäre nicht passiert, wenn man die symbolischen 
Namen verwendet hätte, statt irgendwelcher Zahlenkonstanten". Du setzt 
in EIMSK die falschen Bits.

Außerdem: was soll beim Mega48 MCUCR mit Int0/1 zu tun haben?

von Tobi K. (tobidel)


Lesenswert?

Bin noch relativ unerfahren was Timer und Interupts angeht, hab die 
großen unterschiede zwischen dem Mega8 und Mega48 unterschätzt...
Hab jetzt wieder nen Mega8 das Programm nochmal überarbeitet und läuft 
nun so wies soll.

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.