Teade

Collapse

Foorumi reeglid.

Foorumi reeglistik on uuendatud. Palume tutvuda ja arvesse võtta.
See more
See less

Atmeli AT90CAN128 - taimer ja interrupt

Collapse
X
 
  • Filter
  • Kellaaeg
  • Show
Clear All
new posts

    Atmeli AT90CAN128 - taimer ja interrupt

    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
    
    
    }
Working...
X