Sari la conținut
ELFORUM - Forumul electronistilor

AtTiny13 Sleep Mode si Intrerupere


nana

Postări Recomandate

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
  • 2 săptămâni mai târziu...
  • Răspunsuri 2
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • nana

    2

Top autori în acest subiect

Vizitator 3Nigma

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

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări