PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 33Khz mit 2313 PWM und Bascom



tobimc
01.11.2004, 16:57
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

01.11.2004, 17:50
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.

tobimc
01.11.2004, 18:25
TimerX = XYZ 'halbe Periode


Hä? Muss ich nicht den Timer auf PWM setzen?
Was heißt XYZ?

02.11.2004, 19:13
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)

02.11.2004, 19:36
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

02.11.2004, 20:22
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

02.11.2004, 20:42
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

tobimc
02.11.2004, 20:46
...das war dann wohl ich...

02.11.2004, 20:48
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

tobimc
02.11.2004, 21:19
Hi

Achso!

Vielen vielen Dank, das hat mir wirklich richtig weitergeholfen!
:D

Viele liebe Grüße,
Tobi

Michael
02.11.2004, 21:40
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

tobimc
02.11.2004, 22:03
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