1 | #define F_CPU 3686400 //Taktfrquenz
|
2 | #define BAUD 19200 //einstellte Baudrate
|
3 | //------------------------
|
4 | #define AT_Anrufen "atd0160xxxxxxx;\r" //AT-Befehl für einen Anruf
|
5 | #define AT_Auflegen "ath\r" //AT-Befehl für das Auflegen
|
6 | #define AT_Temp "at+cmte?\r" //AT-Befehl für Temperaturabfrage
|
7 | #define AT_Signal "at+csq\r" //AT-Befehl für Signalstärke
|
8 | #define AT_Guth "atd*100#\r" //AT-Befehl für Guthabenabfrage
|
9 | #define Ant_Temp "+CMTE:" //Antwort für Temperatur
|
10 | #define Ant_Guth "+CUSD:" //Antwort für Guthaben
|
11 | #define Ant_Signal "+CSQ:" //Antwort für Singalstärke
|
12 | //------------------------
|
13 | #define LED_Alarm_An PORTB |= (1 << PB0); //Kontroll-LED an "Alarm ausgelöst"
|
14 | #define LED_Alarm_Aus PORTB &= ~(1 << PB0); //Kontroll-LED aus "Alarm ausgelöst"
|
15 | //------------------------
|
16 | #include <avr\io.h> //zur Deklaration der Ports
|
17 | #include <ctype.h> //zur Verwendung von toupper
|
18 | #include <string.h> //zur Stringverwendung
|
19 | #include "D:\Programmieren\Mikrocontroller\AVR\Header\uart.h"
|
20 | #include "D:\Programmieren\Mikrocontroller\AVR\Header\interrupt.h"
|
21 | #include <avr/io.h>
|
22 | //----------------------------------------------------------------------
|
23 | char _buffer[100]; //Globaler Schreibpuffer
|
24 | int _i = 0; //globale Laufvariable
|
25 | //----------------------------------------------------------------------
|
26 | //----------------------------------------------------------------------
|
27 | void initPorts()
|
28 | {
|
29 | //Ports B.0/1 als Ausgänge deklarieren
|
30 | DDRB = (1<< PB0)|(1<<PB1);
|
31 | //Ports D.2/3 als Eingänge deklarieren
|
32 | DDRD = (0<<PB2)|(0<<PB3);
|
33 | // PORTD = PULL-UP
|
34 | PORTD = 0x04;
|
35 | }
|
36 | void Puffer_loeschen()
|
37 | {
|
38 | for (int i=0; i<100; i++)
|
39 | {
|
40 | _buffer[i] = 0;
|
41 | }
|
42 |
|
43 | _i = 0;
|
44 | }
|
45 | void Anrufen()
|
46 | {
|
47 | Puffer_loeschen(); //Puffer löschen
|
48 | putString(AT_Anrufen); //Anrufen
|
49 | waitMs(15000); //Zeit abwarten
|
50 | putString(AT_Auflegen); //Auflegen
|
51 | waitMs(15000); //bis zum nächsten Alarm warten
|
52 | Puffer_loeschen(); //Puffer löschen
|
53 | }
|
54 | char *Status(char *AT_Befehl, char *Antwort, int TimeOut)
|
55 | {
|
56 | char *Rueckgabe = NULL;
|
57 | int i = 0;
|
58 |
|
59 | Puffer_loeschen(); //Puffer löschen
|
60 | putString(AT_Befehl); //AT-Befehl senden
|
61 | waitMs(TimeOut); //etwas warten
|
62 |
|
63 | while(!(strstr (_buffer, Antwort))) //falls vorhanden Antwort prüfen
|
64 | {
|
65 | waitMs(1000); //etwas Zeit verbummeln beim warten
|
66 |
|
67 | //falls die Zeit überschritten wird, "Error" als Rückgabewert übertragen und
|
68 | //die Schleife vorzeitig beenden. Sonst kann es zu Endlosschleifen kommen.
|
69 | if (i>=10)
|
70 | {
|
71 | Rueckgabe = "Error"; //"Error" zurückgeben, falls keine Antwort
|
72 | goto ende;
|
73 | }
|
74 | i++;
|
75 | }
|
76 |
|
77 | Rueckgabe = strstr (_buffer, Antwort); //Wert in Variable schreiben
|
78 | strcat(Rueckgabe, "\r\n");
|
79 | ende: //Sprungmarke für Vorzeitige Beendung
|
80 | Puffer_loeschen(); //Puffer löschen
|
81 | putString(Rueckgabe); //zu Testzwecken
|
82 | return Rueckgabe; //Antwort als Rückgabewert
|
83 | }
|
84 | ISR(USART_RXC_vect) //USART, Rx Complete
|
85 | {
|
86 | char data = 0;
|
87 | data = getChar(); //Zeichen holen
|
88 | _buffer[_i] = data;
|
89 | _i++;
|
90 | //data = toupper(data); //in große Zeichen umwandeln
|
91 | }
|
92 | //----------------------------------------------------------------------
|
93 | //----------------------------------------------------------------------
|
94 | main() //Hauptschleife
|
95 | {
|
96 | initPorts();
|
97 | initUART();
|
98 | initInterrupt();
|
99 |
|
100 | do
|
101 | {
|
102 | //Alarm ausgelöst
|
103 | if (!(PIND & (1 << PD2)))
|
104 | {
|
105 | waitMs(1000); //etwas Zeit verbummeln
|
106 | if (!(PIND & (1 << PD2))) //Alarm steht immernoch an
|
107 | {
|
108 |
|
109 | LED_Alarm_An; //Kontroll-LED an "Alarm ausgelöst"
|
110 | //Anrufen(); //Anrufen
|
111 | LED_Alarm_Aus; //Kontroll-LED aus "Alarm ausgelöst"
|
112 |
|
113 | Status(AT_Signal, Ant_Signal, 500);
|
114 | //Status(AT_Temp, Ant_Temp, 500);
|
115 | //Status(AT_Guth, Ant_Guth, 500);
|
116 | }
|
117 | }
|
118 |
|
119 | Puffer_loeschen(); //Wenn mit den Daten nichts gemacht wird, werden sie gelöscht
|
120 | }
|
121 | while (true);
|
122 | }
|