- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 14

Thema: Tonerzeugung mit Timer funktioniert nicht wie gewollt

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    26.03.2011
    Beiträge
    5

    Tonerzeugung mit Timer funktioniert nicht wie gewollt

    Hallo, ich hänge seit 2 Stunden an einem einfachen Problem.

    Mein Timer funktioniert nicht wie er soll, ich will Töne mit möglichst exakten Frequenzen erzeugen.
    Aus diesem Grund verwende ich Timerß0 ohne Prescaler. Zusätzlich beträgt der reload 255.
    Allerdings passen die töne nicht, und ich komme nicht drauf, wieso...


    Es wäre nett wenn mir jemand zeigt, wo sich das gehölz vor meinem kopf befindet

    Code:
    volatile unsigned short sound_count=0;
    volatile unsigned short sound_fcount=0;
    volatile unsigned char sound_state=0;
    volatile unsigned short sound_length=0;
    volatile unsigned short sound_freq=0;
    
    void Sound_Beep(unsigned short freq, unsigned short length)
    {
    	sound_length=(F_CPU*length)/1000;
    	sound_freq=(F_CPU/2/freq);
    	sound_state=0;
    	sound_count=0;
    	sound_fcount=0;
    	
    	//Enable timer
    	TCNT0=255;
    	TCCR0=(1<<CS00);
    }
    
    
    ISR (TIMER0_OVF_vect)
    {
    	sound_count++;
    	if (sound_count>sound_length)
    	{
    		PORTD&=~(1<<7);
    		TCCR0=0;		
    	};
    	sound_fcount++;
    	if (sound_fcount>sound_freq)
    	{
    		sound_fcount=0;
    		if (sound_state==0)
    		{
    			sound_state=1;
    			PORTD|=(1<<7);			
    		}
    		else
    		{
    			sound_state=0;
    			PORTD&=~(1<<7);
    		};
    	};
    	TCNT0 = 255;
    }
    Geändert von Patrick91 (26.03.2011 um 23:04 Uhr)

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.712
    Blog-Einträge
    133
    Hallo,
    ohne daß ich jetzt die Sprache C verstehen würde, fehlten mir noch einige Infos:
    Welchen µC verwendest Du?
    Mit welchem Takt soll er laufen?
    Mit welchem Takt läuft er tatsächlich? (Fuses alle richtig?)
    Was bedeutet Töne passen nicht? Wie groß ist die Abweichung

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    26.03.2011
    Beiträge
    5
    Der quarz ist 3686400 Hz. Es ist ein Atmega8.
    Die Fuses sitzen auf: High: 0xFD Low: 0xD9. Die müssten eigentlich passen...(ExternalResonator middle frequency).
    Die Töne haben geschätzt eine abweichung von einer million Herz.
    Also wenn ich einen Ton spiele mit 2134 als Vorhabe, dann Messe ich ca. 685 Hz

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von Patrick91 Beitrag anzeigen
    Es ist ein Atmega8.
    Also ist es es ein 8-Bit-Counter.
    Dann verrate uns jetzt mal ganz genau im Detail, wie du dir hiermit
    Timerß0 ohne Prescaler. Zusätzlich beträgt der reload 255.
    eigentlich den genauen Ablauf vorgestellt hast.

    Im Augenblick werden die Interrupts direkt hintereinander ausgeführt. Genauso gut hättest du den Code auch einfach nur in eine Endlosschleife in main packen können, das wäre auf das Selbe raus gekommen.
    MfG
    Stefan

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    26.03.2011
    Beiträge
    5
    Ich hatte anfangs keinen reload, da ich es erstmal mit dem normalen Pufferüberlauf probieren wollte, hier war die auflösung der erzeugbaren Frequenzen aber zu Grob (2100 und 2300) ergaben den gleichen ton.
    Aus diesem Grund habe ich das reload inzugefügt, jetzt passt aber überhauptnix mehr.
    Natürlich hast du recht, hätte das jetzt so funktioniert, dann hätte ich den Timer auch wieder rausgeschmissen

    EDIT:
    Die initialisierung:
    Code:
    //Enable 8-Bit Counter0 overflow Interrupt
      TIMSK|=(1<<TOIE0);
      sei();

  6. #6
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Ich sehe immer noch keine detaillierte Beschreibung wie du dir den Ablauf vorstellst. Was denkst du z.B., wie deine Zeitbasis aussieht?
    MfG
    Stefan

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.04.2010
    Beiträge
    1.249
    Wo ist die Initialisierung des Timers, bzw. wie sieht sie aus?

Ähnliche Themen

  1. Timer Overflow funktioniert nicht [erledigt]
    Von robo junior im Forum C - Programmierung (GCC u.a.)
    Antworten: 7
    Letzter Beitrag: 19.11.2008, 18:15
  2. BackLED blinken nicht wie gewollt??
    Von MCClane im Forum Asuro
    Antworten: 1
    Letzter Beitrag: 04.10.2006, 16:47
  3. For-Next-Schleife läuft nicht so wie gewollt :(
    Von jagdfalke im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 24
    Letzter Beitrag: 04.07.2005, 17:20
  4. Timer funktioniert nicht
    Von barlip im Forum C - Programmierung (GCC u.a.)
    Antworten: 10
    Letzter Beitrag: 05.03.2005, 13:33
  5. RC5 mit Timer kombinieren funktioniert nicht
    Von Enrico3 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 10
    Letzter Beitrag: 07.01.2005, 19:00

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress