-
Ist Dir der Timer 1 nicht zu schade für sowas ? Hast Du Timer 2 noch frei ? wenn ja mach folgendes :
Im Register TCCR2 folgende Bits setzen: CS21, WGM21,COM 20
Damit stellst Du den Prescaller auf 8,schaltest Du CTC Modus am Timer 2 ein und Toggelst Du OC2 Pin bei jedem Compare Match.
Im Register OCR2 schreibst Du 25 rein.
Wenn ich nichts vergessen habe, erzeugst Du am Pin OC2 40 kHz, ganz in Hardware ohne ein Takt für die Erzeugung zu verlieren ;-).
Ich hoffe, daß Du den OC2 noch frei hast ?
Gruß Sebastian
-
@Dirk
Const Timervorgabe = 65389
oder was meinst du? Wie bist du auf den Wert gekommen?
@izaseba
Es sind noch alle Timer frei.
Aber denk dran, der Timer soll nur für eine bestimmt zeit aktiviert sein, also brauch ich wohl 2 Timer oder ich muss was hochzählen.
Ist es sehr unverschämt wenn ich nach nem Codeschnipsel frage? #-o
-
So ich habs einfach mal versuch...
Code:
$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 10
$framesize = 40
Config Timer2 = Timer , Compare = Clear , Compare = Toggle , Prescale = 8
Ocr2 = 25
Do
Loop
Messe aber ca. 50µS..
Und hören tu ich ihn auch, aber die Reichweite hat sich deutlich erhöht =)
-
Kann mir den echt keiner helfen?
Die Formal müsste doch folgendermaßen lauten:
Output Compare = ( 16000 / 8 ) * 0,025ms = 50
Aber egal ob ich Ocr2 = 25 oder Ocr2 = 50 einstelle ich sehe keine Veränderung.
-
So hab grad nochmal was anderes probiert.
Hatte folgenden Text gefunden und für euch mal angepasst.
Bei 40 KHZ beträgt die Zykluszeit 1 / f = 1 / 40000 = 25µs. Bei einem 50% Duty-Cycle muß du das Signal 12,5 µs einschalten und 12,5 µs ausschalten.
Timer 0 kann sich bei 16 MHz alle 160 ns um eins erhöhen. Also in 12,5 µs ungefähr 200 mal.
Der Timer erzeugt beim erreichen von 255 auf 256 einen Overflow Interrupt. Wenn ich jetzt den Timermit 255 - 200 = 55 vorlade, erreichst ich alle 12,5 µs einen Interrupt..
Code:
$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 10
$framesize = 40
Config Timer2 = Timer , Prescale = 1
On Timer2 Tim0_isr
Enable Timer2
Enable Interrupts
Do
Loop
Tim0_isr:
Tcnt0 = 130
Toggle PORTB.1
Return
Und heraus kam dieses ca. 12µS Gebilde:
Bild hier
Allerding nur wenn ich keine Last am Pin hatte.
Hätte nicht gedachte das es so schwer ist ne Frequenz zu erzeugen.
-
Ich kann mir vorstellen, dass zur Lastansteuerung ein BS170 oder BS250 helfen würde.
Hattest du den US-Wandler direkt am Port-Pin angeklemmt?
-
Ja hab ich, aber das muss am AVR liegen, wenn ich über Compare Toggle geht es.
-
Vielleicht mal den Pin als Output definieren?!
-
Und Du bist Dir sicher, daß da 40 kHz rauskommt ?
Ich würde doch reine Hardware Lösung vorziehen, oder zumindest ohne Interrupt auszukommen!
Wenn es wirklich so ist, daß Basic alle Register + SREG bei ISR auf den Stack legt fehlen Dir ein paar Takte ;-)
Gruß Sebastian
-
Ja Bascom Sichert ne menge register in ner Interruprotiene. Laut Simulator Toggelt der PIN aller 259 Takte also aller 16,1875µs. Macht also nur 30,88kHz.