nana Postat Octombrie 14, 2010 Partajează Postat Octombrie 14, 2010 Am incercat sa fac urmatorul circuit prin care sa masor o tensiune cu ajutorul adc-ului, la apasarea unui buton si mentinerea acestuia. Problema este in felul urmator Procesorul se afla in run la apasarea butonului intra in intrerupere care teoretic daca ar fi in sleep ar trebui sa imi activeze procesorul si sa inceapa sa ruleze. citirea tensiuni si conversia dupa care sa intre din nou in sleep pana la o noua apasare pe buton. Problema este ca in proteus incerc simularea circuitului astfel incat sa functioneze circuitul, iar la apasarea butonului imi citeste tensiunea si se blocheaza proteusul. Daca cineva a mai lucrat cu power management-ul la atmel pls help !! Si 2 am citit si recitit datasheetul, si sigur cred ca ceva imi scapa !! P.s intreruperea functioneaza si citirea adc-ului, managementul sleep nu merge!! #include <avr/io.h>#include <avr/interrupt.h>#include <avr/sleep.h>#include <avr/pgmspace.h>#include <util/delay.h>#define F_CPU 1000000ULint ReadADC(void){ ADMUX |= (0 << REFS0); // VCC Referinta ADMUX = 2;// ADC2 PB.4 ADCSRA |= (1 << ADSC); // Start Conver while((ADCSRA & 0x40) !=0){}; //wait for conv complete return ADC;} ISR(INT0_vect){sleep_disable();adc_init();while((PINB&0x02)==0){if(ReadADC()<645) PORTB |=(1<<0);else PORTB &=~(1<<0);//LED off 1s}sleep_cpu();sleep_enable();}void adc_init(void){ADMUX |= (0 << REFS0); // VCC as ReferenceADMUX |= (1 << MUX1) | (0 << MUX0); // ADC2 PB.4ADCSRA |= (1 << ADEN); // Enable ADC}int main(void){DDRB |=(0<<PB1); //set PB1(INT0) Output Uitate la datasheet PORTB |=(1<<PB1);DDRB |= (1<<PB0); //Set PB0 OutputDDRB &=~(1<<PB4); //Set PB4 Input//setari intreruperiGIMSK = _BV(INT0); // int - Enable external interrupts int0MCUCR=( 1 << SE )|(1 << SM1) ; // int - Global enable interrupts // la orice schimbareset_sleep_mode(SLEEP_MODE_PWR_DOWN);sei();ADMUX |= (0 << REFS0); // VCC as ReferenceADMUX |= (1 << MUX1) | (0 << MUX0); // ADC2 PB.4ADCSRA |= (1 << ADEN); // Enable ADCwhile(1){}return 1;} Link spre comentariu
Vizitator 3Nigma Postat Octombrie 26, 2010 Partajează Postat Octombrie 26, 2010 S-a rezolvat problema ? Am văzut ceva ce mi-a atras atenția : ISR(INT0_vect){... sleep_cpu(); sleep_enable();}DIASM output: ;sleep_cpu(); b6: 88 95 sleep ;sleep_enable() b8: 85 b7 in r24, 0x35 ; 53 ba: 80 62 ori r24, 0x20 ; 32 bc: 85 bf out 0x35, r24 ; 53 ;setează bit SE în MCUCR Foaia de catalog a lui t13:The SE bit must be written to logic one to make the MCU enter the sleep mode when the SLEEP instruction is executed.Cu alte cuvinte : inversează ordinea apelului la funcții și vezi unde ajungi . Link spre comentariu
nana Postat Octombrie 27, 2010 Autor Partajează Postat Octombrie 27, 2010 Da stiu deja m-am ajutat singur si am rezolvat problema! Asa era trebuiau inverrsate ca sa activez mai intai se si dupa sa intru in sleep. Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum