Forum: Mikrocontroller und Digitale Elektronik ATTINY 13 CTC Modus


von V. S. (Firma: Kolleg) (butaluk)


Lesenswert?

Hallo,
ich möchte bei den ATTINY 13 den CTC Modus  nutzen aber ich krieg’s 
nicht zum Laufen.
Mit Hilfe des Datenblattes habe ich es folgendes eingestellt:

#include <avr/interrupt.h>

ISR (TIM0_COMPA_vect)
{
  ms++;
}

TCCR0A = (1<<WGM01);
TCCR0B = (1 << CS02) | (0 << CS01) | (1 << CS00); // Teiler c1K/1024
OCR0A = 100;
TIMSK0 = (1 << OCIE0A);
TCNT0 = 0x00;
sei();

Mit der ms Variable schalte ich zum Testen einen Ausgang An und Aus

Aber so wie es aussieht wird der Interrupt gar nicht ausgeführt.
Kann mir bitte einer helfen?
Danke im Voraus.

von Uwe K. (ukhl)


Lesenswert?

Eigentlich sieht es ganz gut aus. Ich vermisse aber die Main-Routine. 
Dürfen wir das komplette Coding sehen?

von OhNe (Gast)


Lesenswert?

Uwe K. schrieb:
> Dürfen wir das komplette Coding sehen?

Auf gar keinen Fall. Man könnte sonst zu schnell auf das Problem stoßen.

von V. S. (Firma: Kolleg) (butaluk)


Lesenswert?

Bitte.


#define LED_AN (PORTB |=_BV(PB1))
#define LED_AUS (PORTB &=~_BV(PB1))

#include <avr/io.h>
#include <avr/interrupt.h>

unsigned char ms=0;

ISR (TIM0_COMPA_vect)
{
  ms++;
}

int main(void)
{
  DDRB = 0b00000011;// PB1 und 2 als Ausgänge Rest als Eingänge.
  PORTB = 0b00100000;// PB5 (Reset) PullUp Widerstand zuschalten.

  //********Timer****

  TCCR0A = (1<<WGM01);
  TCCR0B = (1 << CS02) | (0 << CS01) | (1 << CS00); // Teiler c1K/1024
  OCR0A = 100;
  TIMSK0 = (1 << OCIE0A);
  TCNT0 = 0x00;
  sei();

    while(1)
    {

//BLINKEN

       if (ms==30)LED_AN;
  if (ms==60)
     {
       LED_AUS;
       ms=0;
     }
    }
}

von Uwe K. (ukhl)


Lesenswert?

V. S. schrieb:
> Bitte.

Danke.


>        if (ms==30)LED_AN;
>   if (ms==60)

Versuche es mal mit:

       if (ms>=30)LED_AN;
  if (ms>=60)


So eine Millisekunde dauert nur eine Millisekunde...

von OhNe (Gast)


Lesenswert?

V. S. schrieb:
>   DDRB = 0b00000011;// PB1 und 2 als Ausgänge Rest als Eingänge.

Ist PB0 und PB1. Nicht das die LED an PB0 hängt?

von Uwe K. (ukhl)


Lesenswert?

Ja, da ist noch mehr im argen.

V. S. schrieb:

>   unsigned char ms=0;

Besser ist:
uint8 ms=0;

>   DDRB = 0b00000011;// PB1 und 2 als Ausgänge Rest als Eingänge.

Das ist in der Tat PB0 und PB1. Man schreibt es besser so:
DDRB = (1<<PINB1) | (1<<PINB0);

>   PORTB = 0b00100000;// PB5 (Reset) PullUp Widerstand zuschalten.

Wenn das wirklich der Reset ist, also nicht umgefused, dann muss man 
schon einen echten Pullup ranhängen. Diese Anweisung macht keinen Sinn. 
Stört aber auch nicht.

Wo "_BV()" her kommt weis ich nicht. Ich schreibe immer:
(1<<PINB1)

Wo hängt die LED dran?

von Thomas E. (thomase)


Lesenswert?

Uwe K. schrieb:
> Besser ist:
> uint8 ms=0;

das ist genauso schlecht.

http://www.mikrocontroller.net/articles/FAQ#Was_hat_es_mit_volatile_auf_sich

mfg.

von V. S. (Firma: Kolleg) (butaluk)


Lesenswert?

OhNe schrieb:
>   DDRB = 0b00000011;// PB1 und 2 als Ausgänge Rest als Eingänge.
>
> Ist PB0 und PB1. Nicht das die LED an PB0 hängt?

Habe mich in den Kommentaren vertan. PB0 und 1 als Ausgänge.
Die LED ist am PB1.

> Versuche es mal mit:

>       if (ms>=30)LED_AN;
>  if (ms>=60)

Habe jetzt das Ausschalten der LED auskommentiert. Funktioniert trotz 
dem nicht.

von V. S. (Firma: Kolleg) (butaluk)


Lesenswert?

Hab gerade das Normale Interrupt ausprobiert.
Funktioniert.

#define LED_AN (PORTB |=_BV(PB1))
#define LED_AUS (PORTB &=~_BV(PB1))

#include <avr/io.h>
#include <avr/interrupt.h>

unsigned char ms=0;

ISR (TIM0_OVF_vect)
{
  ms++;
}

int main(void)
{
  DDRB = 0b00000011;// PB0 und 1 als Ausgänge Rest als Eingänge.
  PORTB = 0b00100000;// PB5 (Reset) PullUp Widerstand zuschalten.

  //********Timer****


  TCCR0B = (1 << CS02) | (0 << CS01) | (1 << CS00); // Teiler c1K/1024
  TIMSK0 = (1 <<TOIE0);
  TCNT0 = 0x00;
  sei();

    while(1)
    {


       if (ms==30)LED_AN;

    }
}

von OhNe (Gast)


Lesenswert?


von Uwe K. (ukhl)


Lesenswert?

V. S. schrieb:

> #define LED_AN (PORTB |=_BV(PB1))
> #define LED_AUS (PORTB &=~_BV(PB1))

Diese "_BV" verstehe ich nicht. Versuche bitte:

 #define LED_AN  PORTB |= (1<<PINB1)
 #define LED_AUS PORTB &= ~(1<<PINB1)

von V. S. (Firma: Kolleg) (butaluk)


Lesenswert?

Uwe K. schrieb:

> Diese "_BV" verstehe ich nicht. Versuche bitte:


Das Funktioniert.

von Uwe K. (ukhl)


Angehängte Dateien:

Lesenswert?

Schluß mit dem Blindflug:

Ich habe dein original Coding in meinen Pollin-Würfel gepumpt.

LÄUFT.

Studio 6.2. Ich habe dir mal ELF und HEX drangehängt. Mein 13er läuft 
mit 1,2 MHz.

von V. S. (Firma: Kolleg) (butaluk)


Lesenswert?

Uwe K. schrieb:
> Ich habe dein original Coding in meinen Pollin-Würfel gepumpt.

Und du hast nichts verändert?

von Uwe K. (ukhl)


Lesenswert?

V. S. schrieb:
> Uwe K. schrieb:
>> Ich habe dein original Coding in meinen Pollin-Würfel gepumpt.
>
> Und du hast nichts verändert?

So ist es. Ich habe alles von dir übernommen, und bewust nichts 
verändert.
LÄUFT. 3 Sekunden AN, 3 Sekunden AUS. Alles Super. Versuche mal die 
HEX-Datei. Es ist dein Programm.

von V. S. (Firma: Kolleg) (butaluk)


Lesenswert?

OK
DANKE!!!

Versuche ich morgen.

von Martin (Gast)


Lesenswert?

versuch mal "volatile uint8_t ms;"

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.