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

Gast #513
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
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
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
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
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
Gast #519
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 25 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.