loetstelle.net
Lötstelle Userforum
 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Wie bekommt man einen Millisekundentakt mit Timer1 hin ?

 
Neues Thema eröffnen   Neue Antwort erstellen    loetstelle.net Foren-Übersicht -> BASCOM
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
derFotograf



Anmeldungsdatum: 06.10.2007
Beiträge: 185
Wohnort: Dresden

BeitragVerfasst am: Di 10.Jan 2012 17:45:19    Titel: Wie bekommt man einen Millisekundentakt mit Timer1 hin ? Bauteile finden Antworten mit Zitat

Hi@All.

Ich bin gerade dabei, mich nähergehend mit den Timern und der Soundgenerierung durch diese zu beschäftigen. Damit das auch Sinn macht, wollte ich direkt mal ein kleines Projekt starten und was liegt für mich als Musiker näher als ein Metronom ? Sollte nicht so schwer sein, dachte ich mir und schnappte mir mein Steckbrett und baute mal schnell eine Grundschaltung mit einem Atmega16 und einem 16MHz Quarz auf. Doch so einfach war es dann leider doch nicht.

Die Idee war, zuerst ein Programm zu schreiben, das (auf Timer1 basierend) jede Millisekunde einen Interupt auslöst und in der Unterprozedur dann eine Variable hochzählt. Wenn die Variable 0 ist, dann wird eine an den MC angeschlossene LED an- und bei 100 wieder ausgeschalten. Bei 1000 Durchläufen, wird die Variable wieder auf Null und der Timer auf seinen Ausgangswert zurückgesetzt und das ganze beginnt von vorn. Im Prinzip also ein kleines Blinklicht.

Soweit funktioniert das auch, aber die von mir errechnete Timer-Initialisierungszahl scheint nicht ganz zu stimmen. Ich habe ein echtes Metronom nebenbei laufen lassen und gemerkt, daß meine Schaltung hinterherhinkt.
Hier mal eine Erklärung zu meiner Berechnung:

Quarz = 16 000 000 Hz (16MHz)
Timer = 1 (also 65535)
Prescaler = 64

1. Ich teilte die Hertzzahl durch den Prescaler.
16000000 : 64 = 250000
So weiß ich, daß der MC 250000 Interrupts pro Sekunde auslöst.

2. Dann teilte ich dieses Ergebnis durch 1000, da ich ja mit Millisekunden rechnen wollte.
250000 : 1000 = 250 -> Also 250 Überläufe pro Millisekunde.

3. Daraus folgt, daß man den Timer mit 65285 (65535-250) initialisieren muss, was ich in meinem jetzigen Programm auch mache.


Wenn ich nicht total daneben liege, müsste meine Rechnung richtig sein, aber dennoch hängt meine Schaltung nach. Ich gehe davon aus, daß das was damit zu tun hat, daß die Abarbeitung der Überlaufroutine auch Zeit kostet. Nur wie kann man diese benötigte Zeit berechnen ?
Natürlich könnte ich auch mit meiner Timervariable rumprobieren, aber das wäre ja dann nur experimentell und nicht so hundertprozentig genau wie ein Metronom.
Gibt es denn eine Möglichkeit den exakten Initialisierungswert zu berechnen, oder muss man da wirklich 'frei Schnauze' arbeiten ?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
loetadmin
Site Admin


Anmeldungsdatum: 31.12.2004
Beiträge: 1022

BeitragVerfasst am: Di 10.Jan 2012 19:08:00    Titel: Bauteile finden Antworten mit Zitat

Genaue Frequenzen kann man z.B mit dem CTC-Modus erzeugen.

Bei 16 MHz:
Mit Prescaler 64 ergibt sich eine Timer-Frequenz von 250000 Hz

Das heisst, der Zähler wird mit dieser Frequenz angesteuert. Um nun alle 1ms einen Interrupt auszulösen, muss der Timer so konfiguriert werden, dass er genau 250 Takte (von den 250000 Hz) zählt.

Hierfür programmiert man den Zähler so, dass er nur von 0 bis 249 zählt.

Das geht mit dem CTC-Modus, hier reicht sogar ein 8 Bit Zähler dafür aus.

Also das entsprechende Output Compare Register mit 249 füllen und den CTC Modus sowie den Output Compare Interrupt aktivieren.

Somit zählt der Timer permanent von 0 bis 249 (exakt 1ms) und erzeugt alle 1 ms einen Interrupt.

Also nicht den Overflow Interrupt verwenden, sondern den Output Compare Interrupt!

In der Interruptroutine kann man dann gerne eine Variable hochzählen, um auf eine Sekunde zu kommen.

1ms Interrups sind allerdings schon recht viel, das braucht man üblicherweise nicht so schnell. Also vielleicht einen 16 Bit Zähler nehmen, Prescaler auf 256 und CTC mit Zählerstand 624, das ergibt 1/100s, auch noch schnell genug....


Wie das in Bascom genau geht, weiss ich nicht, ich bin mehr auf Assembler...


Zuletzt bearbeitet von loetadmin am Di 10.Jan 2012 19:18:35, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
derFotograf



Anmeldungsdatum: 06.10.2007
Beiträge: 185
Wohnort: Dresden

BeitragVerfasst am: Di 10.Jan 2012 19:15:33    Titel: Bauteile finden Antworten mit Zitat

Danke für die schnelle Antwort. Mit Compare hab ich mich bis jetzt noch nicht näher beschäftigt, da ich da irgendwie nicht durchsehe. Wenn ich das richtig verstanden habe, kann man damit doch nur einen bestimmten Pin togglen, oder !?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
loetadmin
Site Admin


Anmeldungsdatum: 31.12.2004
Beiträge: 1022

BeitragVerfasst am: Di 10.Jan 2012 19:24:38    Titel: Bauteile finden Antworten mit Zitat

Pin Toggeln kann man auch damit machen, aber man kann auch bei Erreichen des voreingestellten Zählerstandes ('Output Compare Register') automatisch den Zähler wieder zurücksetzen und einen Interrupt auslösen.
(CTC-Modus)
Durch geschickte Wahl von Prescaler und OCR-Register lassen sich so verschiedenste Frequenzen erzeugen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
loetadmin
Site Admin


Anmeldungsdatum: 31.12.2004
Beiträge: 1022

BeitragVerfasst am: Di 10.Jan 2012 19:31:06    Titel: Bauteile finden Antworten mit Zitat

Hier mal die Initialisierung des CTC-Modus für 1ms in Assembler, für den 8 Bit Timer 0

//Output Compare auf 249 =250 Zyklen
ldi temp1,249
out OCR0,temp1

//clear on Compare Match aktivieren, Timer starten
ldi temp1,0b00001011
out tccr0,temp1

//Output Compare Interrupt aktivieren
ldi temp1,(1<<OCIE0)
out timsk,temp1
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
derFotograf



Anmeldungsdatum: 06.10.2007
Beiträge: 185
Wohnort: Dresden

BeitragVerfasst am: Di 10.Jan 2012 23:22:22    Titel: Bauteile finden Antworten mit Zitat

Also ich hab die letzten Stunden damit verbracht, etwas über Compare in Erfahrung zu bringen. Seltsamerweise habe ich kein wirkliches Tutorial gefunden.
Soweit ich das verstanden habe, kann man einen Timer so konfigurieren, daß er bei einem Überlauf den Compare-Pin (OC1A/OC1B) automatisch togglet. Aber wie soll mich das weiterbringen ? Ich will ja keinen Pin togglen, sondern bei einem Überlauf eine Variable hochzählen. Aber ich glaube ich versteh das irgendwie falsch. Rolling Eyes
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
loetadmin
Site Admin


Anmeldungsdatum: 31.12.2004
Beiträge: 1022

BeitragVerfasst am: Mi 11.Jan 2012 08:33:07    Titel: Bauteile finden Antworten mit Zitat

Wie gesagt,kenn mich nicht mit Bacom aus.

Aber hier

http://www.windred.dk/avr/timer-pwm-counter/default.htm

gibt es eine Initialisierungs-Beispiel für den CTC Modus, das dürfte ziemlich genau das sein, was Du brauchst...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
derFotograf



Anmeldungsdatum: 06.10.2007
Beiträge: 185
Wohnort: Dresden

BeitragVerfasst am: Fr 13.Jan 2012 03:29:35    Titel: Bauteile finden Antworten mit Zitat

Also ich krieg das einfach nicht hin. Sad

Ich habe eine LED am Pin D5 und ein LCD-Display am Port A und bekomme es hin, daß die LED blinkt und die Sekundenvariable hochzählt und auf dem Display ausgegeben wird, bloß eben leider nicht im Sekundentakt.

[Edit]
Ich glaube ich hab das jetzt hingekriegt (Muss noch langzeittesten).
Ich habe einen Prescaler von 256 genommen und den Compare1A auf einen Wert von 62500 gesetzt. Müsste doch jetzt eigentlich genau der Sekundentakt sein, oder !?


Noch was:
Gerold hat in seinem Bascom-Kurs erwähnt, daß man einen ganzen Port binär steuern kann und auch daß man ein paar Pins ändern kann, ohne die Zustände der anderen zu kennen. Er erklärt allerdings nicht wie und in der Bascom-Hilfe habe ich dazu nichts gefunden. Weiß das zufällig jemand ?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
BellaD



Anmeldungsdatum: 03.12.2006
Beiträge: 1708
Wohnort: Klinik der misshandelten Kuscheltiere

BeitragVerfasst am: Fr 13.Jan 2012 16:21:18    Titel: Bauteile finden Antworten mit Zitat

moin

du liest den Port ein
oderst den neuen Wert zu dem eingelesenen
und schreibst den neuen Wert wieder in den Port

" binaerarithmetik "

or,and,exor usw.....

ora = bits werden gesetzt
and = bits werden zurückgesetzt
eor = bits werden invertiert

mfg

_________________
Eine Weiterverbreitung ohne ausdrückliche Genehmigung ist untersagt. Für Schäden, lehnen wir jegliche Haftung ab.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
derFotograf



Anmeldungsdatum: 06.10.2007
Beiträge: 185
Wohnort: Dresden

BeitragVerfasst am: Fr 13.Jan 2012 20:51:00    Titel: Bauteile finden Antworten mit Zitat

Geht das tatsächlich nur so ? Also diese Möglichkeit ist mir auch bekannt, aber ich dachte es geht auch sowas wie 'PortA = &B110xx0x1', wobei die 'x' die nicht zu togglenen Pins widerspiegeln. Also das in diesem Falle die Pins 0,2,5,6 und 7 gesetzt werden und die anderen so bleiben wie sie sind.


Ich habe mittlerweile einen Langzeittest mit dem Timer gemacht und gemerkt das es trotzdem nicht parallel zum Metronom läuft. Keine Ahnung wieso, aber es gibt da immernoch Abweichungen. Sad
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
BellaD



Anmeldungsdatum: 03.12.2006
Beiträge: 1708
Wohnort: Klinik der misshandelten Kuscheltiere

BeitragVerfasst am: Sa 14.Jan 2012 18:31:24    Titel: Bauteile finden Antworten mit Zitat

moin



http://www.mikrocontroller.net/articles/AVR_-_Die_genaue_Sekunde_/_RTC
http://www.mikrocontroller.net/topic/165249

mfg

_________________
Eine Weiterverbreitung ohne ausdrückliche Genehmigung ist untersagt. Für Schäden, lehnen wir jegliche Haftung ab.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Anzeige






Verfasst am: Heute 11:30:03    Titel: Bauteile finden

Nach oben
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    loetstelle.net Foren-Übersicht -> BASCOM Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum nicht herunterladen


Powered by phpBB 2.x © 2001, 2002 phpBB Group

Sie sind Besucher Nr. 1199368
©opyright by Markus Vohburger 2005 All Rights reserved