UTMF dekoder mega8

Gast #1041154
Lesenswert?
• ▲
▼
Hi,

habe mir fest vorgenommen die Heizung meines Autos uber die UTMF - 
Signale meines Handys zu steuern.

... eigentlich alles kein Probllem.

Bisher benutze ich zu Testzwecken folgendes Programm:
1
#include <avr/io.h> 
2
#include <avr/interrupt.h> 
3
#include <inttypes.h>
4
//#include <stdlib.h>
5

6
//#include <util/delay.h> //wartefunktion _delay_ms(50) // max. 262.1 ms / F_CPU in MHz
7
#include <avr/iom8.h> 
8

9

10
//Usart definitionen
11
#define F_CPU 4000000L
12
#define BAUD 9600L
13

14
#define UBRR_VAL ((F_CPU+BAUD * 8)/(BAUD*16)-1)      //clever runde
15
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))         //reale Baudrate
16

17
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000)      //Fehler in Promille
18

19
#if ((BAUD_ERROR>10)||(BAUD_ERROR<-10))
20
#error Systematischer Fehler in der Baudrate größer 1% und damit zu hoch!
21
#endif
22

23
volatile int8_t gFrequenz;
24

25

26
int uart_putc(unsigned char c)
27
{
28
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
29
    {
30
    }                             
31
 
32
    UDR = c;                      /* sende Zeichen */
33
    return 0;
34
}
35

36

37
/* puts ist unabhaengig vom Controllertyp */
38
void uart_puts (char *s)
39
{
40
    while (*s)
41
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
42
        uart_putc(*s);
43
        s++;
44
    }
45
}
46

47
void init_usart()
48
{
49
   UBRRH = UBRR_VAL >> 8;
50
   UBRRL = UBRR_VAL & 0xFF;
51
   
52
   
53
   UCSRB = (1<<RXEN)|(1<<TXEN);      //UART TX einschalten
54
   UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);      //Asynchron 8N1
55
}
56

57

58

59

60
ISR(TIMER1_OVF_vect) // veraltet: SIGNAL(SIG_OVERFLOW0) 
61
{
62
    // Interrupt Code
63
  cli(); 
64
  //uart_putc("x");
65
  TCNT0=0xF0;
66
  sei();
67
}
68

69
ISR(TIMER0_OVF_vect) // veraltet: SIGNAL(SIG_OVERFLOW0) 
70
{
71
  int8_t izaehl_wert=TCNT1L;
72
  int8_t izaehl_wert2=TCNT1H;
73

74
  TCNT1H=0x00;
75
  TCNT1L=0x00;
76

77
  gFrequenz=izaehl_wert;
78
  //uart_puts("test");
79
    TCNT0=0xF0;
80
}
81

82

83

84

85
int main (void)
86
{
87
  char s[7];
88
  gFrequenz="";
89
  int8_t gizaehl_wert="";
90
  init_usart();
91
  DDRC = 0xff;
92
  DDRD = 0x00;
93
  sei();
94

95
  /*Timer1 ansteuern*/
96
  TCCR1A=0x00;
97
  TCCR1B=0x01;
98

99

100
  /*Timer0 eingagssignal T0 zählen*/
101
  //TCCR0 |= (1<<CS00);
102
  TCCR0 |= (1<<CS01)|(1<<CS02);
103
  TIMSK=0x05;
104
  //TCNT0=0x00;
105
  TCNT0=0xF0;
106

107

108
  while(1)
109
  {
110

111
    if(gFrequenz!="")
112
    {
113
      //itoa( gFrequenz, s, 10 );
114
      //uart_puts("Frequenz:");
115
      uart_putc(gFrequenz);
116
      //uart_puts("\n");
117
      gFrequenz="";
118
    }
119

120

121
    //PORTD =PORTD;
122

123
  }
124

125
}

Kurz zur erklärung:

Am eingang des Timers T0 liegt mein DTMF - Signal. Wenn Timer T0 
überläuft wird der Zählerstand des Timers T1 an die Usart übergeben.

Somit entspricht der übergebene Zählerstand der Frequenz des UTMF - 
Signals und brächte zur Entschhlüsselung der übertragenen Zahlen nur 
noch eingegrentzt werden.

... Funktioniert auch alles ABER!

Ich bekomme keine Stabielen werte. Ein kleines Schwanken der Frequenz 
währe ja OK aber die übergebenen Werte sind selten im gleichen Bereich.

Zum testen habe ich ein konstantes Signal über die PC - Lautsprecher 
ausgegen.


Also meine Frage ist eigentlich was kann ich tun um das Signal genauer 
zu analysieren?

Kommen die Störungen vielleicht von meiner Schaltung am eingant T0? Kann 
ich hier etwas verändern?
Angehängte Dateien:
#1041183
Lesenswert?
• ▲
▼
(Was ist UTMF? ich denke du meinst DTMF)

Ein DTMF-Signal besteht immer aus 2 Frequenzen: DT = DualTone

Somit kannst du das nicht mit einem einfachen Zähler dekodieren, du 
musst da erheblich mehr Aufwand rein stecken. (z.B. mit dem 
Goertzel-Algorithmus, oder Analyse der Interferenzmuster)

z.B. hier
http://www.franzis.de/elo-das-magazin/mikrocontroller-und-programmierung/avr-anwendungen/dtmf-decoder

oder sowas wie hier
Beitrag "Goertzel-Algorithmus"

Gruß
Roland

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.