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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.