Interrupt Zaehler

Aus Ethersex_Wiki
Wechseln zu: Navigation, Suche





// ################################################################################
// #                                                                              #
// # Interrupt Counter                                                            #
// #   Copyright (C) 2010 - Michael Schultz <ethersex@keyb.de>                    #
// #      Mit viel unterstuetzung/Geduld von: stesie, veyron und DanielW          #
// #                                                                              #
// # This program is free software; you can redistribute it and/or modify it      #
// # under the terms of the GNU General Public License (either version 2 or       #
// # version 3) as published by the Free Software Foundation.                     #
// #                                                                              #
// # This program is distributed in the hope that it will be useful,              #
// # but WITHOUT ANY WARRANTY; without even the implied warranty of               #
// # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                #
// # GNU General Public License for more details.                                 #
// #                                                                              #
// # You should have received a copy of the GNU General Public License            #
// # along with this program; if not, write to the Free Software                  #
// # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.                    #
// #                                                                              #
// # For more information on the GPL, please go to:                               #
// # http://www.gnu.org/copyleft/gpl.html                                         #
// #                                                                              #
// # Anwendung z.b. Auslesen/Übertragen von Strom/Gas/Wasser Zähler Impulsen      #
// #           Getestet auf ATMega644 und ATMega32                                #
// #                                                                              #
// # Daten übermittlung alle 60 Sekunden, TCP, Syslog format                      #
// ################################################################################
// Logging Destination Host: 10.0.0.77 on Port 95

char YearMonth[13][4] = {"---", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
uint16_t InterruptCall = 0 ;            // Interrupt0 aufrufs counter

CONTROL_START
        ON STARTUP DO
                _EIMSK          |=  _BV(INT0);          //      EIMSK(INT0) = 1         Interrupt, Input Data on INT0 / PD2
                _EICRA          &= ~_BV(ISC01);         //      EICRA(ISC01) = 0        interrupt on any edge, asyncronously
                _EICRA          |=  _BV(ISC00);         //      EICRA(ISC00) = 1        interrupt on any edge, asyncronously
                TCP_CONNECT(10.0.0.77, 95, message_handler);
        END

        TCP_HANDLER_PERSIST(message_handler)
        for (;;) {
                // syslog format, initial <Priority Facility>
                TCP_SEND("<27>%s %02d %02d:%02d:%02d %s interrupt: InterruptCall=%d\n", &YearMonth[CLOCK_MONTH()], CLOCK_DAY(), CLOCK_HOUR(), CLOCK_MIN(), CLOCK_SEC(), CONF_HOSTNAME, InterruptCall);
                WAIT(60);
        }
        TCP_HANDLER_END();
CONTROL_END
// ###############################################################################################################################
ISR(INT0_vect) {
        InterruptCall ++;
}





// ################################################################################
// #                                                                              #
// # Interrupt Counter                                                            #
// #   Copyright (C) 2010 - Michael Schultz <ethersex@keyb.de>                    #
// #      Mit viel unterstuetzung/Geduld von: stesie, veyron und DanielW          #
// #                                                                              #
// # This program is free software; you can redistribute it and/or modify it      #
// # under the terms of the GNU General Public License (either version 2 or       #
// # version 3) as published by the Free Software Foundation.                     #
// #                                                                              #
// # This program is distributed in the hope that it will be useful,              #
// # but WITHOUT ANY WARRANTY; without even the implied warranty of               #
// # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                #
// # GNU General Public License for more details.                                 #
// #                                                                              #
// # You should have received a copy of the GNU General Public License            #
// # along with this program; if not, write to the Free Software                  #
// # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.                    #
// #                                                                              #
// # For more information on the GPL, please go to:                               #
// # http://www.gnu.org/copyleft/gpl.html                                         #
// #                                                                              #
// # Anwendung z.b. Auslesen/Übertragen von Strom/Gas/Wasser Zähler Impulsen      #
// #           Läuft nur auf Prozessoren mit Pin Change Interrupt !!              #
// #           z.b. ATMega644 / ATMega644p                                        #
// #                                                                              #
// # Daten übermittlung alle 60 Sekunden, TCP, Syslog format                      #
// ################################################################################
// Logging Destination Host: 10.0.0.77 on Port 95

char YearMonth[13][4] = {"---", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};

uint16_t count = 0 ;                    // loop Count
uint16_t InterruptCall = 0 ;            // Interrupt counter

CONTROL_START
        ON STARTUP DO
                // aktiviere den Pin Change Interrupt für PA7 / ADC7
                PCMSK0  |=       (1 << PCINT7);         //      PCMSK0(PCINT7) = 1      Pin Change Enable Mask
                PCICR   |=       (1 << PCIE0);          //      PCICR(PCIE0) = 1        Pin Change Interrupt Enable 0

                // aktiviere Pullup wiederstand für PA7 / ADC7
                DDRA    &=      ~(1 << PA7);            //      DDRA(PA7) = 0
                PORTA   |=       (1 << PA7);            //      PORTA(PA7) = 1
                MCUCR   &=      ~(1 << PUD);            //       MCUCR(PUD) = 0         Pull-up Disable = 0

                TCP_CONNECT(10.0.0.77, 95, message_handler);
        END
        TCP_HANDLER_PERSIST(message_handler)
                for (;;) {
                        // syslog sending
                        count ++;
                        TCP_SEND("<27>%s %02d %02d:%02d:%02d %s interrupt: InterruptCall=%d count=%d\n", &YearMonth[CLOCK_MONTH()], CLOCK_DAY(), CLOCK_HOUR(), CLOCK_MIN(), CLOCK_SEC(), CONF_HOSTNAME, InterruptCall, count);
                        WAIT(60);
                }
        TCP_HANDLER_END();
CONTROL_END

// ###############################################################################################################################
ISR(PCINT0_vect) {
        InterruptCall ++;
        PCIFR   &=      ~(1 << PCIF0);          //      PCIFR(PCIF0) = 0
}




Emfangen der Daten Mittels Syslog-NG

Sample "/etc/syslog-ng/syslog-ng.conf" File

################################################################################
# Speicherung der "Wetter" Daten (Temp und Feuchte)
################################################################################
source src_net_t95 {    tcp(    ip(10.0.0.77)   port(95)        max_connections(1000)   );      };
destination dst_file_t95 {      file("/mnt/log/current/$YEAR/$MONTH/$DAY/$HOUR/$HOST/$PROGRAM/$FACILITY.$PRIORITY.log"); };
log {   source(src_net_t95);    destination(dst_file_t95);      };
################################################################################



So sehen die daten dann gespeichert aus:
(/mnt/log/current/2010/05/02/06/wichtel/ethersex/daemon.err.log

May  2 06:25:00 wichtel interrupt: InterruptCall=0
May  2 06:26:01 wichtel interrupt: InterruptCall=588