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

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.