Archiv verlassen und diese Seite im Standarddesign anzeigen : 33Khz mit 2313 PWM und Bascom
HI
Ich wüsste gerne, ob man mit der PWM des AT90S2313
33Khz für einen TSOP (TSOP1733) generieren kann, und das Ganze möglichst noch unter BASCOM... :D Müsste halt 50% Duty-Cycle usw. sein.
Ich habe an den 2313 einen 10Mhz-Quarz angeschlossen.
scheint auch mit dem zu funktionieren. (Habe nichts an den Fuse-Bits geändert, weil AVR-Studio sagte, dass dieses Modell die Serielle-Fuse-Bit-Änderung nicht unterstütze. :-k :-& :-# )
:arrow: Frage: Ist das möglich, und wenn ja, hätte mir jemand einen Codefetzen?
Ich blick' nämlich in meinem BASCOM-Buch nur schwer durch. :-s
Wäre lieb, deshalb DANKE schonmal jetzt... :)
Liebe Grüße, Tobi
Wär' mit einem Timerinterrupt gut möglich.
TimerX_ISR:
TimerX = XYZ 'halbe Periode
Pinx.y = not Pinx.y
return
sind so meine ersten Gedanken wie ich die Frequenz generieren würde.
TimerX = XYZ 'halbe Periode
Hä? Muss ich nicht den Timer auf PWM setzen?
Was heißt XYZ?
Ich weiß ja nicht genau was Du brauchst.
Ein Taktverhältniss (wenn Du es nicht verändern willst) von 50% kriegste mit einem einzigen Timer hin.
XYZ ist der Wert auf den der Timer, nach dem er die Interruptroutine ausgelöst hat, jedes mal neu eingestellt wird weil er sonst bei 0 anfängt zu zählen. (deshalb brauchst Du nur den Zählerstand für eine halbe Periode nehmen)
Hi
achso.
Ich bräuchte einfach nur 33khz an einem Ausgang des 2313.
Also müsste XYZ = 3,03 sein??
Das ist also die ISR, der rest funzt wie in den Beispielen von BASCOM.?
Und was ist der Prescaler?
Welchen Wert muss er haben?
Danke soweit!
Tobi
Hallo
Bei 33 KHZ beträgt die Zykluszeit 1 / f = 1 / 33000 = 30,3 us. Bei einem 50% Duty-Cycle muß du das Signal 15,15 us einschalten und 15,15 us ausschalten.
Dein Timer 0 kann sich bei 10 MHz alle 100 ns um eins erhöhen. Also in 15,15 us ungefähr 151 mal.
Dein Timer erzeugt beim erreichen von 255 auf 256 einen Overflow Interrupt. Wenn du deinen Timer jetzt mit 255 - 151 = 104 vorlädst, erreichst du alle 15,15 us einen Interrupt..
Also
Config Timer0 = Timer , Prescale = 1
'Define the ISR handler
On Ovf0 Tim0_isr
Enable Timer0 ' enable the timer interrupt
Enable Interrupts 'allow interrupts to occur
Do
'your program goes here
Loop
'the following code is executed when the timer rolls over
Tim0_isr:
Tcnt0 = 104
Toggle PORTB.1
Return
Müsste so stimmen, habe ich aber nicht getestet.
MFG
Dieter
Hi
Ahsoo Jetzt blick' ich das.
Müsste es nicht
Config Timer0 = PWM, Prescale = 1
heißen?
Wieso muss man eigentlich, wenn man nur Timerinterrupts will
alle interrupts einschlaten?
Danke!!
Tobi
...das war dann wohl ich...
Hallo
Du willst keine PWM machen., sondern eine feste Frquenz erzeugen.
Bei PWM erzeugtst du eine feste Frequenz, deren Tastverhältnis du ändern kannst. Du erreichst aber keine 33 KHz damit, daher die Lösung wie oben.
Mit
Enable Timer0 ' damit erlaubst du den Timer0 Overflow Interrupt
Enable Interrupts ' Hiermit erlaubst du generell die Interrupts.
MFG
Dieter
Hi
Achso!
Vielen vielen Dank, das hat mir wirklich richtig weitergeholfen!
:D
Viele liebe Grüße,
Tobi
Hallo tobimc,
Es gibt noch eine andere Variante, die 33 kHz zu erzeugen: Der SOUND-Befehl.
Dieser Code erzeugt z.B. bei einem 10 MHz-Quarz ca. 33kHz mit einer 1kHz Modulation:
Do
Sound Portb.4 , 15 , 23
Sound Portb.5 , 15 , 23
Loop
Damit die Modulation 50% beträgt, wird derselbe Befehl auf einen anderen Port ausgegeben, der nicht benutzt wird.
Kein Timer, kein Interrupt, kein Stress ;)
Gruß, Michael
Hi Michael!
Klingt gut, allerdings bräuchte ich dann Multithreading.
Das mit dem anderen Port habe ich nicht ganz gecheckt... O:)
:D
Ich will damit so eine Art Active Radar machen.
Trozdem DANKE! An alle!
Viele ganz liebe Grüße,
Tobi
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.