Ich glaube es eher nicht.
Zeitkritische Dinge sind immer mit Takte abzählen verbunden und soetwas geht nunmal am besten in Assembler.
Ich glaube es eher nicht.
Zeitkritische Dinge sind immer mit Takte abzählen verbunden und soetwas geht nunmal am besten in Assembler.
Ich sehe da in Bascom keine großen Probleme, da man nicht unbedingt Takte zählen muss.
Die 6666us, 3333us und 833 us lassen sich einfach mit dem Clear Timer on Compare Match (CTC) Mode realisieren.
Ersteinmal solltest Du Dich von den 8Mhz trennen. Man nehme einen 14.7456MHz-Quarz (Standardfrequenz für RS232) und
setze den 16-Bit Timer in den CTC-Mode mit dem prescaler factor =64.
Ensprechend dem Wert im Register OCR1A wird jetzt regelmäßig ein Interrupt ausgelöst:
OCRR1A= 191 -> 833,333 us
OCRR1A= 767 -> 3333,333 us
OCRR1A= 1535 -> 6666,6 us
Man kann das auch mit dem Port OC1A verknüpfen (toggle).
Die 12µs lassen sich mit dem 14.7456MHz-Quarz nicht exakt relisieren...
der Interrupt soll nur einmal ausgegeben werden.
wie starte ich den Interrupt, damit er einmal z.b. 833us startet und dann wieder ruht, bis zum nächsten starten.
Sag mal, was in/nach den 833µs passieren soll und wie genau Du die 833µs einhalten musst.
Das ist entscheidend für den Ansatz, 833µs in Atmega-Hardware oder Software zu realisieren. In Hardware lässt sich Taktgenau einfacher umsetzen... Z.B. einen Port für _exakt_ 833µs auf High zu setzen.
Welchen Atmega verwendest Du?
DAher ist der Grundansatz mit den 14,7456MHz nicht das nonplusultra.Zitat von -tomas-
Praktisch kann er nämlich sehr wohl bei seinen 8 MHz bleiben.
In Takten (oder Zählschritten):
12µs = 96
833µs = 3332
3333µs = 26664
6666µs = 53328
Das sind alles Werte, die man mit dem Timer 1 ohne Prescaler erreichen kann.
Im übrigen, würde ich mir bei so einer Aufgabenstellung mal Gedanken über den kleinsten gemeinsamen Nenner dieser Zeiten machen.
Grüße,
da Hanni.
@Hanni
Du hast Recht, bei 8Mhz gibt es noch keinen Überlauf im Timer 1
-also geht CTC bei 8Mhz ohne prescaler
Mal sehen was robby-fant schalten will...
833us lang ein Ir-Signal von 36khz erzeugen
6666us lang ein Ir-Signal von 36khz erzeugen
3333us wartezeit
12us wartezeit
Na dann lass es uns gleich richtig machen - dazu ein paar Fragen:
1. Was ist der Auslöser oder ist es eine Endlosschleife?
2. Ist das die richtige Reihenfolge bzw. was sollen diese 12µs Wartezeit (=96Takte@8MHz) bedeuten bei einem 36Khz-Signal (=27µs Periode)?
3. Welchen Atmega verwendest Du?
Code:Do 833us lang ein Ir-Signal von 36khz erzeugen 6666us lang ein Ir-Signal von 36khz erzeugen 3333us wartezeit 12us wartezeit Loop
Code:Ir_code_6666us For I = 0 To 7 If Wert.7 = 0 Then Wait 833us Ir_code_833us Else Wait 3333us Ir_code_833us End If Rotate Wert , Left , 1 Next
Lesezeichen