mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATtiny13 Interrupt funktiniert nicht


Autor: POTUS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:

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


long int sek;
volatile int ms;


int main(void) 
{

  ms=0;
  sek=0;
  

  DDRB = 0b11100111;


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

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

  TIMSK0 |= (1<<TOIE0);                            /* Compare Interrupt(Interrrupt zu beliebigem Zeitpunkt) erlauben */
      
  
    
    while(1)
    {
      
      PORTB=0b000011000;

      if (ms==1000)                   /* mache aus ms -> s */
      {
        sek=sek+1;
        ms=0;
      }

          
      if ( best. Bedingung )  
      {
            
      PORTB=0b00011010;
      ms=0;
            
          if (sek>=10)                 /* wenn 10sek vergangen ohne änderung */
          {
          PORTB=0b00011011;
          _delay_ms(2000);
          PORTB=0b00011000;
          ms=0;
          }

      }

      ...

 
    }
    
}


ISR (TIMER1_COMPA_vect)                                        /* Interrupt Aktion alle 1ms */
{
 
  ms=ms+1;

  reti();
}


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

Autor: Hans_Dampf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: POTUS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ups, mein fehler
hab nen test quelltext gepostet

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

Autor: Hans_Dampf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
POTUS schrieb:
> dann stimmt auch die warnmeldung wieder

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

Autor: POTUS (Gast)
Datum:

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

passiert aber leider immer noch nichts

Autor: laie (Gast)
Datum:

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

Autor: Hans_Dampf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier mal das:
//...

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

int main (void)
{
    ms=0;       
    sek=0;

    init_Timer0();
    sei();

    while(1)
    {
         // dein Programm
    }
}


ISR (TIMER0_COMPA_vect)
{
    ms++;          // increment ms

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

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

Autor: POTUS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.