Forum: Mikrocontroller und Digitale Elektronik Problem mit PWM (bei Attiny 2313)


von Sausi (Gast)


Lesenswert?

Hallo erstmal
Also zu meinem Problem I ich hab ein C programm für eine Uhr mit meinen 
attiny 2313 geschrieben die formel ist doch
(4194304/256)/256 = 64 mal = 1sec
warum muss ich aber (4194304/256)/(256 * 8 ) = 16 mal = 1sec

/*
 * LED_Display.c
 *
 * Created: 31.08.2012 18:47:22
 *  Author: Sausy
 */


#define XTAL 4194304
#define F_CPU XTAL

#define HIGH  1
#define LOW    0

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "LED_Disp.h"

volatile int tc;  // seconds counter
int overflow_c = 0;

ISR(TIMER0_OVF_vect)  // 1 second clock
{  if(overflow_c < 16)      //prescala = 256   max.vec = 256
       overflow_c++;       //(4194304/256)/256 = 64 mal = 1sec

  if(overflow_c >= 16){    //für sec++
    overflow_c = 0;
    PORTB ^= (1<<PB1);     //für DP togl
    tc++;
  }

  if(overflow_c == 8)
    PORTB ^= (1<<PB1);     //für DP togl
}


int main(void)
{  int  hr=9, min=0, sec=0;   //set start time
  inite_LED_D();              //inizalisiert LED display

  DDRB &= ~(1<<PB0);
  PORTB &= ~(1<<PB0);
  DDRB |= (1<<PB1);


  //----[ initialize timer1 ]---
  TIMSK |= _BV(TOIE0);   // erlaubt overflow interupt --
                        //aktiviert den overflow interrupt des timer1
  TCCR0B |= (1<<CS02);  // prescaler = 256
  TCNT0 = 0x00;
  sei();

  while(1)
  {
    number_output (hr*100+min); // setz die Variablen
                                // für meinen Led display
    {  sec=tc;
      if (sec>=60)
      {  tc=0; sec=0; min++;
        if (min>=60)
        {  min=0; hr++;
          if (hr>=12) hr=0;
        }
      }
    }
    while (sec==tc)  refresh(); //refrescht das bild
  }
  return(0);
}

von Stefan F. (sfrings)


Lesenswert?

Frequenz von tc = 4194304 Hz /256/256/64 = 1 Hz

Den Pin PB1 toggelst Du immer, wenn der overflow_c den Wert 8 und 16 
hat, die Blinkfrequenz ist daher ebenfalls 1 Hz (1/8 Sekunde an, dann 18 
Sekunde aus). Soweit der Soll-Zustand.

Deiner anderen Formel kann ich nicht folgen, zumal sie auch nicht mit 
dem von Dir geposteten Quelltext überein stimmt. Dein Quelltext teil den 
Takt durch 16 anstatt 64. Die Uhr müsste demnach mit 4Hz getaktet 
werden.

Erhälst Du andere Zeiten? Dann schau Dir die FUSES an. Sind die 
Kondensatoren am Quartz richtig bemessen (ca 22pF)?

Mit PWM hat das übrigens nichts zu tun.

von Sausi (Gast)


Lesenswert?

ok dann thx für deine schnell antwort
zu der formel

//(4194304/256)/256 = 64 mal = 1sec
habe ich mir gedacht wäre die eigentliche taktung teilung
dies war die eigentliche von mirberächnete teilung ich

aber als ich diesen wert verwändet habe war die uhr bis auf auf +3min 
ungenau
und durch das absetzen hab ich dann dann eine ungenauigkeit von +3sec 
erreicht. Und mir ist nicht klar warum das so ist denn wie du schon 
sagst müsste das quarz dann aners dimensioniert werden.

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.