Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[ATMEGA32][C] Czy ktoś pomoże uporać się z TWI i PCF8583

margas4542 09 Paź 2010 14:11 2701 6
  • #1 09 Paź 2010 14:11
    margas4542
    Poziom 16  

    Witam. Do programu zarządzania zasilaniem który już działa usiłuje dopisać obsługę PCF8583 oraz część programu który pozwoliłby wyeliminować mechaniczny dwu kanałowy zegar sterujący który o określonych godzinach włącza lub wyłącza dwa obwody 230V. Mam z tym problem bo nie posiadam dostatecznej wiedzy i jak na razie to dopisana część kodu rozwala na drobne resztę programu.Aha...menu LCD gdzie będą realizowane wszystkie nastawy zegar,kanały.sterowanie obwodami 230V jest w wersji DEMO tzn wyświetlane są tylko komunikaty tekstowe.

    Code:

    //#######################################
    //########## A T M E G A _ 3 2 ##########
    //#######################################
    #include <stdint.h>
    #include <avr/io.h>
    #include <stdlib.h>
    #include <avr/interrupt.h>
    #include <twi.h>
    #include "HD44780.h"
    //-----define variable ADC
    char buffer_n[8];
    volatile uint16_t pomiar[6] __attribute__((section(".noinit")));
    void inline SetAdcKanal(unsigned char kanal)
    {
     ADMUX = ((ADMUX&0xE0)+ kanal);
    }
    double aku;
    double lad;
    double sol;
    double out;
    double power;
    double inpower;
    //-----define threshold voltage
    float aku_min = 11.5;
    float aku_max = 14.2;
    float aku_stab = 14.0;
    float sol_ref = 13.0;
    float zas_ref = 10.0;
    //-----define TWI and PCF8583
    unsigned char czas[4]={0,}; // zerowanie wszystkich elementów tablicy
    unsigned char PCF_time=0;
    unsigned char buf_t2;
    unsigned char buf_t3;
    unsigned char buf_t4;
    unsigned char buf_t5;
    //-----
    //***** MAIN
    int main()
    {
     DDRA=0xC0;      //znacznik PORTA6 do wykorzystania
     PORTA=0x80;   //pul-up klawisza podświetlenia LCD
     DDRB=0x01;      //podświetlenie LCD (reszta pinów 4 bity,RS,RW,E pod LCD)
     DDRC=0xFC;      //wyjścia sterujące oraz SCL SDA układu PCF8583 oraz 24C04
     PORTC=0x03;   //pul-up dla SCL SDA INT1 układu PCF8583 oraz 24C04
     DDRD=0x00;      //wejścia klawiatura oraz INT1 układu PCF8583
     PORTD=0xF8;   //pull-up klawiatura oraz INT1 układu PCF8583
    //----- LCD init
     LCD_Initalize();
     _delay_ms(200);
    //----- ADC init
     ADMUX = _BV(REFS0)|_BV(REFS1)|_BV(ADLAR);
     ADCSRA = _BV(ADEN)|_BV(ADPS0)|_BV(ADPS1)|_BV(ADPS2);
    //----- TWI init
     TWSR =0x00;    // Preskaler = 1  ->> TWPS1=0 TWPS0=0
     TWBR =0x48;   //((F_PU/100000Hz)-16)/2
     while(1)




     {
    //--------------------------zegar
      TWI_write(zegar,0x00,0b00000000);
       {
        PCF_time=TWI_read(zegar,0x04);
        czas[0]=(PCF_time & 0b00110000) >> 4;   // dziesatki_godzin         
        czas[1]=PCF_time & 0b00001111;         // godziny
        PCF_time=TWI_read(zegar,0x03);
        czas[2]=PCF_time >> 4;                   // dziesatki_minut
        czas[3]=PCF_time & 0b00001111;         // minuty
        //bez sekund
        buf_t2=(czas[0]+0x30);
        buf_t3=(czas[1]+0x30);   
        buf_t4=(czas[2]+0x30);   
        buf_t5=(czas[3]+0x30);     
       }
    //--------------------------processing of the input voltages
      int kan;
      for(kan = 0; kan<5; kan++)
      {
       SetAdcKanal(kan);
       ADCSRA |= (1 << ADSC);
       while(ADCSRA & (1 << ADSC));
       pomiar[kan] = (ADC | ADCH<<8);     
       aku = (pomiar[0]/2.54)/1024;//battery voltage measurement
       lad = (pomiar[1]/2.54)/1024;//measurement of battery current
       sol = (pomiar[2]/2.54)/1024;//measurement of voltage photovoltaic cell
       out = (pomiar[3]/2.54)/1024;//measuring the output current
       power = (pomiar[4]/2.54)/1024;//monitoring of mains supply
       _delay_ms(40);
       {
        inpower =(lad-out);   //calculate the input current
        char *napis="      ";
        char napis1="----- ";
        char napis2="Solar ";
        char napis3="Zas-1 ";
        char napis4="Zas-2 ";
    //--------------------------automatic power switch circuits
        unsigned char val;
        for(val=1; val<6; val++)   
        {   
         switch(val)
         {
          case 1://--------------------------main circuit
          if(power > zas_ref)                  //if the voltage of the.1
          {
           if((aku < aku_min)&&(sol < sol_ref))
            {
            PORTC &=~ 0x04;                     //enable kanal 1
             PORTC |= 0x08;                     //disable kanal 2
            LCD_GoTo(21,0); LCD_WriteText(napis3);  //text zas-1
             }
          }
          break;
          case 2:
          if(power > zas_ref)
          {
           if((aku > aku_max)||(sol > sol_ref))
          {
            PORTC |= 0x04;                     //disable kanal 1
           PORTC |= 0x08;                     //disable kanal 2               
          }
          }   
          break;
          case 3://--------------------------backup circuit
          if(power < zas_ref)                  //if there is no voltage in the circuit.1
          {
           if((aku < aku_min)&&(sol < sol_ref))
           {
           PORTC |= 0x04;                     //disable kanal 1
            PORTC &=~ 0x08;                     //enable kanal 2
            LCD_GoTo(21,0); LCD_WriteText(napis4);  //text zas-2
           }
          }
          break;
          case 4:
          if(power < zas_ref)
          {
           if((aku > aku_max)&&(sol > sol_ref))
           {
            PORTC |= 0x08;                     //disable kanal 2
            PORTC |= 0x04;                     //disable kanal 1
           }
          } 
          break;
          case 5://---------------------------power status
          if (sol > sol_ref)
          {
          LCD_GoTo(21,0); LCD_WriteText(napis2);   //text solar
          }
          if((aku > aku_stab)&&(sol < sol_ref))
          {
           LCD_GoTo(21,0); LCD_WriteText(napis1);   //text -----
          }
          break;
    //--------------------------end automatic power switch circuits
          default:
          break;
         }
    //----- MENU LCD four lines of 20 characters
         unsigned char key;
         for(key=4; key<7; key++)   
         if(!(PIND & _BV(key)))
         {
          switch(key)//************** ta część jest w fazie projektowania
          {
           case 4://przełączenie do menu ustawień czasu i daty zegara
           LCD_GoTo(0,0);
           LCD_WriteText("                                         ");//czysczenie LCD
           LCD_GoTo(0,1);
           LCD_WriteText("                                         ");
           while(1)
           {
            LCD_GoTo(0,0);   LCD_WriteText("USTAW CZAS");
            LCD_GoTo(10,1);  LCD_WriteText("18:00");//ustaw czas
            LCD_GoTo(20,0);   LCD_WriteText("USTAW DATE");
            LCD_GoTo(30,1);  LCD_WriteText("10/10.10");//ustaw date
            {
            if(!(PINA & _BV(7)))//jeżeli naciśnięty to wyjście z petli
             {
              goto exit;
             }
            }
           }
           break;
           case 5://przełączenie do menu nastaw zegara sterującego
           LCD_GoTo(0,0);
           LCD_WriteText("                                         ");//czyszczenie LCD
           LCD_GoTo(0,1);
           LCD_WriteText("                                         ");
           while(1)
           {
            LCD_GoTo(0,0);   LCD_WriteText("K-1");
            LCD_GoTo(6,0);   LCD_WriteText("01:00");//ustaw czas k-1 wł  poniedziałek-piątk
            LCD_GoTo(13,0);  LCD_WriteText("11:00");//ustaw czas k-1 wył
            LCD_GoTo(0,1);   LCD_WriteText("K-2");
            LCD_GoTo(6,1);   LCD_WriteText("02:00");//ustaw czas k-2 wł
            LCD_GoTo(13,1);  LCD_WriteText("12:00");//ustaw czas k-2 wył
            LCD_GoTo(20,0);  LCD_WriteText("K-3");
            LCD_GoTo(26,0);  LCD_WriteText("03:00");//ustaw czas k-1 wł sob,niedziela
            LCD_GoTo(33,0);  LCD_WriteText("13:00");//ustaw czas k-1 wył
            LCD_GoTo(20,1);  LCD_WriteText("K-4");
            LCD_GoTo(26,1);  LCD_WriteText("04:00");//ustaw czas k-2 wł
            LCD_GoTo(33,1);  LCD_WriteText("14:00");//ustaw czas k-2 wył
            {
            if(!(PINA & _BV(7)))//jeżeli naciśnięty to wyjście z petli
             {
              goto exit;
             }
            }
           }   
           break;
           case 6://przełączenie do menu sterowania kanałami 1-2-3-4 (230V)
           LCD_GoTo(0,0);
           LCD_WriteText("                                         ");//czyszczenie LCD
           LCD_GoTo(0,1);
           LCD_WriteText("                                         ");
           while(1)
          {
            LCD_GoTo(0,0);   LCD_WriteText("OBW-1");
            LCD_GoTo(11,1);  LCD_WriteText("zalaczony");   //obwód nr1 230V
            LCD_GoTo(0,1);   LCD_WriteText("OBW-2");
            LCD_GoTo(11,1);  LCD_WriteText("zalaczony");   //obwód nr2 230V
            LCD_GoTo(20,0);  LCD_WriteText("OBW-3");
            LCD_GoTo(31,0);  LCD_WriteText("zalaczony");   //obwód nr3 230V
            LCD_GoTo(20,1);  LCD_WriteText("OBW-4");
            LCD_GoTo(31,1);  LCD_WriteText("zalaczony");   //obwód nr4 230V
            if(!(PINA & _BV(7)))//jeżeli naciśnięty to wyjście z petli
            {
             goto exit;
            }
           }
           break;
          {}exit:
          default:
          LCD_GoTo(0,0);
          LCD_WriteText("                                         ");
          LCD_GoTo(0,1);
          LCD_WriteText("                                         ");
          break;
          }
         }
        }
        if(!(PINA & _BV(7)))
        PORTB ^=_BV(0);   //podświetlenie LCD PORTB pin 1
        _delay_ms(200);
       }
      }
    //-----------------------------
      LCD_GoTo(1,0);   LCD_WriteText("16/10/10");   //będzie wyświetlanie daty
      LCD_GoTo(10,0);  LCD_WriteText("PON");      //będzie wyświetlanie dnia tygodnia
      LCD_GoTo(14,0);  LCD_WriteData(buf_t2);         //jednostki godzin
      LCD_GoTo(15,0);  LCD_WriteData(buf_t3);         //dziesiatki godzin
      LCD_GoTo(16,0);  LCD_WriteText(":");         //dwukropek
      LCD_GoTo(17,0);  LCD_WriteData(buf_t4);         //jednostki minut
      LCD_GoTo(18,0);  LCD_WriteData(buf_t5);         //dziesiatki minut
      LCD_GoTo(0,1);   LCD_WriteText("AKU");
      LCD_GoTo(4,1);   LCD_WriteText(dtostrf(aku=aku,4,1,buffer_n));//napięcie akumulatora
      LCD_GoTo(8,1);   LCD_WriteText("V");
      LCD_GoTo(10,1);  LCD_WriteText("SOL");
      LCD_GoTo(14,1);  LCD_WriteText(dtostrf(sol=sol,4,1,buffer_n));//napięcie solara
      LCD_GoTo(18,1);  LCD_WriteText("V");
      LCD_GoTo(20,1);  LCD_WriteText(dtostrf(lad=lad,4,1,buffer_n));//prąd ładowania
      LCD_GoTo(24,1);  LCD_WriteText("A");
      LCD_GoTo(28,0);  LCD_WriteText("AKU");
      LCD_GoTo(27,1);  LCD_WriteText(dtostrf(inpower=inpower,4,1,buffer_n));//prąd akumulatora
      LCD_GoTo(31,1);  LCD_WriteText("A");
      LCD_GoTo(35,0);  LCD_WriteText("OBC");
      LCD_GoTo(34,1);  LCD_WriteText(dtostrf(out=out,4,1,buffer_n));//prąd obciążenia(obwody 12V)
      LCD_GoTo(38,1);  LCD_WriteText("A");
    //------------------------------------
     }//end while
    return;
    }//end main
    //********** END MAIN **********

    0 6
  • #2 10 Paź 2010 02:52
    p_zag
    Poziom 13  

    Witam
    Co do obsługi TWI i PCF8583 to zobacz to
    [Atmega8][C] Atmega8 i TWI , ale jak zacząć...
    , a później zobacz tu
    [Atmega8][C] Atmega8 i TWI na przykładzie zegara LED
    . Pisałem co prawda na Atmege8, ale powinno też działać z Atmegą32 po niewielkich poprawkach (trzeba dostosować rejestry dla Atmegi32). Układ scalony PCF8583 jest nie tylko zegarkiem, ale też i pamięcią. Jak wykorzystać pamięć PCF8583 pokazałem w projekcie "[Atmega8][C] Atmega8 i TWI na przykładzie zegara LED" i tam służy do zapamiętania stopnia jasności świecenia wyświetlaczy LED. Jako podtrzymywanie zasilania PCF8583 służy kondensator o dużej pojemności co dla mnie było wystarczające.

    Życzę powodzenia
    Piotr

    0
  • #3 10 Paź 2010 11:59
    margas4542
    Poziom 16  

    Witam..dziękuje z linki ale z obydwoma przykładami już się zapoznałem i próbowałem implantacji procedur obsługi TWI do mojego kodu co jak można się domyśleć skończyło się fiaskiem....albowiem lista komunikatów o nieprawidłowościach w kodzie była dłuższa niż sam program wskazując również na linie kodu z którymi wcześnie nie było problemów...próba dopasowania kodu z postu
    [Atmega8][C] Atmega8 i TWI , ale jak zacząć...również zakończyła się niepowodzeniem z powodu komunikatów o niewłaściwych definicjach TWI...?...datashet swoje a praktyka swoje...rezultat w moim przypadku czyli osoby usiłującej napisać kawałek kodu na swoje potrzeby jest przygnębiający...

    0
  • #4 10 Paź 2010 13:32
    tadzik85
    Poziom 38  

    W inicjacji TWI nie widzę włączenia TWI. Pokaż kody obsługi twi , start stop send read.

    0
  • #5 10 Paź 2010 13:55
    margas4542
    Poziom 16  

    Ok...ten częściowy kod jest nieco zmodyfikowany ale teraz też lista komunikatów o błędnych wywołaniach funcji jest dłuższa niż program...

    Code:

    //#######################################
    //########## A T M E G A _ 3 2 ##########
    //#######################################
    #include <stdint.h>
    #include <avr/io.h>
    #include <stdlib.h>
    #include <avr/interrupt.h>
    #include <TWI.h>     //biblioteka radzia
    #include "HD44780.h"
    //-----define variable ADC
    char buffer_n[8];
    volatile uint16_t pomiar[4] __attribute__((section(".noinit")));
    void inline SetAdcKanal(unsigned char kanal)
    {
     ADMUX = ((ADMUX&0xE0)+ kanal);
    }
    double aku;
    double lad;
    double sol;
    double out;
    double power;
    double inpower;
    //-----define threshold voltage
    float aku_min = 11.5;
    float aku_max = 14.2;
    float aku_stab = 14.0;
    float sol_ref = 13.0;
    float zas_ref = 10.0;
    //-----define TWI and PCF8583
    unsigned char czas[4]={0,}; // zerowanie wszystkich elementów tablicy
    unsigned char PCF_time;
    unsigned char buf_t2;
    unsigned char buf_t3;
    unsigned char buf_t4;
    unsigned char buf_t5;
    #define zegar 0xA0

    int INT=0;         //flaga przerwania
    void INT1_initalize(void)
    {
     MCUCR = 0b00000001;     
     GICR = 0b01000000;   
    }
    ISR(INT1_vect)   
    {
     INT=1;
    }
    //-----
    //***** MAIN
    int main()
    {
     DDRA=0xC0;      //znacznik PORTA6 do wykorzystania
     PORTA=0x80;   //pul-up klawisza podświetlenia LCD
     DDRB=0x01;      //podświetlenie LCD (reszta pinów 4 bity,RS,RW,E pod LCD)
     DDRC=0xFC;      //wyjścia sterujące oraz SCL SDA układu PCF8583 oraz 24C04
     PORTC=0x03;   //pul-up dla SCL SDA INT1 układu PCF8583 oraz 24C04
     DDRD=0x00;      //wejścia klawiatura oraz INT1 układu PCF8583
     PORTD=0xF8;   //pull-up klawiatura oraz INT1 układu PCF8583
    //----- LCD init
     LCD_Initalize();
     _delay_ms(200);
    //----- ADC init
     ADMUX = _BV(REFS0)|_BV(REFS1)|_BV(ADLAR);
     ADCSRA = _BV(ADEN)|_BV(ADPS0)|_BV(ADPS1)|_BV(ADPS2);
    //----- TWI init
     TWSR =0x00;    // Preskaler = 1  ->> TWPS1=0 TWPS0=0
     TWBR =0x48;   //((F_PU/100000Hz)-16)/2
     INT1_initalize();
     sei();
     TWI_initalize();
     while(1)
     {
    //--------------------------zegar
      TWI_zapis(zegar,0x00,0b00000000); // ustawienie początkowe zegara pcf8583 (zerowanie)
      for(;;)
      {
       if (INT==1)
       {
        volatile unsigned char czas[4] ={0,}; // zerowanie wszystkich elementów tablicy
        unsigned char czasPCF8583 =0;
        unsigned char buf2;
        unsigned char buf3;
        unsigned char buf4;
        unsigned char buf5;
        //sekundy na LCD są zbędne
        czasPCF8583 =TWI_odczyt(zegar,0x04);
        czas[0] =(czasPCF8583 & 0b00110000) >> 4;   // dziesatki_godzin         
        czas[1] =czasPCF8583 & 0b00001111;      // godziny
        czasPCF8583 =TWI_odczyt(zegar,0x03);
        czas[2] =czasPCF8583 >> 4;             // dziesatki_minut
        czas[3] =czasPCF8583 & 0b00001111;      // minuty
       
        buf2=(czas[0]+0x30);
        buf3= (czas[1]+0x30);   
        buf4= (czas[2]+0x30);   
        buf5= (czas[3]+0x30);   
       
        LCD_GoTo(1,0);   LCD_WriteText("16/10/10");   //będzie wyświetlanie daty
        LCD_GoTo(14,0);  LCD_WriteData(buf2);         //jednostki godzin
        LCD_GoTo(15,0);  LCD_WriteData(buf3);         //dziesiatki godzin
        LCD_GoTo(16,0);  LCD_WriteText(":");         //dwukropek
        LCD_GoTo(17,0);  LCD_WriteData(buf4);         //jednostki minut
        LCD_GoTo(18,0);  LCD_WriteData(buf5);         //dziesiatki minut

        INT=0;
       }   
      }

    0
  • #6 10 Paź 2010 14:08
    tadzik85
    Poziom 38  

    To pokaż kilka pierwszych błędów.

    0
  • #7 10 Paź 2010 20:47
    margas4542
    Poziom 16  

    Build started 10.10.2010 at 13:19:40
    avr-gcc.exe -mmcu=atmega32 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT main.o -MF dep/main.o.d -c ../main.c
    In file included from c:/avr/winavr/lib/gcc/../../avr/include/util/delay.h:39,
    from c:/avr/winavr/lib/gcc/../../avr/include/HD44780.h:14,
    from ../main.c:9:
    c:/avr/winavr/lib/gcc/../../avr/include/util/delay_basic.h: In function 'TWI_initalize':
    c:/avr/winavr/lib/gcc/../../avr/include/util/delay_basic.h:65: error: storage class specified for parameter '_delay_loop_1'
    c:/avr/winavr/lib/gcc/../../avr/include/util/delay_basic.h:66: error: storage class specified for parameter '_delay_loop_2'
    c:/avr/winavr/lib/gcc/../../avr/include/util/delay_basic.h:82: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
    c:/avr/winavr/lib/gcc/../../avr/include/util/delay_basic.h:104: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
    In file included from c:/avr/winavr/lib/gcc/../../avr/include/HD44780.h:14,
    from ../main.c:9:
    c:/avr/winavr/lib/gcc/../../avr/include/util/delay.h:79: error: storage class specified for parameter '_delay_us'
    c:/avr/winavr/lib/gcc/../../avr/include/util/delay.h:80: error: storage class specified for parameter '_delay_ms'
    c:/avr/winavr/lib/gcc/../../avr/include/util/delay.h:111: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
    c:/avr/winavr/lib/gcc/../../avr/include/util/delay.h:149: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
    ../main.c:12: error: section attribute not allowed for 'pomiar'
    ../main.c:14: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
    ../main.c:24: error: parameter 'aku_min' is initialized
    ../main.c:25: error: parameter 'aku_max' is initialized
    ../main.c:26: error: parameter 'aku_stab' is initialized
    ../main.c:27: error: parameter 'sol_ref' is initialized
    ../main.c:28: error: parameter 'zas_ref' is initialized
    ../main.c:30: error: parameter 'czas' is initialized
    ../main.c:38: error: parameter 'INT' is initialized
    ../main.c:40: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
    ../main.c:44: warning: 'signal' attribute only applies to functions
    ../main.c:44: warning: 'used' attribute ignored
    ../main.c:44: warning: 'externally_visible' attribute ignored
    ../main.c:45: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
    ../main.c:51: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
    ../main.c:308: error: old-style parameter declarations in prototyped function definition
    ../main.c:306: error: expected '{' at end of input
    make: *** [main.o] Error 1
    Build failed with 22 errors and 3 warnings...

    Dodano po 2 [godziny] 58 [minuty]:

    czy może mi ktoś wyjaśnić dlaczego cały program się sypie już po dodaniu do #include biblioteki TWI ????????....

    Dodano po 3 [godziny] 26 [minuty]:

    Czy na tym forum są jeszcze jacyś fachowcy bo odnoszę wrażenie że wszystkich wymiotło albo na samą myśl o I2C ze strachu dostają gęsiej skórki....a ja się dalej bujam z tym kodem.......

    Code:

    //#######################################
    //########## A T M E G A _ 3 2 ##########
    //#######################################
    #include <stdint.h>
    #include <avr/io.h>
    #include <stdlib.h>
    #include <avr/interrupt.h>
    #include <util/twi.h>
    #include "HD44780.h"
    //-----
    //-----nastawy czasu zegara
    #define zegar 0xA0
    unsigned char czas_hh , czas_h , czas_mm , czas_m , czas_ss , czas_s;
    volatile unsigned char czas[6] ={0,}; //zerowanie elementów tablicy
    unsigned char PCF_time , buffer_t;
    unsigned char set_hh,set_h,set_mm,set_m,set_ss,set_s; //zmienne czasu do zapisu
    unsigned char Reset_to_Write[3] ={0,}; //zerowanie elementów tablicy po zapisie
    //-----funkcje obsługi TWI
    void TWI_start(void)// sygnał START
    {
     TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
     while (!(TWCR & (1<<TWINT)));
    }
    void TWI_stop(void)// sygnał STOP
    {
     TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
     while ((TWCR & (1<<TWSTO)));
    }
    void TWI_write(char data)// transmisja bajtu danych
    {
     TWDR = data;
     TWCR = (1<<TWINT) | (1<<TWEN);
    while (!(TWCR & (1<<TWINT)));
    }
    char TWI_read(char ack)//odczyt bajtu danych
    {
     TWCR = ack
     ? ((1 << TWINT) | (1 << TWEN) | (1 << TWEA))
     : ((1 << TWINT) | (1 << TWEN)) ;
     while (!(TWCR & (1<<TWINT)));
     return TWDR;
    }
    int przerwanie=0;
    void INT1_init(void)
    {
     MCUCR = 0x01;     
     GICR = 0x80;   
    }
    ISR(INT1_vect)   
    {
     przerwanie=1;
    }
    //-----reszta
    unsigned char key;
    //***** MAIN
    int main()
    {
     DDRA=0xC0;      //znacznik klawiatury PA6
     PORTA=0x80;    //pul-up klawisza podświetlenia LCD
     DDRB=0x01;      //podświetlenie LCD (reszta pinów 4 bity,RS,RW,E pod LCD)
     DDRC=0xFC;      //wyjścia sterujące oraz SCL SDA układu PCF8583 oraz 24C04
     PORTC=0x03;   //pul-up dla SCL SDA INT1 układu PCF8583 oraz 24C04
     DDRD=0x00;      //wejścia klawiatura oraz INT1 układu PCF8583
     PORTD=0xF8;   //pull-up klawiatura oraz INT1 układu PCF8583
    //----- LCD init
     LCD_Initalize();
     _delay_ms(200);
    //----- ADC init
    //----- TWI init
     TWSR=0x00;         //preskaler I2C
     TWBR=0x48;         //((F_CPU / 100000UL - 16) / 2);
     TWI_start();

     INT1_init();
     sei();
     while(1)
     {
    //--------------------------zegar
    //  for(;;)
      {
    //   if (przerwanie==1)
       {
        PCF_time=TWI_read(0x04);
        czas[0]=(PCF_time & 0x30) >> 4;  //dziesiatki_godzin         
        czas[1]=PCF_time & 0x0F;         //jednostki godzin
        PCF_time=TWI_read(0x03);
        czas[2]=PCF_time >> 4;            //dziesatki_minut
        czas[3]=PCF_time & 0x0F;         //jednostki minut
        PCF_time =TWI_read(0x02);
       
        czas_hh= (czas[0]+0x30);
        czas_h= (czas[1]+0x30);   
        czas_mm= (czas[2]+0x30);   
        czas_m= (czas[3]+0x30);
       }
    //    przerwanie=0;
    //--------------------------ustawanie czasu zegara oraz nastawy inne
      }
    //--------------------------pomiary napięć adc
      int kan;
      for(kan = 0; kan<5; kan++)
      {
       //reszta programu pomiary napiec i monitorowanie aku oraz zasilania z prostownika
     
       }
      }
    //-----------------------------
      LCD_GoTo(1,0);   LCD_WriteText("16/10/10");   //będzie wyświetlanie daty
      LCD_GoTo(10,0);  LCD_WriteText("PON");      //będzie wyświetlanie dnia tygodnia
      LCD_GoTo(14,0);  LCD_WriteText(itoa (czas_hh,buffer_t,10));         //jednostki godzin
      LCD_GoTo(15,0);  LCD_WriteText(itoa (czas_h,buffer_t,10));         //dziesiatki godzin
      LCD_GoTo(16,0);  LCD_WriteText(":");         //dwukropek
      LCD_GoTo(17,0);  LCD_WriteText(itoa (czas_mm,buffer_t,10));         //jednostki minut
      LCD_GoTo(18,0);  LCD_WriteText(itoa (czas_m,buffer_t,10));         //dziesiatki minut
    //------------------------------------
     }//end while
    return;
    }//end main
    //********** END MAIN **********

    0