Forum: Mikrocontroller und Digitale Elektronik PWM mit den AVRs.. oder Wie bringt man leicht eine Frequenz


von Gregi (Gast)


Lesenswert?

Hallo!

Ich möchte, zwecks einer RC5-ausgabe eine 36KHz-Frequenz an einen Pin 
bekommen, eigentlich müsste das doch mit dem PWM-Timer des 2313 
funktionieren, oder?
bei dem pwm-timer hab ich momentan nicht ganz den überblick.

ciao
gregi

p.s.: das ganze wird für ein PCAT=>RC5 interface, lies ich hänge eine 
standardtastatur an meinen prototypen an und kann dann minidiscs 
leichter "beschriften".

von Meiserl (Gast)


Lesenswert?

hmmmm würds mit einem Timer machen (nicht im PWM-Mode)

von Gregi (Gast)


Lesenswert?

habs in der zwischenzeit schon gelöst. durch viel rechnen.
ein problem hab ich noch..
36 KHz, bedeutet das dass der zustand der leitung alle 0,027per ms 
wechselt oder alle 0,0135 ms?

ciao gregi

von Meiserl (Gast)


Lesenswert?

Aus elektrotechnischen Grundlagen T=1/f wobei
T=Periodenzeit in sec. (eine Vollschwingung) und f=Frequenz (in Hz)
ergibt sich eine periodenzeit von 2,7777 msec
in dieser Zeit muß einmal LOW und einmal HIGH gewesen sein.
Bei einem Tastverhältnis von 1:1 so beträgt die HIGH-Zeit 1,3888msec und 
die LOW-Zeit 1,3888msec. und somit ist eine Periode fertig.

von Horst (Gast)


Lesenswert?

Vielleicht hilft das folgende weiter



/*
      Test program for Timer/Counter 0 in the Interrupt Mode
      Every time the Timer starts an interrupt routine the led variable
      is written on the PORTB and increased one time.
      Leitner Harald
      07/00
*/

#include <io.h>
#include <interrupt.h>
#include <sig-avr.h>

uint8_t led= 0;
uint8_t ton= 0x00;
uint8_t dur= 0x00;
uint8_t nnn= 0x00;

SIGNAL (SIG_OVERFLOW0)
 {
   outp(~led, PORTB);  if (led++ >=2) led = 0;

   outp(ton,TCNT0);                /* reload timer with initial value */

   if( dur++ == 100 )
     {
       if( ton++ > 0xf0 ) ton= 0x00;
       dur= 0;
/*
       if( ++nnn > 0x10 ) outp( ~(1<<TOIE0), TIMSK);
*/
     }
 }

int main( void )
 {
    outp(0xFF, DDRB);             /* use all pins on PORTB for output */

    outp((1<<TOIE0), TIMSK);      /* enables the T/C0 overflow interrupt 
*/
    outp(       ton, TCNT0);      /* start value of T/C0 */
    outp(         2, TCCR0);      /* prescale ck / [1,2,3,4,5] */

    sei();                        /* set global interrupt enable */

    for (;;){}
 }

von Gregi (Gast)


Lesenswert?

hmm..
bei mir ist
1/36000
0,000027777 = 0,02777 ms

aber ich glaub ich habs schon geschafft.. hab sicher 15 min an einem 
fehler gesucht.. er hat sich manchmal, ganz unregelmäßig resettet 
(startadresse)
fehler war bei einer interrupt-routine einen pop/push dreher (pop am 
anfang, push am ende)

wenn die ganze senderoutine fertig ist, werde ich sie hier mal posten, 
vielleicht braucht jemand soetwas

von Thomas (Gast)


Lesenswert?

Hallo,

lann man so einen Quelltext auf die Downloadseite bringen?
Mich würde interessieren wie ich 30 HZ ausgebe und dabei das 
Tastverhältniss ändere.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.