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