Forum: Mikrocontroller und Digitale Elektronik ATtiny13 Interrupt funktiniert nicht


von POTUS (Gast)


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

von Hans_Dampf (Gast)


Lesenswert?

>TCCR0A = (1<<WGM01);
>TCCR0B = (1<<CS00)| (1<<CS02);
>OCR0A = 125-1;
>TIMSK0 |= (1<<TOIE0)

Du initialisierst Timer 0 definierst aber:

>ISR (TIMER1_COMPA_vect)

den Interrupt des Timers 1

von Justus S. (jussa)


Lesenswert?

POTUS schrieb:
> dass beim compilieren die warnung
> "timer0_compa_vect appears to be a misspelled handler"

und warum trägst du dann nicht den richtigen Namen ein?

von POTUS (Gast)


Lesenswert?

ups, mein fehler
hab nen test quelltext gepostet

im original hab ich ISR (TIMER0_COMPA_vect)initialisiert
(dann stimmt auch die warnmeldung wieder

von Hans_Dampf (Gast)


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.

von Justus S. (jussa)


Lesenswert?

POTUS schrieb:
> dann stimmt auch die warnmeldung wieder

dann nimm sie dir zu Herzen und trag den richtigen Namen ein!

von POTUS (Gast)


Lesenswert?

ok, ich hab jetzt den Interruptnamen in "TIM0_COMPB_vect" geändert und 
"ORC0A = 1" gesetzt.

passiert aber leider immer noch nichts

von laie (Gast)


Lesenswert?

Also ich weiß ja auch nicht was da genau hinmuss, aber "TIM0_COMPB_vect" 
sicher nicht, wenns um OCR0A geht...

von Hans_Dampf (Gast)


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

von POTUS (Gast)


Lesenswert?

tschulding, könnte noch ne weile dauern, mein flash-borad ist grade 
nicht verfügbar!

meld mich aber sofort wenn ich's ausprobiert hab.

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.