ATtiny13 Interrupt funktiniert nicht

Gast #1987743
Lesenswert?

hallo,
hab erst vor kurzem begonnen mich mit interrupts zu beschäftigen und 
wollte nun meinen ersten int mal ausprobieren. nur leider scheint er 
nicht wirklich zu funktionieren

hier mal mein quelltext:

1
#include <avr/io.h>
2
#define F_CPU 1000000UL  /* Takt:1MHz */
3
#include <util/delay.h>
4
#include <stdlib.h>
5
#include <avr/interrupt.h>
6

7

8
long int sek;
9
volatile int ms;
10

11

12
int main(void) 
13
{
14

15
  ms=0;
16
  sek=0;
17
  
18

19
  DDRB = 0b11100111;
20

21

22
  sei();                                           /* Global Interrupts aktivieren */
23
  TCCR0A = (1<<WGM01);                             /* CTC Modus an */
24
  TCCR0B = (1<<CS00)| (1<<CS02);                   /* Timer Vorteiler auf 1024 (-->1000000MHz/1024) */
25

26
  OCR0A = 125-1;                                   /* ((1000000/8)/1000) = 125 --> Interrupt aller 1ms */
27

28
  TIMSK0 |= (1<<TOIE0);                            /* Compare Interrupt(Interrrupt zu beliebigem Zeitpunkt) erlauben */
29
      
30
  
31
    
32
    while(1)
33
    {
34
      
35
      PORTB=0b000011000;
36

37
      if (ms==1000)                   /* mache aus ms -> s */
38
      {
39
        sek=sek+1;
40
        ms=0;
41
      }
42

43
          
44
      if ( best. Bedingung )  
45
      {
46
            
47
      PORTB=0b00011010;
48
      ms=0;
49
            
50
          if (sek>=10)                 /* wenn 10sek vergangen ohne änderung */
51
          {
52
          PORTB=0b00011011;
53
          _delay_ms(2000);
54
          PORTB=0b00011000;
55
          ms=0;
56
          }
57

58
      }
59

60
      ...
61

62
 
63
    }
64
    
65
}
66

67

68
ISR (TIMER1_COMPA_vect)                                        /* Interrupt Aktion alle 1ms */
69
{
70
 
71
  ms=ms+1;
72

73
  reti();
74
}


der sinn des prog soll also sein, dass der interrupt aller 1ms die var 
"ms" um 1 erhöht. wärnddessen soll im hauptprogramm eine schleife 
einsetzten, wenn der vorherige zustand 10s andauert.

noch zu ergänzen wäre, dass beim compilieren die warnung 
"timer0_compa_vect appears to be a misspelled handler" und sonst keine 
fehler auftreten.

mfg,
Tom
Gast #1987771
Lesenswert?

NACHTRAG:

Bei Deiner momentanen Timerkonfiguration würde Dein Interrupt nicht jede 
ms sondern alle 126,976 ms auftreten.

Begründung:

f_Interrupt = f_Sys / Prescaler = 1MHz / 1024 = 976 Hz -> T = 1,024 ms

Dein Timer wird also alle 1,024 ms getriggert.

Ein Interrupt kommt aber nur alle:

> OCR0A = 125-1;

also kommst Du auf eine Periodendauer von 124 * 1,024ms = 126,976 ms

Ach ja:

Üblicherweise wird erst die Interruptquelle definiert und dann mit 
sei(); freigegeben.
Gast #1988664
Lesenswert?

Probier mal das:
1
//...
2

3
void init_Timer0(void)
4
{
5
    TCNT3 = 0x00;           // reset counter
6
    TCCR0A = 0x02;          // CTC
7
    TCCR0B = 0x02;          // Prescaler =8 -> fTimer = 125kHz
8
    OCR0A = 0x7D;           // Comparevalue = 125
9
    TCNT0 = 0x00;           // reset Timer
10
    TIMSK0 |= (1<<OCIE0A);  // Enable compare interrupt
11
}
12

13
int main (void)
14
{
15
    ms=0;       
16
    sek=0;
17

18
    init_Timer0();
19
    sei();
20

21
    while(1)
22
    {
23
         // dein Programm
24
    }
25
}
26

27

28
ISR (TIMER0_COMPA_vect)
29
{
30
    ms++;          // increment ms
31

32
    if(ms >= 1000)
33
        sek++;     // increment seconds every 1000 ms
34
}
Poste bitte, ob Du Dein Problem gelöst hast!
Frohe Feiertage!

P.S. sorry für das Code-Posting

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren