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?