Minimalizacja pobieranego prądu.

Tutaj mozesz poruszać tematy ogólne powiązane z elektroniką, np. dyskusje na temat podzespołów, układów, zasad ich działania. Czyli można pisać o wszystkim czego nie da się przyporządkować do innych działów.
Awatar użytkownika
Kulpina
Użytkownik
Posty: 2037
Rejestracja: 28 lip 2005, 16:57
Lokalizacja: Sanok
Kontakt:

Post autor: Kulpina » 26 wrz 2010, 18:12

Wybudzanie resetem w moim wypadku odpada, natomiast w M168 jest możliwość wybudzania przerwaniem od watchdoga.
Co to znaczy?
Można napisać jakąś obsługę tego przerwania tak jak dla timera? Czy procesor po prostu się wybudza i zaczyna w jakimś miejscu program? W jakim miejscu wtedy?

atelszewski
Użytkownik
Posty: 143
Rejestracja: 12 sie 2005, 9:36
Lokalizacja: Banie

Post autor: atelszewski » 26 wrz 2010, 18:39


Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 26 wrz 2010, 18:46

Przerwanie od Watchdoga to właśnie Reset i/lub tgz. Time out. Znaczy to że są 2 przerwania od watchdoga. W nocie pisze że można uzyskać w ten sposób 3 rodzaje przerwań od watchdoga. Zwykłe przerwanie tak jak był to zwykły timer (time out), Reset MPU, oraz obydwa naraz, choć akurat nie wiem do czego to by było przydatne :?:
Time out jest zazwyczaj stosowny do kontrolowania procesów które mogły by sie z jakiegoś powodu zawiesić, jeżeli dany proces nie zresataruje Watchdoga w zadanym czasie to ten zgłasza przerwanie i jest to sygnał że ten proces się zawiesił, lub nie skończył swojego zadania z jakiś przyczyn.

Awatar użytkownika
Ertew
Użytkownik
Posty: 1414
Rejestracja: 03 lip 2005, 10:36
Lokalizacja: Leszno
Kontakt:

Post autor: Ertew » 26 wrz 2010, 18:54

a) Procesor się wybudza i leci dalej program od miejsca w którym skończył (od instrukcji sleep ... power down).

b) Procesor się wybudza, wykonuje przerwanie i wraca do miejsca w którym skończył (patrz punkt a).

Ja myślałem o włączeniu watchdoga i wyłączeniu procesora. Watchdog nie wybudzi tylko po kilku sekundach zresetuje procka.
W teorii powinno działać, w praktyce bywa różnie.


Możesz też użyć zewnętrznego przerwania, wyzwalanego zewnętrznym obwodem RC :wink:

keruseykaryu

Post autor: keruseykaryu » 26 wrz 2010, 20:06

kayron pisze:oraz obydwa naraz, choć akurat nie wiem do czego to by było przydatne
Prosta sprawa. Jak pisze w notce: najpierw przerwanko potem reset. Czyli program się zaklapućkał, przerwanie może wykonać operacje porządkowe i program może iść dalej bo zostanie napisany tak, że jego praca powróci do normy i znów ustawić tryb Interrupt. Jeśli praca będzie tak wadliwa, że przerwanie się nie wykona to nie ma szans, po drugim razie już nastąpi normalny strzał z liścia w procesor. :D (strona 55 pdf-a)
Skompiluj sobie i popatrz co się będzie działo.

Kod: Zaznacz cały

.include "m168def.inc"

.org 0x00
 rjmp reset

.org WDTaddr
 rjmp watchgod

reset:
 ldi R16, low(RAMEND)
 out SPL, R16
 ldi R16, high(RAMEND)
 out SPH, R16
 ldi R16, (1<<WDIE)|(1<<WDE)
 sts WDTCSR, R16
 sei
loop:
 nop
 nop
 nop
 nop
 nop
 nop
 rjmp loop

watchgod:
 nop
 nop
 nop
 reti
Trochę trzeba poczekać przy śledzeniu. Okres przepełnienia to ponad 16ms.
Kulpina pisze:Co to znaczy?
Można napisać jakąś obsługę tego przerwania tak jak dla timera? Czy procesor po prostu się wybudza i zaczyna w jakimś miejscu program? W jakim miejscu wtedy?
Wektor 7. Po takim przerwaniu program wskakuje pod PC=0x000c. (strona 57 pdf-a)

Awatar użytkownika
Kulpina
Użytkownik
Posty: 2037
Rejestracja: 28 lip 2005, 16:57
Lokalizacja: Sanok
Kontakt:

Post autor: Kulpina » 27 wrz 2010, 7:15

Tzn, ze trzeba napisac cos w rodzaju obslugi przerwania od watchdoga?
mniej wiecej tak: ?

//przerwanie od watchdoga
//robi to i tamto
//.
//.
//.
//powerdown
?

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 27 wrz 2010, 15:05

Ja ci opiszę na przykładzie mojej pracy na 3 zmianie (nocka). Wtryskarki do tworzyw sztucznych mają taką faja funkcje w panelu zarządzania produkcją, jak licznik paczek, który będzie odpowiednikiem WatchDoga w realu.
Otóż jeżeli licznik ten osiągnie zadaną liczbę wtrysków/detali, to maszyna w następnym cyklu podczas zamykania formy, będzie sygnalizować dźwiękiem syreny alarmu że paczka została osiągnięta i zaczyna się produkcja następnej.
Teraz przychodzimy do roboty na 10 (22:00) i algorytm wygląda tak:
1 - sprawdzić zasyp i ewentualnie uzupełnić do full, wywalić koszyk na detale do pusta, ustawić sobie licznik paczek tak aby jak koszyk będzie prawie pełny zawył alarm licznik paczek (konfiguracja WatchDoga).
2 - przygotować stanowisko dozorowe i rozpocząć procedurę drzemki (nasz PowerDown)
3 - :!: :arrow: :shock: pobudka (przerwanie od WatchDoga), zawył alarm, koszyk pełny wykonać czynności
3.a - opróżnić koszyk na detale.
3.b - sprawdzić czy w zasypie nie trzeba uzupełnić tworzywa.
3.c czy godzina 2:00 rano TAk- przerwa na posiłek regenujący i skok do punktu 2..
3.d czy godzina 5.30 rano - ups, koniec leberki, za 5 minut będzie się schodzić 1 zmiana trzeba sprzątać, wyłączyć nieznane innym funkcje maszyny, umyć się i do domu.
4. koniec algorytmu pracy na 3 zmianę z funkcją Power Down. :grin:

Awatar użytkownika
Kulpina
Użytkownik
Posty: 2037
Rejestracja: 28 lip 2005, 16:57
Lokalizacja: Sanok
Kontakt:

Post autor: Kulpina » 27 wrz 2010, 16:40

Zrozumiałem, ale nie o to mi chodzi...
To może krótkie pytanie.
Czy można napisać coś takiego jak obsługa przerwania od watchdoga?
SIGNAL(przerwanie_od_watchdoga)
{
//
//
}

keruseykaryu

Post autor: keruseykaryu » 27 wrz 2010, 17:32

Kulpina pisze:Zrozumiałem, ale nie o to mi chodzi...
To może krótkie pytanie.
Czy można napisać coś takiego jak obsługa przerwania od watchdoga?
SIGNAL(przerwanie_od_watchdoga)
{
//
//
}
Owszem. Tylko nie stare i zdezelowane SIGNAL(). Jak już to ISR().

Kod: Zaznacz cały

#include <avr/io.h>
#include <avr/interrupt.h>

ISR(WDT_vect)
{
	WDTCSR = (1<<WDIE);
	PORTB ^= 0xff;
}

int main(void)
{
	DDRB = 0xFF;
	WDTCSR = (1<<WDIE)|(1<<WDE);
	sei();
	while(1);

	return 0;
}

Awatar użytkownika
Kulpina
Użytkownik
Posty: 2037
Rejestracja: 28 lip 2005, 16:57
Lokalizacja: Sanok
Kontakt:

Post autor: Kulpina » 27 wrz 2010, 18:11

Ooo i właśnie tego szukałem :mrgreen:
Teraz pytanie troszku trudniejsze.
Dlaczego ten watchdog działa i wywołuje przerwanie jeśli kwarc wewnętrzny ustawie na 8Mhz, matomiast nie działa gdy ustawie tenże kwarc na 128khz? O.o

keruseykaryu

Post autor: keruseykaryu » 27 wrz 2010, 18:42

Kulpina pisze:Ooo i właśnie tego szukałem :mrgreen:
Teraz pytanie troszku trudniejsze.
Dlaczego ten watchdog działa i wywołuje przerwanie jeśli kwarc wewnętrzny ustawie na 8Mhz, matomiast nie działa gdy ustawie tenże kwarc na 128khz? O.o
A fuski to jak ustawiłeś? CKDIV8 nadal włączony?

Awatar użytkownika
Kulpina
Użytkownik
Posty: 2037
Rejestracja: 28 lip 2005, 16:57
Lokalizacja: Sanok
Kontakt:

Post autor: Kulpina » 27 wrz 2010, 18:44

Ano tak, włączony, a nie może być?

keruseykaryu

Post autor: keruseykaryu » 27 wrz 2010, 18:51

Ano tak, włączony, a nie może być?
A jakie to taktowanie wtedy jest? Myślisz, że program nadąży nad głodnym psem?

Awatar użytkownika
Kulpina
Użytkownik
Posty: 2037
Rejestracja: 28 lip 2005, 16:57
Lokalizacja: Sanok
Kontakt:

Post autor: Kulpina » 29 wrz 2010, 17:54

No wtedy mam 8khz, faktycznie może nie nadążyć :mrgreen:
Zapewne masz rację, a w praktyce sprawdzę to jutro, bo jak narazie oderwały siędwa kabelki i nie mam jużna to siły ;)

[ Dodano: 2010-09-29, 18:53 ]
Dzięki wielkie keruseykaryu, za pomoc przy tym watchdogu :)
Koniec końców chyba zostanę przy moim T0 :)

Pozatym mam wogle jakieś problemy z watchdogiem ^^ czemu on nie respektuje mojego polecenia co do dzielnika? Wyraźnie ustawiłem WDP3 i WDP0 w WDTCSR, do powinno dawac przerwanie co ~8s (nota, str. 49), natomiast przerwanie jest kilkadziesiąt razy na sekundę...

Ostatnie moje pytanie - ile prądu pobiera procek podczas wybudzania? :mrgreen:

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 29 wrz 2010, 20:02

Ja jak miałem problemy z WatchDogiem to przepisałem z noty fragment w ASM AVR i zaczęło działać jak trzeba.

ODPOWIEDZ