#include #include #include #include #define wait delay_ms(100) eeprom unsigned char kennung[6]={'A','-','0','0','0','0'}; void Init(void) { //Register des AVRs initialisieren // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=FFh // OC0 output: Disconnected ASSR=0x00; TCCR0=0x00; TCNT0=0x00; OCR0=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer 1 Stopped // Mode: CTC top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // OC1C output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off // Compare C Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; OCR1CH=0x00; OCR1CL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer 2 Stopped // Mode: Normal top=FFh // OC2 output: Disconnected TCCR2=0x00; TCNT2=0x00; OCR2=0x00; // Timer/Counter 3 initialization // Clock source: System Clock // Clock value: Timer 3 Stopped // Mode: CTC top=FFFFh // Noise Canceler: Off // Input Capture on Falling Edge // OC3A output: Discon. // OC3B output: Discon. // OC3C output: Discon. // Timer 3 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off // Compare C Match Interrupt: Off TCCR3A=0x00; TCCR3B=0x00; TCNT3H=0x00; TCNT3L=0x00; ICR3H=0x00; ICR3L=0x00; OCR3AH=0x00; OCR3AL=0x00; OCR3BH=0x00; OCR3BL=0x00; OCR3CH=0x00; OCR3CL=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: Off // INT2: Off // INT3: Off // INT4: Off // INT5: Off // INT6: Off // INT7: Off EICRA=0x00; EICRB=0x00; EIMSK=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; ETIMSK=0x00; // USART0 initialization / GSM und RS-232 angepasst auf ATmega128 // Communication Parameters: 8 Data, 1 Stop, No Parity // USART0 Receiver: On // USART0 Transmitter: On // USART0 Mode: Asynchronous // USART0 Baud Rate: 38400 UCSR0A=0x00; UCSR0B=0x98; UCSR0C=0x06; // 0x06: Bit7=0 um auf UCSR0C zu schreiben. Beim ATmega162: 0x86 UBRR0H=0x00; UBRR0L=0x0C; // USART1 initialization / GPS // Communication Parameters: 8 Data, 1 Stop, No Parity // USART1 Receiver: On // USART1 Transmitter: Off // USART1 Mode: Asynchronous // USART1 Baud Rate: 4800 UCSR1A=0x00; UCSR1B=0x10; UCSR1C=0x06; // 0x06: Bit7=0 um auf UCSR1C zu schreiben. Beim ATmega162: 0x86 UBRR1H=0x00; UBRR1L=0x67; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; // ADC initialization // ADC Clock frequency: 62,500 kHz // ADC Voltage Reference: Int., cap. on AREF ADMUX=ADC_VREF_TYPE; ADCSRA=0x87; // Input/Output Ports initialization // Port A initialization // Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=Out Func7=In // State0=T State1=T State2=T State3=T State4=T State5=T State6=0 State7=T PORTA=0x00; DDRA=0x40; PORTA.6 = 0; // Port B initialization // Func0=In Func1=In Func2=In Func3=In Func4=Out Func5=Out Func6=Out Func7=Out // State0=T State1=T State2=T State3=T State4=0 State5=0 State6=0 State7=0 PORTB=0x00; DDRB=0xF0; //PINB.4 - Power-Led //PORTB.4 = 0; // Power-Led ein //PINB.5 - Alarm-Led //PORTB.5 = 0; //PINB.6 - Status-Led //PORTB.6 = 0; // Port C initialization // Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In // State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T PORTC=0x00; DDRC=0x00; // Port D initialization // Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In // State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T PORTD=0x00; DDRD=0x00; PORTD.1=0; // Port E initialization // Func0=In Func1=In Func2=Out Func3=In Func4=In Func5=In Func6=In Func7=In // State0=T State1=T State2=0 State3=T State4=T State5=T State6=T State7=T PORTE=0x00; DDRE=0x04; //PORTE.2=0; // Port F initialization // Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In // State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T PORTF=0x00; DDRF=0x00; // Port G initialization // Func0=In Func1=In Func2=In Func3=In Func4=In // State0=T State1=T State2=T State3=T State4=T PORTG=0x00; DDRG=0x00; // Watchdog Timer initialization // Watchdog Timer Prescaler: OSC/2048k WDTCR=0x1F; //WD aktivieren WDTCR=0x0F; //WD Change-Enable rücksetzen } //******************************************************************************* // Mit dieser Funktion kann ausgewaehlt werden, mit was der USART0 des ATmeag128 // verbunden ist. Zur Auswahl stehen: // - UART des GSM-Moduls: usart0_connect_to(GSM) // - RS-232 Schnittstelle: usart0_connect_to(RS232) // ****************************************************************************** void usart0_connect_to (unsigned char adr) { wait; if (adr == GSM) { PORTE.2=0; wait; } if (adr == RS232) { PORTE.2=1; wait; } } //******************************************************************************* // Mit dieser Funktion kann der Fensterinhalt des Terminalprogramms geloescht // werden. (vorrausgesetzt es ist die VT100-Emulation eingestellt) // ****************************************************************************** void ClearTerminal (void) { putchar(0x1B); putchar(0x5B); putchar(0x32); putchar(0x4A); } //******************************************************************************* // Mit dieser Funktion wird das Terminalprogramm zum Konfigurieren. // ****************************************************************************** void Terminal (void) { unsigned char auswahl, i; while (1) { ClearTerminal(); // Loeschen aller Zeichen auf dem Terminalfenster printf("\n\r"); printf("Konfigurations-Terminalprogramm\n\r\n\r"); printf("<1> Kennung "); for(i=0;i<6;i++) putchar(kennung[i]); // An dieser Stelle gibt er mir 6 mal das Zeichen printf("\n\r"); printf(" Beenden\n\r\n\r"); printf("Auswahl: "); auswahl = getchar(); switch (auswahl) { case '1': config_kennung(); break; case 'q': ClearTerminal(); return; break; case 'Q': ClearTerminal(); return; break; default: break; } } } //********************************************************************************************** // Hauptprogramm //********************************************************************************************** void main(void) { // Lokale Variablen unsigned char i, j; // Zaehlvariablen unsigned char error; unsigned char nummer[MAXLENGTH_TELNUMBER]; // Puffer fuer das Umspeichern einer Telefonnummer (EEPROM <-> SRAM) unsigned char stat_led = 0; unsigned char alarm_led = 0; unsigned char power_led = 0; unsigned char akku_led = 0; /****Initialisierung, Timer, USART,..... ****/ Init(); //Start Initialisierung #asm("sei"); // Gloabal-Interruptflag setzen /**** Wenn Taster "PRGM" gedrückt ist, ins Konfigurationsprogramm wechseln ****/ if (PIND.1 == 0) { // wenn Taster "Prgm"(S201) gedrückt WDTCR=0x1F; //WD Change-Enable setzen WDTCR=0x00; //WD deaktivieren usart0_connect_to(RS232); // Umschalten der USART0 auf die RS-232. Aufruf Terminal(); WDTCR=0x1F; //WD Change-Enable setzen WDTCR=0x0F; //WD aktivieren } // Terminalprogramm zur Konfiguration } // Schließt MAIN ab und Programm Ende