www.mikrocontroller.net

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


Autor: Dirk Schlage (Gast)
Datum:

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

Autor: Florian Pfanner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dirk Schlage (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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");


      };
}

Autor: Florian Pfanner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Florian Pfanner (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

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.