#include "avr/io.h" #include "lcd.h" #ifndef F_CPU #define F_CPU 16000000 /*Quarz 16 Mhz*/ #endif #include #include "modul.h" #include "lcd.h" #define __AVR_ATMEGA128__ 1 #define Frequency 16000000 #define CR "\r\n" #define __AVR_ATMEGA128__ 1 void Initialize() { PORTA = 0b00000000; DDRA = 0b11000000; //Relay set as output (Bit 6 = 1) PORTB = 0b00000000; DDRB = 0b00000000; PORTC = 0b00000000; DDRC = 0b11110111; PORTD = 0b11000000; DDRD = 0b00001000; //TX set as output (Bit3 = 1) PORTE = 0b00000000; DDRE = 0b00110000; PORTF = 0b00000000; DDRF = 0b00000000; PORTG = 0b00000000; DDRG = 0b00000000; } int main() { Initialize(); int schleife=0; UART_Init(9600); lcd_init(LCD_DISP_ON); while(1) // endlosschleife { if (!(PINA & 0b00000001)) // wenn Taste 1 dann sende SMS { lcd_clrscr(); lcd_puts("SMS SEND"); schleife=0; do{ _delay_ms(16); schleife=schleife+1; } while (schleife < 100); PORTA = PORTA | 0b11000000; // Diode an mit oder send_sms("0123456789","Hallo das ist eine test sms"); lcd_clrscr(); } else // empfange einen String und gib aus RS232 { lcd_puts("Empfangen"); _delay_ms(16); lcd_clrscr(); char Line[10]; uart_gets( Line, sizeof( Line ) ); uart_puts(Line); } } return 0; } ------------------------------------------------------------------------------------------- modul.h #define OSCSPEED 16000000 void UART_Init(uint32_t Baud) { unsigned int BaudRate = OSCSPEED / (16 * Baud) - 1; /* as per pg. 173 of the user manual */ //set BaudRate to registers UBRR1H and UBRR1L UBRR1H = (unsigned char) (BaudRate>>8); UBRR1L = (unsigned char) BaudRate; UCSR1B = UCSR1B | 0b00011000; //enable Receiver and Transmitter (Bit3 = 1, Bit4 = 1) UCSR1C = UCSR1C | 0b10000110; //Set frame format: 8 data (Bit1 = 1, Bit2 = 1), 1 stop bit (Bit3 = 0) } uint8_t uart_getc() { if (UCSR1A & 0b10000000) //if there is unreaded data return UDR1; else //no unreaded data return 0; } void uart_gets( char* Buffer, unsigned int MaxLen ) { unsigned int NextChar; unsigned int StringLen = 0; NextChar = uart_getc(); // Warte auf und empfange das nächste Zeichen // Sammle solange Zeichen, bis: // * entweder das String Ende Zeichen kam // * oder das aufnehmende Array voll ist while( NextChar != '\n' && StringLen < MaxLen - 1 ) { *Buffer++ = NextChar; StringLen++; lcd_puts("stringemp"); NextChar = uart_getc(); } // Noch ein '\0' anhängen um einen Standard // C-String daraus zu machen *Buffer = '\0'; } int uart_putc(unsigned char c) { while (!(UCSR1A & 0b00100000)); //waiting until buffer is ready to receive UDR1 = c; // sende zeichen return 0; } void uart_puts (char *s) { while (*s) { uart_putc(*s); s++; } } void make_call(char *text) { uart_puts ("atd"); uart_puts (text); uart_puts ("\r\n"); } void delay_sek() { int zaehler=0; do { _delay_ms(16); zaehler++; } while (zaehler < 200); } void send_sms(char *number,char *text) { uart_puts ("at+cmgf=1\r\n"); delay_sek(); uart_puts ("at+cmgs="); uart_puts (number); uart_puts ("\r\n"); delay_sek(); uart_puts (text); uart_puts ("\x1a"); uart_puts ("\r\n"); }