<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=12374&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-07-19T22:01:36+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=12374&amp;mode</id>
<entry>
<author><name><![CDATA[teres]]></name></author>
<updated>2015-07-19T22:01:36+01:00</updated>
<published>2015-07-19T22:01:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12374&amp;p=134962#p134962</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12374&amp;p=134962#p134962"/>
<title type="html"><![CDATA[Re: Problem z odczytanie stanu pinu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12374&amp;p=134962#p134962"><![CDATA[
Podrzucam wersję z obsługą INT0 do wstawania ze stanu uśpienia (podczas normalnej pracy jest wyłączany), oprócz tego praca teraz też odbywa się z usypianiem procka pomiędzy kolejnymi wywołaniami z WDT. Mam wrażenie, że ta wersja i tak jest mocno niestabilna. Co którąś poprawkę w kodzie działa albo i nie  <img src="https://forum.atnel.pl/images/smilies/icon_rolleyes.gif" alt=":roll:" title="Udaje, że to nie on" /> Na przykład teraz nie chce mi się już procek obudzić  <img src="https://forum.atnel.pl/images/smilies/icon_evil.gif" alt=":evil:" title="Zły" /> <br />EDIT: pomogło ponowne wywołanie ustawie watchdoga przy wyjściu z Deepsleep'a<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/sleep.h&gt;<br />#include &lt;avr/wdt.h&gt;<br /> <br />// Defined Pins <br />#define RED_LED_PIN PB4<br />#define YELLOW_LED_PIN PB3<br />#define GREEN_LED_PIN PB2<br />#define EXTRAGREEN_LED_PIN PB0<br /><br />#define CHANGE_LED_STATUS(LED){PORTB = PORTB ^ (1 &lt;&lt; LED);}<br />#define TURN_LED_ON(LED){PORTB = PORTB | (1 &lt;&lt; LED);}<br />#define TURN_LED_OFF(LED){PORTB = PORTB &amp; ~(1 &lt;&lt; LED);}<br /><br />volatile uint8_t LockMode = 0;// Locks INT0 - not used currently<br />volatile uint8_t TimesButtonWasPressed = 0;<br /><br />volatile uint8_t push_key_debounce = 0;<br />volatile uint8_t push_key_pressed = 0;<br /><br />char SecondsBeforeSleep = 5;//TODO make longer<br />volatile uint8_t WatchdogNoActionCount = 0;// Number Watchdog interrupt was called, used to calculate no action time<br />volatile uint8_t WentToSleep = 0;// Stores information if the uC was in sleeping mode<br />volatile uint8_t GoToSleepFlag = 0;// This variable hold information whether uC should go to deep sleep<br /><br /><br />/*<br /><br />Resets watchdog<br />*/<br />void ResetWatchdog(void){<br />cli();<br />wdt_reset();<br />sei();<br />}<br /><br /><br />/*<br />Normal watchdog timeout - 125ms<br />*/<br />void NormalWatchdog(void){<br />cli();<br />wdt_reset();<br />WDTCR |= (1&lt;&lt;WDCE);// Watchdog change enable<br />WDTCR = (1&lt;&lt;WDP1) | (1&lt;&lt;WDP0);// Prescale timer to 125ms<br />WDTCR |= (1&lt;&lt;WDTIE);// Enable watchdog timer interrupts<br />sei();<br />}<br /><br /><br />/*<br />Sets INT0 mode to triggered by low level<br />Used only to wake up from power down<br />Only &quot;level interrupt&quot; allows waking up<br />*/<br />void INT0LowLevelInterrupt(void){<br />GIMSK |= (1 &lt;&lt; INT0);// External Interrupt Request 0 Enable<br />MCUCR &amp;= ~((1&lt;&lt;ISC01)|(1&lt;&lt;ISC00));// The low level on INT0 generates an interrupt request<br />}<br /><br />/*<br />During normal operation INT0 can be disabled<br />*/<br />void DisableINT0(void){<br />GIMSK &amp;= ~(1 &lt;&lt; INT0);// Disable INT0 in GIMSK register<br />}<br /><br />// Create setup method that disables ADC, Analog Comparator, Internal Reference Voltage and other no useful stuff<br />void Setup(void){<br />// Setup ports<br />DDRB = 0xFF &amp; ~(1 &lt;&lt; DDB1);// Set all to output, PORTB 1 (INT0) configured as input with pull-up<br />PORTB = 0x00 | (1 &lt;&lt; PORTB1);// all other low <br /><br />// Low power mode<br />ACSR &amp;=~ (1&lt;&lt;ACD);// Disables Analog Comparator,<br />ADCSRA &amp;=~ (1&lt;&lt;ADEN);// Make sure ADC is OFF<br /><br />// Configure interrupts<br />INT0LowLevelInterrupt();// The low level on INT0 generates an interrupt request<br />GIMSK |= (1 &lt;&lt; INT0);// External Interrupt Request 0 Enable<br />DisableINT0();// Disable INT0 for normal work<br /><br />// Configure Watchdog<br />NormalWatchdog();<br /><br />// Enable all interrupts<br />sei();// Enable interrupts<br />}<br /><br /><br />/*<br />Deep sleep, maximum power saving, onlu INT0 and watchdog can wake uC up<br />*/<br />void DeepSleep(void){<br />cli();// Disable all interrupts<br />wdt_disable();// Disable watchog<br />INT0LowLevelInterrupt();// Enable INT0 interrupt<br />set_sleep_mode(SLEEP_MODE_PWR_DOWN);// Set Power Down mode<br />sleep_enable();// Enable sleep<br />sei();// Enable all interrupts<br />WentToSleep = 1;// Notify, that uC is going to sleep<br />PORTB &amp;= ~((1 &lt;&lt; RED_LED_PIN) | (1 &lt;&lt; YELLOW_LED_PIN) | (1 &lt;&lt; GREEN_LED_PIN));//clear leds before going to sleep<br />sleep_cpu();// Go to sleep<br />sleep_disable();// After a wake up disable sleep<br />DisableINT0();// Disable INT0 for normal work<br />NormalWatchdog();// EDIT: setup watchdog again<br />}<br /><br />/*<br />Short sleep using watchdog, should not alternate normal work of uC (pins statuses etc.) <br />*/<br />void ShortSleep(uint8_t numOfSeconds){<br />// TODO maybe decrease WatchdogCount should be in watchdog interrupt function, watchdog is allways running so...<br />uint16_t WatchdogCount = numOfSeconds*8;<br />while(WatchdogCount&gt;0){// repeat n times<br />cli();// Disable all interrupts<br />set_sleep_mode(SLEEP_MODE_PWR_DOWN);// Set Power Down mode<br />sleep_enable();// Enable sleep<br />sei();// Enable all interrupts<br />sleep_cpu();// Go to sleep<br />sleep_disable();// After a wake up disable sleep<br />WatchdogCount--;<br />}<br />}<br /><br />// Returns 1 if the cycles num is exceeded and thus the uC should go to sleep<br />unsigned char CyclesWithoutActionNumExceeded(void){<br />return (WatchdogNoActionCount &gt;= SecondsBeforeSleep*8);//only in normal mode<br />}<br /><br />unsigned char ButtonPressedDown(void){<br />return ((PINB &amp; (1 &lt;&lt; PINB1)) == 0);<br />}<br /><br />/*<br />Interrupt 0<br />*/<br />ISR (INT0_vect){<br />cli();<br />WatchdogNoActionCount=0;// Reset WDT no action count - especially after waking up<br />GoToSleepFlag=0;// Reset GoToSleep flag<br />sei();<br />}<br /><br />ISR (WDT_vect){<br />cli();<br />if(CyclesWithoutActionNumExceeded()==1 &amp;&amp; GoToSleepFlag==0){<br />GoToSleepFlag = 1;<br />CHANGE_LED_STATUS(EXTRAGREEN_LED_PIN);<br />return;<br />};<br /><br />if(ButtonPressedDown()==1)// button pressed down<br />{<br />WatchdogNoActionCount=0;// Reset WDT no action count<br />CHANGE_LED_STATUS(GREEN_LED_PIN);<br />if (push_key_debounce&lt;8){ // we need this condition so variable wouldnt overrun to zero and go in circles<br />push_key_debounce++;<br />}<br />if(push_key_debounce==8) // we react after this number of stabilised push_key readings<br />push_key_pressed=1;   // variable where we keep state of the push_key<br /><br />TimesButtonWasPressed=0;// reset button status<br />}<br />else<br />{<br />CHANGE_LED_STATUS(YELLOW_LED_PIN);<br />if(push_key_debounce==8)   //push_key is unpressed and previous state was pressed<br />{<br />// ACTION OFF<br />TURN_LED_OFF(RED_LED_PIN);<br />}        <br />push_key_debounce=0; //push_key is unpressed or debounce noise is still in progress<br />WatchdogNoActionCount++;// No action is going on<br />}<br />//push_key action handler START  <br />if(push_key_pressed==1)     //push_key was pressed<br />{<br />push_key_pressed=0;<br />TURN_LED_ON(RED_LED_PIN);// ACTION ON<br />}<br />sei();<br />}<br /> <br /><br />/*<br />Calls proper method<br />*/<br />void Operate(void){<br />while(1){<br />ShortSleep(1);<br />if(GoToSleepFlag==1) return;// Operate till cycles not exceeded and not in sleep mode<br />}<br />}<br /><br /><br />int main(void)<br />{<br />Setup();<br />//NORMAL LOOP<br />while (1)<br />{<br />Operate();// Dummy method<br />DeepSleep();// after loop is cancelled<br />};<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6619">teres</a> — 19 lip 2015, o 22:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[teres]]></name></author>
<updated>2015-07-18T15:34:54+01:00</updated>
<published>2015-07-18T15:34:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12374&amp;p=134880#p134880</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12374&amp;p=134880#p134880"/>
<title type="html"><![CDATA[Re: Problem z odczytanie stanu pinu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12374&amp;p=134880#p134880"><![CDATA[
<div class="quotetitle">jacekk232 napisał(a):</div><div class="quotecontent"><br />Zamiast PORTB powinno być PINB.<br /></div><br />Dzięki, działa. Miałem tak wcześniej (tylko cały program był trochę inaczej napisany), ale już zacząłem szukać po necie i wyszło mi, że tak też mogę odczytywać.<br />Później podeślę wersję, która miała działać na przerwaniu INT0 - na niej bardziej mi zależy. Teraz już nie mam siły myśleć  <img src="https://forum.atnel.pl/images/smilies/icon_e_confused.gif" alt=":?" title="Boi się" /><br /><span style="font-size: 85%; line-height: normal">W międzyczasie robiłem próby z podpinaniem się pod PB5 (który miałem wolny), ale zorientowałem się, że to RESET  <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /> </span><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6619">teres</a> — 18 lip 2015, o 15:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2015-07-18T15:27:34+01:00</updated>
<published>2015-07-18T15:27:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12374&amp;p=134879#p134879</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12374&amp;p=134879#p134879"/>
<title type="html"><![CDATA[Re: Problem z odczytanie stanu pinu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12374&amp;p=134879#p134879"><![CDATA[
[syntax=c]unsigned char ButtonPressedDown(void){<br />        return ((PORTB &amp; (1 &lt;&lt; PINB0)) == 0);<br />}[/syntax]<br />Zamiast PORTB powinno być PINB.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 18 lip 2015, o 15:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Daniel880]]></name></author>
<updated>2015-07-18T15:23:11+01:00</updated>
<published>2015-07-18T15:23:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12374&amp;p=134878#p134878</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12374&amp;p=134878#p134878"/>
<title type="html"><![CDATA[Re: Problem z odczytanie stanu pinu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12374&amp;p=134878#p134878"><![CDATA[
Spróbuj bezpośrednio odczytywać stan pinu bez filtrowania drgań styków.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2328">Daniel880</a> — 18 lip 2015, o 15:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[teres]]></name></author>
<updated>2015-07-18T15:13:28+01:00</updated>
<published>2015-07-18T15:13:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12374&amp;p=134877#p134877</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12374&amp;p=134877#p134877"/>
<title type="html"><![CDATA[Problem z odczytanie stanu pinu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12374&amp;p=134877#p134877"><![CDATA[
Witam,<br />jestem w trakcie robienia prostej zabawki dla dziecka (sygnalizator uliczny), ale niestety walczę już ze ścianą ponad pół roku. Obecnie musiałem zrezygnować z jednej dość istotnej dla mnie funkcji (tylko jeden przycisk pod INT0), ale co zrobić. Uprościłem kod do minimum, ale i tak zachowuje się inaczej niż bym chciał. <br />Co ma robić:<br />włączać czerwony LED po 1s. wciśniętego przycisku<br />wyłączać czerwony LED jeśli przycisk puszczono<br /><br />A jak działa:<br />żółty LED cały czas miga sygnalizując, że przycisk nie jest wciśnięty - to jest ok<br />nic się nie dzieje, jeśli łączę PB0 z masą  <img src="https://forum.atnel.pl/images/smilies/icon_eek.gif" alt=":shock:" title="Zaszokowany" /><br /><br />Całość sterowana jest watchdogiem z częstotliwością 8Hz.<br /><br />Kod starałem się oczyścić ze wszystkich niepotrzebnych śmieci.<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/sleep.h&gt;<br />#include &lt;avr/wdt.h&gt;<br /> <br />// Defined Pins <br />#define RED_LED_PIN PB4<br />#define YELLOW_LED_PIN PB3<br />#define GREEN_LED_PIN PB2<br />#define EXTRAGREEN_LED_PIN PB0<br /><br />#define CHANGE_LED_STATUS(LED){PORTB = PORTB ^ (1 &lt;&lt; LED);}<br />#define TURN_LED_ON(LED){PORTB = PORTB | (1 &lt;&lt; LED);}<br />#define TURN_LED_OFF(LED){PORTB = PORTB &amp; ~(1 &lt;&lt; LED);}<br /><br />volatile uint8_t LockMode = 0;<br /><br />volatile uint8_t push_key_debounce = 0;<br />volatile uint8_t push_key_pressed = 0;<br /><br /><br /><br />/*<br /><br />Resets watchdog<br />*/<br />void ResetWatchdog(void){<br />cli();<br />wdt_reset();<br />sei();<br />}<br /><br /><br />/*<br />Normal watchdog timeout - 125ms<br />*/<br />void NormalWatchdog(void){<br />cli();<br />wdt_reset();<br />WDTCR |= (1&lt;&lt;WDCE);// Watchdog change enable<br />WDTCR = (1&lt;&lt;WDP1) | (1&lt;&lt;WDP0);// Prescale timer to 125ms<br />WDTCR |= (1&lt;&lt;WDTIE);// Enable watchdog timer interrupts<br />sei();<br />}<br /><br /><br />/*<br />Sets INT0 mode to triggered by low level<br />Used only to wake up from power down<br />*/<br />void INT0LowLevelInterrupt(void){<br />MCUCR &amp;= ~((1&lt;&lt;ISC01)|(1&lt;&lt;ISC00));// The low level on INT0 generates an interrupt request<br />}<br /><br />/*<br />Sets INT0 mode to triggered by falling edge<br />*/<br />void INT0FallingEdgeInterrupt(void){<br />MCUCR |= (1&lt;&lt;ISC01);// The falling edge on INT0 generates an interrupt request<br />}<br /><br />// Create setup method that disables ADC, Analog Comparator, Internal Reference Voltage and other no useful stuff<br />void Setup(void){<br />// Setup ports<br />DDRB = 0xFF &amp; ~(1 &lt;&lt; DDB1 | 1 &lt;&lt; DDB0);// Set all to output, PORTB 0 and 1 configured as input with pull-ups<br />PORTB = 0x00 | (1 &lt;&lt; PORTB1) | (1 &lt;&lt; PORTB0);// all other low <br /><br />// Low power mode<br />ACSR &amp;=~ (1&lt;&lt;ACD);// Disables Analog Comparator,<br />ADCSRA &amp;=~ (1&lt;&lt;ADEN);// Make sure ADC is OFF<br /><br />// Configure interrupts<br />INT0FallingEdgeInterrupt();// The falling edge of INT0 generates an interrupt request<br />GIMSK |= (1 &lt;&lt; INT0);// External Interrupt Request 0 Enable<br /><br />// Configure Watchdog<br />NormalWatchdog();<br /><br />// Enable all interrupts<br />sei();// Enable interrupts<br />}<br /><br /><br />unsigned char ButtonPressedDown(void){<br />return ((PORTB &amp; (1 &lt;&lt; PINB0)) == 0);<br />}<br /><br />/*<br />Interrupt 0<br />*/<br />ISR (INT0_vect){<br />cli();<br />sei();<br />}<br /><br />ISR (WDT_vect){<br />cli();<br /><br />if(ButtonPressedDown())// button pressed down<br />{<br />CHANGE_LED_STATUS(GREEN_LED_PIN);<br />if (push_key_debounce&lt;8){ //we need this condition so variable wouldnt overrun to zero and go in circles<br />push_key_debounce++;<br />}<br />if(push_key_debounce==8) //we react after this number of stabilised push_key readings<br />push_key_pressed=1;   //variable where we keep state of the push_key<br />}<br />else<br />{<br />CHANGE_LED_STATUS(YELLOW_LED_PIN);<br />if(push_key_debounce==8)   //push_key is unpressed and previous state was pressed<br />{<br />// ACTION OFF<br />TURN_LED_OFF(RED_LED_PIN);<br />}        <br />push_key_debounce=0; //push_key is unpressed or debounce noise is still in progress<br />}<br />//push_key action handler START  <br />if(push_key_pressed==1)     //push_key was pressed<br />{<br />push_key_pressed=0;<br />TURN_LED_ON(RED_LED_PIN);// ACTION ON<br />}<br />sei();<br />}<br /> <br /><br />int main(void)<br />{<br />Setup();<br />//NORMAL LOOP<br />while (1)<br />{<br />// Place your code here<br />};<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6619">teres</a> — 18 lip 2015, o 15:13</p><hr />
]]></content>
</entry>
</feed>