www.mikrocontroller.net

Forum: Compiler & IDEs Problem mit ATtiny2313 Timer0 compare


Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe folgenden Code geschrieben:
#include <avr/io.h>
#include <inttypes.h>
#ifndef F_CPU
#define F_CPU 4000000UL
#endif
#include <util/delay.h>
#include <stdint.h>
#include <avr/interrupt.h>
#include <stdlib.h>

volatile uint16_t count;
volatile uint16_t sec;

int main()
{
  DDRB=0b11111011;
  PORTB=0b11111011;  //LEDs aus

  count=0;
  sec=0;

  while(1)
  {
    if((PINB & 0b00100000) == 0)
    {
      sei();  //Gobale Interrupts erlauben

      TCCR0B |= (1<<CS01);  //CPU/64
      TCCR0B |= (1<<CS00);  //auch... :-)

      TCCR0A |= (1<<WGM01);  //CTC

      OCR0A = 100;  //Setze Compare-register auf 100

      TIMSK |= (1<<OCIE0A);  //aktivire compare-interrupt

      PORTB=0x00;

      while(1)
      {
        if(sec==60)
        PORTB |= (1<<PB3);

        if(sec==120)
        PORTB |= (1<<PB4);

        if(sec==180)
        {
          while(1)
          {
            PORTB |= (1<<PB2);
            _delay_ms(1.5);
            PORTB &= ~(1<<PB2);
            _delay_ms(1.5);
          }
        }
      }
    }

  }

  return 0;
}

ISR (TIMER0_COMPA_vect)
{
  count++;

  if(count==625);
  {
    count=0;
    sec++;
  }
}

das ganze soll nach einer Minute eine LED ausschalten (PB3), dann 
nochmals eine Minute später eine weiter ausschalten(PB4). Wiederrum eine 
Minute später wird die 3. LED ausgeschaltet.

Das funktioniert auch soweit, nur dass die Zeit nicht stimmt.... 
1min=1sec??? (circa) warum? -  was mache ich falsch???

Ich benute den internen 4MHZ RC.

Doran

PS: Nutze AVR-Studio und den ATtiny2313

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
  if(count==625);

schau mal ganz scharf ans Ende dieser Zeile in der ISR :-)

Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ok, danke, dass ist mir ganrnicht aufgefallen........
Allerdings läuft das jetzt ewig(Zeit viel zu lang....)
wo ist da noch ein Fehler????

mfg

Doran

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
  DDRB=0b11111011;
  PORTB=0b11111011;  //LEDs aus

  count=0;
  sec=0;

  while(1)
  {
    if((PINB & 0b00100000) == 0)

Du fragst PB5 ab, ob der entsprechende Input Pin auf 0 liegt. Du 
konfigurierst PB5 aber nie auf Input.

Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ok, danke, die Funktion mit dem Taster hat aber trotzdem 
funktioniert....
Habs jetzt aber natürlich korregiert.
Doch die Zeit ist immernoch viel zu lang, ich habe das jetzt schon ewig 
an und die LEDs gehen nicht aus....... :-(

weiß jemand Rat?

Doran

Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

echt?

Ich dachte:

4000000HZ/64=62500

62500/100=625

oder stimmt da was nicht?

Habe jetzt die CKLDIV8 Fuse "unprogrammed" gemacht, jetzt stimmt die 
Zeit.
Was genau ist denn eigentlich die Funktion dieser Fuse?

mfg

Doran

PS: Oder stimmt meine Zeit jetzt nicht ganz genau?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bau dir Code rein, an dem du erkennen kannst, ob der Tastendruck auch 
wirklich angenommen wird.

Laut Simulator sollte das Timing stimmen.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Doran S. schrieb:

> 4000000HZ/64=62500
>
> 62500/100=625
>
> oder stimmt da was nicht?

Habe meinen Einwand zurückgezogen. Habe mich im Simulator vertan.

> Habe jetzt die CKLDIV8 Fuse "unprogrammed" gemacht, jetzt stimmt die
> Zeit.
> Was genau ist denn eigentlich die Funktion dieser Fuse?

Datenblatt!

CLKDIV8

   CLK   wie Clock
   DIV   wie Divide
   8     wie Acht

In Summe: Teile die Clock Frequenz durch 8

Dein µC lief nicht mit 4 Mhz, sondern mit 4/8 -> 0.5Mhz

Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ok, dann passt jetzt alles.... freu :-)

Vielen Dank für die Hilfe!

mfg

Doran

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.