Forum: Mikrocontroller und Digitale Elektronik AVR - Uhrzeit aus 4MHz ableiten?


von Dirk Schlage (Gast)


Lesenswert?

Hallo.
Kann man bei 4MHz ähnlich einfach einen Sekunden-Interrupt ableiten, wie 
bei 4,096MHz. Beispielsweise mit einem AT90S4433 in Assembler?
ciao
   Dirk

von Florian Pfanner (Gast)


Lesenswert?

Benutze Timer1(16Bit): Vorteiler auf 256 stellen(nur der vorteiler 
ergibt gerade Sekunden!!!) Dann den Compare Match auf 15625 setzen. Dann 
bei compare Match Zähler löschen und Interrupt auslösen ==> jede sekunde 
wird ein Interrupt ausgelöst.
So gehts in groben Zügen. Für weiter hilfe solltest du deinen Code 
posten!

Gruß, Florian

von Dirk Schlage (Gast)


Lesenswert?

Danke nochmal für den Hinweis. Ich habe noch ein bisschen gesurft was 
ich mit welchen Registern machen muss, etwas gelesen und angepasst. Es 
funktioniert.
Tolles Gefühl, jetzt geht es weiter.

von Martin (Gast)


Lesenswert?

Hallo
Ich habe da auch mal eine Frage zu diesem komischen Compare-Register.
@Florian
Du hast den Compare Match auf 15625 gestellt. Das Zählregister beginnt 
aber bei 0 zum Zählen und nicht bei 1.
Sind das jetzt 15625-Schritte bis er überläuft oder 15626-Schritte?

Martin

von Martin (Gast)


Lesenswert?

Hallo!
Ich habe mal ein kleines Programm erstellt und dieses im AVR-Studio 
getestet.
Ich habe den 16-Bit Timer des 2313 auf folgende Weise initialisiert.
Taktteiler 8
Compare ein.
Ausgang wechseln
Compare-Register auf 3
Zählregister auf 0

Also man kann erkennen, wenn man 8mal auf Step into klickt, dass der 
Timer um eins vorwärts zählt.
Also von 0 auf 1.
Danach klickt man wieder 8mal weiter.
Der Timer springt auf 2.
Danach wieder 8mal.
Der Timer springt auf 3.
Danach wieder 8mal.
Der Timer springt auf 0 und der Ausgang wird beim nächsten Klick 
gewechselt.

Dies bedeutet, dass der Timer erst nach 4Zyklen *8(Teiler) wieder auf 0 
landet und nicht bei 3.

@Florian
Aus diesem Grund musst du anscheinend das Register auf 15624 
initialisieren, damit du 15625 Schritte erhältst.

Korrigiert mich bitte, wenn ich mich irre.

Martin

PS:
Das Programm

Chip type           : AT90S2313
Clock frequency     : 10,000000 MHz
Memory model        : Tiny
External SRAM size  : 0
Data Stack size     : 32
*********************************************/

#include <90s2313.h>

// Declare your global variables here

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

// Input/Output Ports initialization
// Port B initialization
// Func0=In Func1=In Func2=In Func3=Out Func4=In Func5=In Func6=In 
Func7=In
// State0=T State1=T State2=T State3=0 State4=T State5=T State6=T 
State7=T
PORTB=0x00;
DDRB=0x08;

// Port D initialization
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In
// State0=T State1=T State2=T State3=T State4=T State5=T State6=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1250,000 kHz
// Mode: CTC top=OCR1A
// OC1 output: Toggle
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x40;
TCCR1B=0x0A;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1H=0x00;
OCR1L=0x03;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
GIMSK=0x00;
MCUCR=0x00;

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

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
// Analog Comparator Output: Off
ACSR=0x80;

while (1)
      {
      // Place your code here
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
            #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
            #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
            #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
            #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
            #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
            #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");
      #asm("NOP");


      };
}

von Florian Pfanner (Gast)


Lesenswert?

Das mag schon sein - habe mich noch nicht darüber gedanken gemacht, denn 
ich brauchte nur einen annähernd genauen Sekundentakt. (Keine Uhr)

Trotzdem Danke für den Hinweis!

Gruß, Florian

von Florian Pfanner (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

habs gerade ausprobiert - stimmt schon, Compare Match muss auf 15624 
gesetzt werden.

Wenn ich den angehängten Code im AVR Studio laufen lasse, so wird die 
Interrupt-Routiene exakt alle 4000000 taktzyklen ausgeführt, also bei 
4Mhz jede Sekunde!

Danke für die Info, Florian

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.