Tere,

olen hädas siis AT90CAN128 prose taimeriga. Plaanis kasutada TIMER0-i normal mode-is (või siis võrdlevas), et resettida teatud muutuja mingi x aja tagant. Raualiselt confin taimeri ära (oma rumala mõistuse järgi), panen prescaleri sisse (fclk/1024, 16MHz kell, fosc/8 fuse sees), lülitan interruptid sisse (TOIE0, OCIE0A, sei(), märan int. vectorid ja ei midagi. Kui if lausega vilgutan LED-i TCNT0 (loenduri väärtus) väärtuse järgi, siis on näha, et tulemus on nii 0, 255 kui ka vahepealsed asjas, st loendab alt üles välja, resetib ja alustab otsast peale. Interruptidega on aga jama, nendesse alamprogrammidesse ei jõua.

HEtkel kood muud ei tee, kui paneb paika interruptid, taimerid ja jääb maini passima. Taimeri täitumisel peaks käima ära interrupt vektorites ja LED-i vilgutama.

Koodis on hetkel palju muud kraami ja välja kommenteeritud katsetusi.

Kood:
/*
 * Author : Eggy
 */ 


#define F_CPU 16000000UL
//#define    __AVR_AT90CAN128__    1


#include <avr/io.h>
#include <util/delay.h>
//#include <avr/eeprom.h>
#include <avr/interrupt.h>


#define LED PE4 //led out
#define NUPP PE5 // sisend
#define IMMO_ots PE7 // sisend LÄKS INTERRUPTIKS


#define LED_OFF PORTE |= (1<<LED);
#define LED_ON PORTE &= ~(1<<LED);


/* IMMO SIGNAALI SISEN VAJA DEFINEERIDA */
#define immo bit_is_set(PINE,7) //immosisend, active hi
#define vajutus    bit_is_clear(PINE,5) //nupusisend




void delay_ms( int ms );
volatile int lingiimpulsid;    //glob muutuja interruptile, impulsid lingist
volatile int immoimpulsid; //glob muutuja interruptile, impulsid immo mooduli väljyundist, 20/500mS iga 2sek järel
volatile int immo_olemas; //1 - immo pult on läheduses, 5 seki sees 2 immo impulssi, 0 - immot pole


//int immo_seis(); 


int main (void)
{


//confimine
    DDRE |= (1 << LED);            //LED väljundiks
    DDRE &= ~(1 << IMMO_ots);    //IMMO sisendiks
    DDRE &= ~(1 << NUPP);        //nupp sisendiks




//interruptid paika    
        EIMSK |= (1 << INT6);    // Enable INT6,LINGI SISEND
        EIMSK |= (1 << INT7);    // Enable INT7,immo kohaloleku SISEND
        EICRB = (1 << ISC51);    // Trigger INT6 on falling edge




//Timer0        
        //iga paari seki järelt nullime immocounteri muutuja        
        //OCR0A compare register, selle väärtust võrreldakse TCNT0 ehk counteri väärtusega
    
        TIMSK0 = (1<<TOIE0);    //Overflow interrupt enable
    //    TIMSK0 = (1<<OCIE0A);    //Timer/Counter0 Output Compare Match A Interrupt Enable
            
        
        //TCCR0A = (1<<CS00);        // no prescaler 
        TCCR0A = (1<<CS02) | (1<<CS00);    // prescaler clk/1024
        //NORMAL MODE WGM01 = 0 ja WGM00 = 0
        //OC0A normal port op mode, not connected: COM0A1=0 ja COM0A0=0
        //TCCR0A = (1<<WGM01) | (1<<WGM00); //fast PWM
        //TCCR0A = (1<<WGM01); //CTC mode, COM0A1 ja COM0A0 = 0 -> Normal port operation, OCOA disconnected


        //GTCCR = (1<<TSM); //sync mode    
        //GTCCR = (1<<PSR310); //prescaler reset


        //TIFR0'is TOV0 - overflow int flag ja OCF0A copmare flag
        
    //TCNT0=0x00;        //algpunkt paika, counteri hetkeväärtus    
    //OCR0A=100;        //Compare väärtus?
        
        //OCF0A peaks olema flag, mis näitab comp matchi
        //TOV0 peaks olema flag, mis näitab overflowd
        
//init        
    LED_OFF;
sei();                //Enable Global Interrupt


    




while(0)
{
    if ( TCNT0 > 250 ) //kui comp match linnuke püsti?
    {
        cli();
        TCNT0=0; //nullime kui int ei tee?
        LED_ON;
        delay_ms(1);
        sei();
    }
    else
    {
        cli();
        LED_OFF;
        sei();
    }
}
//kood


while(1){;;}




}//maini lõpp?












void delay_ms( int ms )
{
    for (int i = 0; i < ms; i++)
    {
        _delay_ms(1);
    }
}




/*
3.3V moodulid, pingejagur peab ees olema, 22k jadas ja selle ees 47k vastu maad.
IMMO mooduliks on RFD21733. Puldis olev saatja on mode 0-s, peaks saatma oma id iga 2seki järelt. 
Vastuvõtja model 4/6, mode 4 peaks siis iga kord saatmam välja signaali 20mS pikkuse, kui tuleb sisend,
mode 6 500mS. Samas minul on nii kui pult levis väljundsignaal kõrge, kui väljas siis signaal 0V.
Ehk lingisignaali saamisel tuleb kontrollida IMMO sisendit, kui signaal olemas, siis kontrollid veel mõned korrad ja voila.
*/
            




/*int immo_seis() //return 1 kui immo olema,s return 0 kui ei 
{
        //kontrollime, kas immo ots on kõrge, kui on siis teeme recheki
        
        int n; //immo counter
        n=0;
        
        for (int i=0; i<11; i++) //kontrollime 10x veel n viite järel    
        {    
            delay_ms(10);
            
            if (immo) //ikka on immo signaal olemas?
            {
                n=n+1;
            } 
            
        }
                if (n > 10) //kui tuli 10x kontrollimisel oli signaal ikka alles
                {return 1;}
                else
                {return 0;}
}
*/


//Interrupt Service Routine for INT0
ISR(INT5_vect) 
{
    cli();
    LED_ON;
    delay_ms(10);
    LED_OFF;
    delay_ms(10);
    sei();
}




ISR(TIMER0_OVF_vect)    //Timer int, kui saab aeg täis siis tuleme siia ja kontrollime immo seisu 
{
    // process the timer1 overflow here
/*
    if (immoimpulsid > 2)
    {
        immo_olemas = 1; 
        immoimpulsid=0;
    } //Nullime ka    //tagastame ühe, immo olemas
    else
    {
        immo_olemas = 0;
    }    //tagastame nulli, immo olemas
*/
    cli();
    LED_ON;
    delay_ms(10);
    LED_OFF;
    sei();    




}


ISR(TIMER0_COMP_vect)    //Timer int, kui saab aeg täis siis tuleme siia ja kontrollime immo seisu 
{
    //cli();
    LED_ON;
    delay_ms(10);
    LED_OFF;
    //sei();    
}


ISR(INT7_vect)  //immo signaali sisendi interrupt
{
    //loendame immo signaali olemasolu (iga 2sek intervalliga tuleb 20 või 500mS impulss)
    //a la 5 sekundi sees peab olema vähemalt 2 impulssi?
    
    immoimpulsid++; //pluss üks kui tuleb teine interrupt
}


/*
ISR(INT6_vect)
{    
    cli(); //int off
    //see interrupti  muutuja "Lingiimpulsid" tuleb a la ~1seki möödudes mainis nullida (raualine taimer?)
    //, et ei jääks 3999 impulssi ja siis tolmukübe avab
    
    lingiimpulsid=lingiimpulsid+1;
    
        //if(lingiimpulsid == 4000) kui on puutekalink, uuendab iga interrupti ehk pulsiga lingi poolt
        if(lingiimpulsid == 1)
        {
                //Siin saadame käsu, et uks lahti teha. samas enne peame kontrollima, et kesklukk peal ei oleks.
                //Kui lukk on maas siis enam seda ei lahtitegemise signaali ei saada.
                    
                    //if(immo_seis() == 1)
                    if(1) //siia peab tulema immo muutuja lugemine
                    {
                            LED_ON;
                            delay_ms(500);
                            LED_OFF;
                            delay_ms(100);
                    }


                lingiimpulsid=0; //nullime
                delay_ms(1000); //Sekundi passime tühja, ei kontrolli uuesti, korduvsignaali vältimine
        }
        else
        {


                LED_OFF;    
        }


    sei(); //int on


}