Forum: Mikrocontroller und Digitale Elektronik Interupt ATtiny 25-20 PU


von Eduard (Gast)


Lesenswert?

Hallo,

ich versuche einen Interupt zu Starten.
Kann mir jemand dabei helfen?

#include <avr/io.h>
#include <stdint.h>
#include <util/delay.h>
#include <avr/wdt.h>
#include <avr/interrupt.h>
#include <avr/iotn25.h>

  int8_t Takt;

int Schreibe (int8_t Takt, int8_t Fehler1, int8_t Fehler2)
{
      PORTB = (Takt << PB0) | (Fehler1 << PB3) | (Fehler2 << PB4);
}


ISR(TIMER0_OVF_vect)
  {
    if (Takt==1)
    {
      Takt=0;
    }
    else
    {
      Takt=1;
    }
  }

int main(void)
{
    sei();
  wdt_enable (WDTO_2S);

  int8_t Fehler1;
  int8_t Fehler2;
  int8_t Schalter1;
  int8_t Schalter2;
  int8_t Ausgang1;
  int8_t Ausgang2;

  DDRB= (1 << DDB0) | (0 << DDB1) | (0 << DDB2) | (1 << DDB3) | (1 << 
DDB4) | (1 << DDB5);

Fehler1=0;
Fehler2=0;

    while(1)
    {



wdt_reset();
Ausgang1=1;
Ausgang2=1;
Schalter1=PINB1;
Schalter2=PINB2;
    Schreibe(Takt,Ausgang1,Ausgang2);
return 0;
}

ich möchte dabei den Takt für die Lichtschranken vorgeben etwa 10 
Hz(externe beschaltung).

von Timmo H. (masterfx)


Lesenswert?

Wie soll "ISR(TIMER0_OVF_vect)" ausgelöst werden wenn weder der Timer 
aktiv ist noch das entsprechende "Overflow Interrupt Enable" im TIMSK 
gesetzt ist??

von Martin K. (maart)


Lesenswert?

Spätestens beim return 0; in der while(1)-Schleife gibt es Probleme.

von Eduard (Gast)


Lesenswert?

Zu Return 0;
Ich habe ein paar Zeilen auskomentiert.
Return 0 mach dabei keine Probleme .

Ich bin ein Anfänger.
Wie kann ich den Timer und overflow aktivieren?
Bzw. Was muss in das Programm eingefügt werden um
Interrupt auszulösen.

Gruß Eduard

von Timmo H. (masterfx)


Lesenswert?

Steht im Datenblatt wie du den Timer aktivierst. Unter Timer steht auch 
das TIMSK Register beschrieben

von Dietrich L. (dietrichl)


Lesenswert?


von Thomas E. (thomase)


Lesenswert?

Eduard schrieb:
> Bzw. Was muss in das Programm eingefügt werden um
> Interrupt auszulösen.
Wie wäre es denn mit dem vollständigen Programm als Anhang?

mfg.

von Eduard (Gast)


Lesenswert?

Für TIMSK habe ich folgende Infos.
Adresse  0x39
Name TIMSK
Bit 7 -
Bit 6 OCIE1A
Bit 5 OCIE1B
Bit 4 OCIE0A
Bit 3 OCIE0B
Bit 2 TOIE1
Bit 1 TOIE0
Bit 0 -

Was kann ich mit diesen Infos anfangen?

PS. bei dem Programm fehlen nur ein paar Klammern am ende.

von Timmo H. (masterfx)


Lesenswert?

Junge, du sollst ins Datenblatt schauen. Wieso machst du das nicht? 
Kapitel 11.9 stehen die Register für Timer0 und deren Funktionen genau 
beschrieben

von Martin K. (maart)


Lesenswert?

Es gibt hier im Forum ein Tutorial, lies es mal durch.

von Timmo H. (masterfx)


Lesenswert?


von Thomas E. (thomase)


Lesenswert?

Eduard schrieb:
> Was kann ich mit diesen Infos anfangen?
Offenbar gar nichts.

Eduard schrieb:
> PS. bei dem Programm fehlen nur ein paar Klammern am ende.
Bei dem Programm fehlt die Initialisierung des Timers.
Bist du jetzt wirklich so naiv oder trollst du hier nur rum?
Sonst siehe vorigen Post(Timmo).

mfg.

von Eduard (Gast)


Lesenswert?

Sorry,

Ich programmiere in der Regel CodeSys, Step 7, und VBA.
C++ habe ich Grundkentnisse.
Das ist meine 1 Berührung mit Mikrocontroller.
Deswegen stelle ich Fragen die für andere selbstverständlich sind.

Bei mir geht es nur darum mit einem Takt PB0 zwei Gabellichtschranken
Anzusteuern und falls auf PIN1 bzw. PIN2 keine Rückmeldung kommt
Wird PB3 bzw. PB4 auf 1 geschaltet. Etwa so.
If (Takt==1 and Schalter1==0)
{
Fehler1=1;
}
Else
{
Fehler1=0;
}

von Timmo H. (masterfx)


Lesenswert?

Eduard schrieb:
> Sorry,
>
> Ich programmiere in der Regel CodeSys, Step 7, und VBA.
> C++ habe ich Grundkentnisse.
> Das ist meine 1 Berührung mit Mikrocontroller.
> Deswegen stelle ich Fragen die für andere selbstverständlich sind.
Und das hindert dich jetzt daran ein Datenblatt zu lesen bzw. Tutorials 
durchzulesen?
Was erwartest du von uns? Das wir dir jetzt den Code schreiben? Du hast 
es doch fast. Fehlt nur noch ein bisschen Eigeninitiative.

Kleiner tipp, du kannst auch in deiner "ISR(TIMER0_OVF_vect)" direkt den 
Takt auf einen Port geben (toggle)
1
ISR(TIMER0_OVF_vect){
2
  PORTB ^= (1<<PB0);
3
}
Musst vorher aber noch den Timer initialisieren. Aber das steht ja in 
den Tutorials und Datenblatt genau beschrieben

von Eduard (Gast)


Lesenswert?

Ok.

TCCR0B = (1 <<CS00) | (0<<CS01) | (1<<CS02); // Teiler 1024
TIMSK = (1<<TOIE0); // Interrupt bei Timer Overflow

So sollte der Timer Arbeiten.

von Thomas E. (thomase)


Lesenswert?

Eduard schrieb:
> So sollte der Timer Arbeiten.
Ist doch gar nicht so schwer.
Jetzt guckst du dir im Tutorial noch den CTC-Mode an. Dann wird's 
perfekt.
Und "Takt" als "volatile" deklarieren.

mfg.

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.