Forum: Mikrocontroller und Digitale Elektronik [ATmega8]Summer-Frequenzen


von AtroCty (Gast)


Lesenswert?

Guten Tag,

ich bin relativ neu in der Micro-Controler-Technik, bitte von daher um 
etwas Nachsicht ;)

Da ich C-Programmierung schon hinter mir habe lag es Nahe dass ich diese 
Sprache für mein Vorhaben verwende.

Ich besitze hier ein Atmel Evaluationsboard V. 2.01
Dieser besitzt einen Summer, den ich gerne ansteuern wollte.
Ich möchte damit eine Funktion schreiben, die es mir erlaubt per Eingabe 
einen bestimmten Ton auszugeben. (Piano)

Bisher habe ich so damit gearbeitet:
1
#define F_CPU 16000000
2
#include  <avr\io.h>    
3
#include  <util\delay.h>
4
5
void ton (int lenght, int tune)
6
{
7
  for (int i=0; i<=lenght; i++)
8
  {
9
    PORTD = 0x80;
10
    _delay_us(tune);
11
    PORTD = 0x00;
12
    _delay_us(100);
13
  }
14
}
Jedoch möchte ich ohne spezifische Rechnung eine Frequenz an den Summer 
geben um so den benötigten Ton zu erhalten (siehe Tonfrequenzen 
http://de.wikipedia.org/wiki/Ton_(Musik) )
Ich finde verzweifelt keine Bibliothek die mir dieses ermöglichen kann.
Weiß da einer Rat?

Gruß AtroCty

von spess53 (Gast)


Lesenswert?

Hi

Deine Funktion bringt dich nicht weiter, da sie den Controller zu 100% 
beschäftigt. Für so etwas benutzt man einen Timer.

MfG Spess

von AtroCty (Gast)


Lesenswert?

Mein aktueller Code:
1
//----------------------------------------------------------------------
2
// Prozessor : ATmega8
3
// Takt      : 16 MHz
4
// Sprache   : C
5
// Datum     : 10. Juli 2012
6
// Version   : 1.0
7
// Autor     : ---
8
// CompilerOptions: -Os
9
//----------------------------------------------------------------------
10
#define   F_CPU 16000000  // Taktferquenz des myAVR-Boards
11
#include  <avr\io.h>    // AVR Register und Konstantendefinitionen
12
#include  <util\delay.h>
13
//----------------------------------------------------------------------
14
15
void ton (float frequency, int lenght)
16
{
17
  float tune, j;
18
19
  tune = ((1/frequency)/2*1000000);
20
  j = (lenght * (1000/(2*tune)));
21
  
22
  for (int i=0; i<=j; i++)
23
  {
24
    PORTD = 0b10000000;
25
    _delay_us(tune);
26
    PORTD = 0x00;
27
    _delay_us(tune);
28
  }
29
}
30
31
32
void melody (void)          //Hier wird die Melodie definiert
33
{                  //Töne sind dieses Format (Länge [in ms]|Tonhöhe)
34
   /******************\
35
   *  C  =   264    *
36
   *  D  =  297    *
37
   *  E  =  330    *
38
   *  F  =  352    *
39
   *  G  =  396    *
40
   *  A  =  440    *
41
   *  H  =  475    *
42
   *  C'  =  528    *
43
   \******************/
44
   
45
  ton(600,200);
46
  _delay_ms(1);
47
  ton(800,200);
48
  _delay_ms(1);
49
  ton(800,100);
50
  _delay_ms(1);
51
  ton(1100,100);
52
  _delay_ms(1);
53
  ton(1300,200);
54
  _delay_ms(1);
55
  ton(800,200);
56
  _delay_ms(1);
57
  ton(1500,300);
58
  _delay_ms(1);
59
  ton(1300,250);
60
  _delay_ms(1);
61
  ton(1300,100);
62
63
}
64
65
int main (void)            // Hauptprogramm, startet bei Power ON und Reset
66
{
67
  DDRD = 0x80;           //Hauptdeklaration der Ausgänge
68
  int delay = 100;
69
70
  while(1)
71
  {
72
    //S1 gedrückt
73
    if(PIND&0x04)
74
    {
75
      melody();
76
    }
77
    else
78
    {
79
      PORTD = 0x00;
80
    }
81
  }
82
  return 0;
83
}
84
//----------------------------------------------------------------------
Es ist doch egal ob der Controller ganz ausgelastet wird, es soll ja nur 
der Summer angesteuert werden und sonst nichts.
Soweit funktioniert der Code auch fast, bloß die Frequenzen scheinen 
nciht ganz hinzuhauen.
Ich habe bisher noch nicht mit Timern gearbeitet, wie soll ich sie denn 
ansteuern/verarbeiten?

von doppelt invertierte Salatgurke (Gast)


Lesenswert?

float ist aufm µP nicht gut (braucht viel Rechenzeit) und delay_us darf 
nur mit Konstanten benutzt werden.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

AtroCty schrieb:
> Mein aktueller Code:
>
1
>     _delay_us(tune);
2
>

Die delay-Funktionen können nur mit Konstanten aufgerufen werden - nicht 
mit variablen Werten. Sonst arbeiten sie nicht korrekt.

> Ich habe bisher noch nicht mit Timern gearbeitet, wie soll ich sie denn
> ansteuern/verarbeiten?

Siehe Artikel

  http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR

von Jonathan M. (jona)


Lesenswert?

Hi


Wegen der Frquenzen kannste ja mal hier schauen:

http://www.sengpielaudio.com/Rechner-notennamen.htm

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.