Forum: Mikrocontroller und Digitale Elektronik UTMF dekoder mega8


von Fabian (Gast)


Angehängte Dateien:

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?

von Roland P. (pram)


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

von Gast2 (Gast)


Lesenswert?

> ... eigentlich alles kein Probllem.

ROFL... Ja eben.

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.