Forum: Projekte & Code Zeittakt


von Thomas Müller (Gast)


Lesenswert?

Hi Leute,
ich mache gerade eine C-Programmierung und möchte eine Zeitbasis
von einer Sekunde und wollte fragen wie ihr das macht.
Ich habe einen 4Mhz-Quarz und müßte nach Adam Riese das Ganze in 2
Schleifen a 2000-Zählungen hinbekommen.
In der Simulation macht meine Zeit allerdings Zicken.

Thomas

von emil (Gast)


Lesenswert?

16 bit timer mit 256 prescaler nehmen, das macht dann 4000000/256=15625;
timer auf interrupt on compare match einstellen und mit 15625 aufladen,
fertig ist der einterrupt jede 1 sec.

von Thomas Müller (Gast)


Lesenswert?

Hossa,
erstmal vielen Dank für die schnelle Antwort.
Ich muß zu meiner Schande gestehen,daß ich zwar schon öfter in
C-Programmiert habe aber noch nie so tief ins Detail des AVR gegangen
bin.
Hört sich aber gut an.Die nächsten Tage sind gerettet :-))

Thomas

von emil (Gast)


Lesenswert?

hi,

dies wäre nur 1 von tausend möglichkeiten, dafür aber leicht zu
begreifen und exakt; hier ein code-beispiel für atmega8 mit 4mhz in
codevision:



#include <mega8.h>

// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{

TCNT1H=0x00;
TCNT1L=0x00;
// Place your code here

}

// Declare your global variables here

void main(void)
{
// Declare your local variables here



// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 15,625 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x04;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x3D;
OCR1AL=0x09;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;


// Global enable interrupts
#asm("sei")

while (1)
      {
      // Place your code here

      };
}

von rico (Gast)


Lesenswert?

hi emil,

fehlt da nicht noch ein Halt am ende der whileschleife???
sonst würde doch ständig der code in der whileschleife abgearbeitet...
oder noch ne whileschleife in der du eine Variable abfragst die im
timerinterrupt gesetzt/löscht wird

(P.S.: würde mich auch mal interresieren wie die Haltbefehle
funktionieren ;o))

bye Rico

von emil (Gast)


Lesenswert?

hi,

als erstes: das so angeführte beispiel ist natürlich relativ sinnlos;
es würde zwar funktionieren und jede sekunde ein interrupt erzeugen,
aber mehr nichts

und zweitens: es gibt eine paar sehr gute anleitungungen hier unter
"artikel" und "avr-tutorial", die sich auf c-programmierung für
atmels beziehen, die sind sehr empfehlenswert und ähnliche fragen
werden dort ausführlich behandelt

von OldBug (Gast)


Lesenswert?

Drittens: das hier ist die Codesammlung !
Soll heissen: hier sollen Codefragmente oder ganze Programme
veröffentlicht werden.

Alle anderen Foren sind zum Fragen da ;)

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.