Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 3 lis 2024, o 15:10


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 
Autor Wiadomość
PostNapisane: 30 sty 2012, o 18:07 
Offline
Nowy

Dołączył(a): 30 sty 2012
Posty: 8
Pomógł: 0

Próbuje napisać obsługę przycisku, który powodowałby przejście do trybu power down a po kolejnym naciśnięciu wybudzał procesor.
Przycisk podpięty pod int0 z podciągnięciem do VCC.
Inicjalizacja przerwania od int0:
Kod:
void Ext_Interrupt_Init(void)
{
    GICR|=(1<<INT0);
    MCUCR &= ~((1<<ISC01)|(1<<ISC00));
    //MCUCR |=(1<<ISC00);
}


I teraz tak, pomysł był taki że w głównej funkcji programu mam zmienna ustawianą na wartość 1, po wejściu do obsługi przerwania if'a sprawdzającego czy jest 1 i jeśli jest to wykonuje if'a czyli ustawia zmienną na zero i usypia procka. Uspi się ale nie chce się wybudzić, kombinowałem też z zapisem tej zmiennej do eepromu ale za chiny nie chce działać. Może jakaś podpowiedź?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 sty 2012, o 18:23 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27306
Lokalizacja: Szczecin
Pomógł: 1041

Przerwanie musi być wyzwalane poziomem niskim to po pierwsze. Po drugie to pozostaw przerwanie TYLKO do wybudzania, natomiast obsługę przycisku do przełączania w tryb PowerDown daj normalnie w pętli głównej programu i po kłopocie.

Bardzo ciężko coś pomóc na podstawie tylko takiego opisu jaki podałeś.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 sty 2012, o 18:35 
Offline
Nowy

Dołączył(a): 30 sty 2012
Posty: 8
Pomógł: 0

No ok, zaraz sprawdzę czy takie rozwiązanie zadziała. Rozumiem że zezwolenie na przerwanie od int0 włączam dopiero w funkcji obsługującej wciśnięcie przycisku? tylko pytanie teraz czy muszę je wyłączyć po wybudzeniu?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 sty 2012, o 19:09 
Offline
Nowy

Dołączył(a): 30 sty 2012
Posty: 8
Pomógł: 0

Coś sobie nie mogę poradzić...

Obsługa przycisku w pętli głównej:

Kod:
   if(onoff_p)
   {
      _delay_ms(10);
      if(onoff_p)
      {
         pwm=0;//wylączenie podświetlenia lcd
         LCD_Clear();
         LCD_WriteCommand(display_off);//wyłączenie lcd
         GICR|=(1<<INT0);//zezwolenie na przerwanie od int0
         //MCUCR |=((0<<ISC01)|(0<<ISC00));
         set_sleep_mode(SLEEP_MODE_PWR_DOWN);//
         sleep_mode();
      }
   }


obsługa przerwania od int0

Kod:
ISR(INT0_vect)
{
   pwm=eeprom_rb(0x09);//odczyt wartości pwm
   eeprom_busy_wait();//czekaj az odczyta
   LCD_WriteCommand(display_on);//załączenie lcd
   GICR|=(0<<INT0);//wyłączenie zezwolenia na przerwanie od int0
}


mam też ustawione usypianie dla testów na osobnym przycisku i w tym wypadku wszystko działa, zasypia i wstaje bez problemów natomiast gdy używam tylko jednego przycisku to już się kaszani. Po resecie pierwsze naciśnięcie przycisku onoff powoduje zgaszenie lcd na chwile i nic poza tym. Procek to atmega32.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 sty 2012, o 23:00 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27306
Lokalizacja: Szczecin
Pomógł: 1041

No pewnie bo się zapętlasz sam ;) .... wprowadzasz procka w uśpienie i praktycznie zanim puścisz przycisk już go budzisz.

Nie wspomnę o karygodnych mega błędach :( kto w przerwaniu robi takie rzeczy ???

1. wyświetlanie czegoś na LCD !
2. co to za odczytywanie z eeproma i jakieś wait ???? nie słyszał kolega o wbudowanych funkcjach do obsługi eeprom'a jak np eeprom_read_xxxx() ???? żadnych waitów nie potrzeba - a tak to jest koszmar! Poza tym w przerwaniu w ogóle nie robi się dostępu do EEPROM'a
3. a wyłączenie przerwania to powinna być pierwsza instrukcja a nie ostatnia, przecież w trakcie wykonywania tych pierwszych linii kodu, przy wyzwalaniu poziomem - zostaną one wykonane miliony razy w trakcie wciśniętego przycisku

Reasumując - polecam koledze przeczytanie dwóch/trzech rozdziałów z książki "Mikrokontrolery AVR Język C Podstawy programowania"

1. pilot RC5
2. wstęp do systemów czasu rzeczywistego
3. opis zaawansowanej obsługi klawiszy - funkcja SuperDebounce

Nie wspomnę o początku książki, gdzie dobitnie wyjaśniam i odradzam wszystkim próby dokonywania takich operacji jakie tu wyliczyłem w punktach w przerwaniu :(

Sorki - ale jak widać muszę odesłać do książki ponieważ zbyt duże zakresy informacji trzeba byłoby tu poruszać żeby kolegę wyprowadzić na właściwe tory.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2012, o 18:21 
Offline
Nowy

Dołączył(a): 30 sty 2012
Posty: 8
Pomógł: 0

Książkę zakupiłem niedawno i nie doczytałem wszystkiego. Co do wymienionych punktów:
1. nie wyświetlam niczego na lcd to jest komenda do wyłączenia lcd, która jak się okazało jest zbędna.
2. do odczytu eeproma w przerwaniu się przyznaję, nie wiem dlaczego to tam umieściłem. Co do funkcji odczytu to korzystam z wbudowanych plus makro:
Kod:
#define eeprom_rb(addr) eeprom_read_byte ((const unsigned char *)(addr))
#define eeprom_wb(addr, val) eeprom_write_byte ((unsigned char *)(addr), (unsigned char)(val))

w zasadzie zbędne i dobrze że zwrócił kolega na to uwagę. Część obecnego kodu pochodzi sprzed roku i ten fragment akurat jest zaczerpnięty gdzieś z sieci.
3. też się zgodzę.

Reasumując - dlatego właśnie kupiłem tą książkę. Jak się okazało problem nie tkwił w ustawieniach przerwań od int0 a w samej funkcji wyłączającej/załączającej LCD (korzystam z bibliotek radzia). Co do funkcji SuperDebounce to na pewno skorzystam i przeanalizuje przy okazji realizacji nowego projektu.

Teraz jest ok poza jedną rzeczą. Przy pierwszym wciśnięciu klawisza onoff usypia się od razu, natomiast po wybudzeniu i kolejnym wciśnięciu trzeba przycisk trzymać już znaczny czas, nie wiem skąd to się bierze.

Kod:
void after_stby(void)
{
   GICR|=(0<<INT0);//wyłączenie zezwolenia na przerwanie od int0
   pwm=eeprom_read_byte( (uint8_t  *) 0x09);
   }

ISR(INT0_vect)
{
   after_stby();
   }


Kod:
      if(onoff_p)
      {
         _delay_ms(30);
         if(onoff_p)
         {
            GICR|=(1<<INT0);//zezwolenie na przerwanie od int0
            LCD_Clear();
            sbi(buz_port,buz_bit);
            _delay_ms(20);
            cbi(buz_port,buz_bit);
            pwm=0;//wylączenie podświetlenia lcd
            _delay_ms(20);
            set_sleep_mode(SLEEP_MODE_PWR_DOWN);//
            sleep_mode();
            }
         }



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 lip 2012, o 23:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2011
Posty: 401
Lokalizacja: Siedlce
Pomógł: 7

Usypianie i budzenie procesora jednym i tym samym przerwaniem można zrobić tak:
Nazwy rejestrów dotyczą procesora ATMega88PA - dla innych mogą się nieco różnić.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Oczywiście najpierw należy skonfigurować przerwanie do wyzwalania zboczem rosnącym lub zmianą stanu.
U mnie działa (raczej bezbłędnie - do tej pory nie zauważyłem błędów) i służy do usypiania procesora gdy padnie zasilanie główne.

I jeszcze kawałek schematu do tego:
Obrazek

_________________
Czekamy na RedBook'a!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lip 2012, o 00:52 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

No sprytnie kolego szopler sprytnie gratuluje rozwiązania
myślę że to załatwi problem , aczkolwiek mozna trochę skrócić :)

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lip 2012, o 21:29 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2011
Posty: 401
Lokalizacja: Siedlce
Pomógł: 7

Słucham propozycji... :?:
Czyżby chodziło o marny "debouncing"?

_________________
Czekamy na RedBook'a!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lip 2012, o 21:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

dokładnie :)

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lip 2012, o 21:43 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27306
Lokalizacja: Szczecin
Pomógł: 1041

To teraz ja panowie mam pytanko do tego schematu (sorry za poziom pytanka - no ale to zahacza jakby o analogówkię ;) ... więc dlatego nie do końca rozumiem i dopytuję).

VPP - to rozumiem, że napięcie zasilania np +5V z zasilacza, ale jak działa w tym układzie i spełnia swoją rolę dioda D2 ... ona mi coś w głowie nie chce przejść, hmm przetrawić się ;) ktoś coś podpowie?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lip 2012, o 21:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

Mirku przecież to proste przypatrz się zasilanie na VPP masz z 5V albo z BAT
i teraz zależnie które jest/występuje to jest załączane dlatego siedzą tam zaporowo shottkie :)
strasznie malutki ten schemat wiec coś mogłem pominąć , ale taka jest idea by nie było zwarcia miedzy dwoma różnymi zasilaniami
i zachowana była ciągłość

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lip 2012, o 21:55 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27306
Lokalizacja: Szczecin
Pomógł: 1041

eeeeh zaraz - no toż ja nawet nie zauważyłem że tam po prawej jest napis SUPPLY a myślałem że tam jest podłączony klawisz, który zwiera do GND .... no tak to uffff ok rozumiem działanie D2 .... ale teraz - gdzie ten przycisk ??? ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lip 2012, o 01:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2011
Posty: 401
Lokalizacja: Siedlce
Pomógł: 7

Trochę Was podpuściłem ;)
Delaye były potrzebne bo nie mam obecnie sprawnej baterii i zamiast zenerki wstawiłem przycisk normalnie zwarty żeby sumulować działanie układu... w docelowym kodzie tego nie będzie... :lol:

_________________
Czekamy na RedBook'a!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lip 2012, o 08:24 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27306
Lokalizacja: Szczecin
Pomógł: 1041

szopler napisał(a):
Trochę Was podpuściłem ;)
Delaye były potrzebne bo nie mam obecnie sprawnej baterii i zamiast zenerki wstawiłem przycisk normalnie zwarty żeby sumulować działanie układu... w docelowym kodzie tego nie będzie... :lol:


Nie za bardzo rozumiem o co chodzi ;) ale ok

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 6 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO