PWM mit den AVRs.. oder Wie bringt man leicht eine Frequenz

Gast #513
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".
Gast #515
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
Gast #516
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.
Gast #517
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 (;;){}
 }
Gast #518
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren