logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Przerwania w AVR, jak zrobić przerwanie przyciskiem

misiek_1987 15 Gru 2009 19:44 2306 2
REKLAMA
  • #1 7393695
    misiek_1987
    Poziom 2  
    Chciałbym napisać przerwanie do mojego programu zegara. Chcialbym aby przerwanie bylo wywolywane zmiana jednego pinu tzn zmiana PINA4 z 1 na 0. Gdy zmienie ten przycisk chcialbym aby wykonalo sie przerwanie.

    oto moj KOD:
    
    int main(void)
    {
    char  B1;
    DDRA=0x00;
    DDRD |= (1 << PD1);
    LCD_Initialize();
    TWI_Init();
    
    ustaw_czas(godzina,minuta,sekunda);//zerowanie zegara
    ustaw_zegar();
    ustaw_czas(godzina,minuta,sekunda);
    
    sei();
    
    do
    {
    	TWI_Start();                        // start transmission
    	TWI_Write(0xD0);                    // write addres of M41T00
    	TWI_Write(0x02);                    // select hours register
    	TWI_Start();                        // repeated start
    	TWI_Write(0xD1);                    // write address for reading data
    	B1 = TWI_Read(NACK);                // read hours register
    	TWI_Stop();                         // stop transmission    
    
    	itoa(((B1>>4)&3),tim,10);
    	LCD_GoTo(0,0); 
    	LCD_WriteText(tim);
    	itoa((B1&15),tim,10);
    	LCD_GoTo(1,0); 
    	LCD_WriteText(tim);
    	LCD_GoTo(2,0); 
    	LCD_WriteText(":");
    
    	TWI_Start();                        // start transmission  
    	TWI_Write(0xD0);                    // write addres of M41T00
    	TWI_Write(0x01);                    // select minutes register  
    	TWI_Start();                        // repeated start
    	TWI_Write(0xD1);                    // write address for reading data
    	B1 = TWI_Read(NACK);                // read minutes register
    	TWI_Stop();                         // stop transmission
    
    	itoa(((B1>>4)&7),tim,10);
    	LCD_GoTo(3,0); 
    	LCD_WriteText(tim);
    	itoa((B1&15),tim,10);
    	LCD_GoTo(4,0); 
    	LCD_WriteText(tim);
    	LCD_GoTo(5,0); 
    	LCD_WriteText(":");
    
    	TWI_Start();                        // start transmission
    	TWI_Write(0xD0);                    // write addres of M41T00
    	TWI_Write(0x00);                    // select seconds register
    	TWI_Start();                        // repeated start         
    	TWI_Write(0xD1);                    // write address for reading data
    	B1 = TWI_Read(NACK);                // read minutes register
    	TWI_Stop();                         // stop transmission
    
    	itoa((B1>>4),tim,10);
    	LCD_GoTo(6,0); 
    	LCD_WriteText(tim);
    	itoa((B1&15),tim,10);
    	LCD_GoTo(7,0); 
    	LCD_WriteText(tim);	
    
    }while(1);
    return 0;
    }
    
    ISR(...)
    {
    	......
    }


    co mam wpisac w nawias ISR() aby obsluzyc przerwanie moim PINEM? Przerwanie ma mi umozliwic mozliwosc zmiany czasu. Tylko nie wiem jak je wywolax
  • REKLAMA
  • #2 7395020
    tmf
    VIP Zasłużony dla elektroda
    To mozna powiedziec dopiero jak powiesz jaki typ procesora posiadasz. W wiekszosci AVRow nie kazdy pin moze generowac przerwanie. Warto przejrzec rodzial poswiecony przerwaniom zewnetrznych w nocie katalogowej twojego procesora.
  • #3 7395596
    misiek_1987
    Poziom 2  
    atmega32
    tyle co sie juz zorientowalem
    to:

    ISR(INT0_vect)
    {
    }

    wówczas zmieniam pind2
    posiedzialem poczytalem i zadzialalo
REKLAMA