<?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=22771&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2020-01-14T12:45:08+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=22771&amp;mode</id>
<entry>
<author><name><![CDATA[ProgramistaAVR]]></name></author>
<updated>2020-01-14T12:45:08+01:00</updated>
<published>2020-01-14T12:45:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224150#p224150</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224150#p224150"/>
<title type="html"><![CDATA[Re: ustawianie pinu, a cli()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224150#p224150"><![CDATA[
Mała poprawka<br />zapis machanie pinem:<br />OUT PORT,Rx ; 1 cykl<br />CBI PORT,WR ; 1 cykl<br />SBI PORT,WR; 1 cykl<br /><br />zapis sprzętowy (XRAM)<br />ST X,Rx ; 2 cykle<br /><br />Oszczędność wynosi więc 33 a nie 50% ale chciałbym płacić 33% mniej za wszystkie towary.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21040">ProgramistaAVR</a> — 14 sty 2020, o 12:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ProgramistaAVR]]></name></author>
<updated>2020-01-13T12:08:20+01:00</updated>
<published>2020-01-13T12:08:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224136#p224136</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224136#p224136"/>
<title type="html"><![CDATA[Re: ustawianie pinu, a cli()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224136#p224136"><![CDATA[
W tym kodzie delay może być przykładem jak nie pisać ale w demonstracji można jednego delay użyć.<br />Przykładem jak nie pisać jest całe Arduino. Na początek przerwanie T0<br />[syntax=c]SIGNAL(TIMER0_OVF_vect)<br />{<br />    // copy these to local variables so they can be stored in registers<br />    // (volatile variables must be read from memory on every access)<br />    unsigned long m = timer0_millis;<br />    unsigned char f = timer0_fract;<br /> <br />    m += MILLIS_INC;<br />    f += FRACT_INC;<br />    if (f &gt;= FRACT_MAX) {<br />        f -= FRACT_MAX;<br />        m += 1;<br />    }<br /> <br />    timer0_fract = f;<br />    timer0_millis = m;<br />    timer0_overflow_count++;<br />}[/syntax]<br />Przerwanie to jest obligatoryjne. Tak jak w przypadku UART, I2C itd nie musisz używać biblioteki, tak tu jesteś skazany na taki twór (raczej potwór). <br />W konsekwencji nie wykorzystać przerwania od przepełnienia T0. Jak to, że używane są sztuczki z przeskakiwaniem licznika aby odliczać w ciągu sekundy 1000 impulsów mogę zrozumieć (PWM można uruchomić na T0) tak  braku możliwości modyfikacji tej funkcji lub chocby prostego skoku do funkcji<br />[syntax=c]if( adr_user_1ms ) (*((void(*)(void))adr_user_1ms))();[/syntax]<br />pojąc nie mogę.<br /><br />Inny &quot;kwiatek&quot;, obsługa wyświetlaczy w trybie równoległym na mega2560 przez &quot;machanie pinem&quot;:<br />[syntax=c]#define WR_ACTIVE  WR_PORT &amp;= ~WR_MASK<br />#define WR_IDLE    WR_PORT |=  WR_MASK<br /><br />#define WR_STROBE { WR_ACTIVE; WR_IDLE; }<br /><br />#if defined(__AVR_ATmega2560__)<br />   #ifdef USE_ADAFRUIT_SHIELD_PIN<br /> #define RD_PORT PORTL<br />   #define WR_PORT PORTG<br />     #define CD_PORT PORTD<br />     #define CS_PORT PORTG<br /> #define RD_MASK B01000000<br />   #define WR_MASK B00000010<br />   #define CD_MASK B10000000<br />   #define CS_MASK B00000001<br /> <br /> #define write_16(x)    { PORTA = (x) &gt;&gt; 8; PORTC = x; WR_STROBE;}<br /> #define write8(x)     { PORTC = x; WR_STROBE;}<br /> #define read_16(dst)   { RD_STROBE;dst = (PINA&lt;&lt;8) | (PINC); RD_IDLE;}<br /> #define read8(dst)    { read16(dst);dst &amp;= 0xFFFF;}<br /> #define setWriteDir() { DDRC = 0xFF; DDRA = 0xFF; }<br /> #define setReadDir()  { DDRC = 0x00; DDRA = 0x00; }<br />#else<br /> #define write_16(x)   { PORTA = (x) &gt;&gt; 8; PORTC = x; WR_STROBE;}<br /> #define write8(x)    { PORTC = x; WR_STROBE;}<br /> #define read_16(dst)   { RD_STROBE;dst = (PINA&lt;&lt;8) | (PINC); RD_IDLE;}<br /> #define read8(dst)    { read_16(dst);dst &amp;= 0xFFFF;}<br /> #define setWriteDir() { DDRC = 0xFF; DDRA = 0xFF; }<br /> #define setReadDir()  { DDRC = 0x00; DDRA = 0x00; }<br /><br />#endif[/syntax]<br />jakby mega2560 nie miała buss keepera. Jak dodać zatrzask na przerzutniku D np 74HC74 to oszczędzamy jeden pin AVR bo linia AD0 jest zarówno linią danych jak i A8 (przy okazji tracimy jedną na ALE więc bilans jest na 0). A8 łączymy z RS LCD i zależnie czy zapisujemy pod adres parzysty XRAM czy nieparzysty będzie to komenda lub dane dla LCD. Niby zysk z użycia XRAM jest niewielki bo 2 cykle* ale to 2 razy mniej a do wyświetlacza 480x320 trzeba zrobić ponad 150 tysięcy przesłań aby wypełnić cały wyświetlacz (i tak takiego bufora w RAm AVR nie da się zrobić ale może to być zewnętrzna RAM) co przy 16MHz (mega2560 max 16MHz) daje osczzędność czasu prawie 200ms!  <br /><br /><br />* zapis machanie pinem:<br />ST X,Rx    ; 2 cykle<br />CBI PORT,WR ; 1 cykl<br />SBI PORT,WR; 1 cykl<br />zapis sprzętowy (XRAM)<br />ST X,Rx ; 2 cykle<br /><br />Cóż &quot;machanie pinem&quot; to dewiza Arduino tak samo jak delay.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21040">ProgramistaAVR</a> — 13 sty 2020, o 12:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jarecki]]></name></author>
<updated>2020-01-10T08:55:03+01:00</updated>
<published>2020-01-10T08:55:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224081#p224081</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224081#p224081"/>
<title type="html"><![CDATA[Re: ustawianie pinu, a cli()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224081#p224081"><![CDATA[
<div class="quotetitle">ProgramistaAVR napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">Jarecki napisał(a):</div><div class="quotecontent"><div class="quotetitle">Szofer napisał(a):</div><div class="quotecontent">A to dlatego aby przerwanie mogło jeszcze zmodyfikować stan pinu/portu przed zapisem<br /></div><br /><br /><strong>ProgramistaAVR</strong> czy to dobra odpowiedź? Śledzę ten wątek i uważam, że jest mega ważny i interesujący ale nie wiem czy wszystko dobrze rozumiem a bardzo bym chciał rozumieć <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /></div><br />Zła. <br />Chodzi właśnie o coś dokładnie odwrotnego, aby ewentualne przerwanie nie mogło się wykonać. Przeważnie rozkazy wykonują się od razu. Gdyby tak było to sekwencja:<br />SEI<br />ZAPIS PORTU<br />byłaby ryzykowna, po po SEI mogłoby wykonać się przerwanie, które mogłoby zmodyfikować stan portu. Błąd byłby ciężki do znalezienia to rzadki ale w AVR, zaraz po SEI nie może wykonać się przerwanie, dopiero w kolejnym rozkazie co gwarantuje, ze przerwanie nie zmodyfikuje stanu portu przed jego zapisem. W praktyce zadział to jak sekwencjia<br />ZAPIS PORTU<br />SEI<br />w innych CPU ale nie pytaj jakich bo nie pamiętam wiele z dawnych CPU. Coś tam mi świta, że w Z-80 zaraz po DI (blokada przerwań) modło być wykonanie przerwanie (nie wiem czy we wszystkich trybach czy tylko w IM2 - wektoryzowane) a 6502 odblokowanie przerwań miało skutek natychmiastowy.<br /><br />Kiedyś zabieg z wykonaniem rozkazu zaraz po odblokowaniu przerwań był używany w pracy krokowej. Na NMI wymuszało się L. CPU prawie cały czas był w przerwaniu. Wykonanie kroku to opuszczenie przerwania gdzie w po przywróceniu znacznika przerwania (W 6502 był on na stosie, w rejestrze stanu, umieszczany sprzętowo, w Z-80 osobny przerzutnik) musiał wykonać się jeden rozkaz po którym program ponownie skakał w przerwanie. Nie pamiętam czy przypadkiem nie taki mechanizm był w CA-80 ale naprawdę wiele lat minęło.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 34 minutach ]</span></strong><br /><br />Od siebie jeszcze dodam, ze w ARM nie używam ATOMIC_BLOCK. Blokuję w NVIC tylko przerwania, które mogłyby przeszkadzać. W AVR takie rozwiązanie raczej się nie przyda. Przerwania są blokowane głównie po to, aby nie zakłócić jakiś krytycznych czasowo funkcji np generowania bitu dla WS2812. Przy czasie impulsu 400ns przerwanie trwające kilka us rozwali wszystko. Nawet wolna transmisja 1-Wire też będzie szwankować. W ARM z reguły to nie problem, bo jest dziesiątki jak nie setki razy szybszy od AVR (taki H743 może być taktowany nawet 480MHz a są i takie co 600MHz mają). W ARM przerwania się blokuje gdy np i w przerwaniu i w programie głównym modyfikuje się np rejestry UART. W takiej sytuacji wystarczy jednak zablokować przerwania od UART.<br /><br />W AVR też może być podobna sytuacja np licznik wielo bajtowy w przerwaniu. Aby go odczytać w programie głównym trzeba zatrzymać przerwania ale zamiast wyłączać wszystkie wystarczy zablokować przerwanie od timera modyfikującego licznik.<br /><br />Jest też prosta metoda aby One Wire czy WS2812 na AVR obsłużyć w przerwaniu. Tak jak w przypadku One Wire są dwa rozwiązania czyli timer albo UART tak w przypadku WS2812 SPI lub UART. W necie można znaleźć przykłady a dla One Wire przez UART to nawet Maxim wydał odpowiednią notę katalogową. Szczegóły można tam przeczytać a w skrócie, to ustawia się UART na 9600 Zapisuje FF i sprawdza co wróciło (TX-RX jest zapętlone przez bufor OC). Jak FF to nie zgłosił się slave, jak inna wartość to było zgłoszenie. Komunikacja podobnie tyle, że na 115200. Wysłanie 1 to zapis FF, zera to zapis 0. Odczytanie bitu to zapis FF i odczyt, jak FF to slave zwraca 1, jak &lt;&gt; od FF to zwrócił 0.<br />Proste a działa na każdym mikrokontrolerze. Próbowałem na AVR, ARM wiem, że działa na porcie COM PC powinno na konwerterze USB-UART ale nie próbowałem. Można sobie zorganizować komunikację w tle (na przerwaniach). WS2812 zarówno na AVR jak i ARM próbowałem na SPI i UART. Działa na przerwaniach ale na AVR lepiej robić to na UART.</div><br /><br /><br />Dzięki za obszerne wyjaśnienie i rozwianie wątpliwości co do zagadki <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Bardzo mnie ten temat zaciekawił, nawet przygotowałem sobie taki prosty kodzik, w którym co sekundę zmieniam stan pinu na PD7 oraz za każdym razem jak przyleci przerwanie INT zmieniam stan na PD0. Słowem przykład, jak kodu nie pisać <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />[syntax=c]int main(void)<br />{<br /><br />/*<br /> * Pominiete inicjalizacje<br /> * */<br /><br />while(1)<br />{<br />_delay_ms(1000);<br />PORTD ^= (1&lt;&lt;PD7);<br />}<br /><br />}<br /><br /><br />ISR(INT0_vect)<br />{<br />PORTD ^= (1&lt;&lt;PD0);<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2511">Jarecki</a> — 10 sty 2020, o 08:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ProgramistaAVR]]></name></author>
<updated>2020-01-09T19:35:01+01:00</updated>
<published>2020-01-09T19:35:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224080#p224080</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224080#p224080"/>
<title type="html"><![CDATA[Re: ustawianie pinu, a cli()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224080#p224080"><![CDATA[
<div class="quotetitle">Jarecki napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">Szofer napisał(a):</div><div class="quotecontent">A to dlatego aby przerwanie mogło jeszcze zmodyfikować stan pinu/portu przed zapisem<br /></div><br /><br /><strong>ProgramistaAVR</strong> czy to dobra odpowiedź? Śledzę ten wątek i uważam, że jest mega ważny i interesujący ale nie wiem czy wszystko dobrze rozumiem a bardzo bym chciał rozumieć <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /></div><br />Zła. <br />Chodzi właśnie o coś dokładnie odwrotnego, aby ewentualne przerwanie nie mogło się wykonać. Przeważnie rozkazy wykonują się od razu. Gdyby tak było to sekwencja:<br />SEI<br />ZAPIS PORTU<br />byłaby ryzykowna, po po SEI mogłoby wykonać się przerwanie, które mogłoby zmodyfikować stan portu. Błąd byłby ciężki do znalezienia to rzadki ale w AVR, zaraz po SEI nie może wykonać się przerwanie, dopiero w kolejnym rozkazie co gwarantuje, ze przerwanie nie zmodyfikuje stanu portu przed jego zapisem. W praktyce zadział to jak sekwencjia<br />ZAPIS PORTU<br />SEI<br />w innych CPU ale nie pytaj jakich bo nie pamiętam wiele z dawnych CPU. Coś tam mi świta, że w Z-80 zaraz po DI (blokada przerwań) modło być wykonanie przerwanie (nie wiem czy we wszystkich trybach czy tylko w IM2 - wektoryzowane) a 6502 odblokowanie przerwań miało skutek natychmiastowy.<br /><br />Kiedyś zabieg z wykonaniem rozkazu zaraz po odblokowaniu przerwań był używany w pracy krokowej. Na NMI wymuszało się L. CPU prawie cały czas był w przerwaniu. Wykonanie kroku to opuszczenie przerwania gdzie w po przywróceniu znacznika przerwania (W 6502 był on na stosie, w rejestrze stanu, umieszczany sprzętowo, w Z-80 osobny przerzutnik) musiał wykonać się jeden rozkaz po którym program ponownie skakał w przerwanie. Nie pamiętam czy przypadkiem nie taki mechanizm był w CA-80 ale naprawdę wiele lat minęło.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 34 minutach ]</span></strong><br /><br />Od siebie jeszcze dodam, ze w ARM nie używam ATOMIC_BLOCK. Blokuję w NVIC tylko przerwania, które mogłyby przeszkadzać. W AVR takie rozwiązanie raczej się nie przyda. Przerwania są blokowane głównie po to, aby nie zakłócić jakiś krytycznych czasowo funkcji np generowania bitu dla WS2812. Przy czasie impulsu 400ns przerwanie trwające kilka us rozwali wszystko. Nawet wolna transmisja 1-Wire też będzie szwankować. W ARM z reguły to nie problem, bo jest dziesiątki jak nie setki razy szybszy od AVR (taki H743 może być taktowany nawet 480MHz a są i takie co 600MHz mają). W ARM przerwania się blokuje gdy np i w przerwaniu i w programie głównym modyfikuje się np rejestry UART. W takiej sytuacji wystarczy jednak zablokować przerwania od UART.<br /><br />W AVR też może być podobna sytuacja np licznik wielo bajtowy w przerwaniu. Aby go odczytać w programie głównym trzeba zatrzymać przerwania ale zamiast wyłączać wszystkie wystarczy zablokować przerwanie od timera modyfikującego licznik.<br /><br />Jest też prosta metoda aby One Wire czy WS2812 na AVR obsłużyć w przerwaniu. Tak jak w przypadku One Wire są dwa rozwiązania czyli timer albo UART tak w przypadku WS2812 SPI lub UART. W necie można znaleźć przykłady a dla One Wire przez UART to nawet Maxim wydał odpowiednią notę katalogową. Szczegóły można tam przeczytać a w skrócie, to ustawia się UART na 9600 Zapisuje FF i sprawdza co wróciło (TX-RX jest zapętlone przez bufor OC). Jak FF to nie zgłosił się slave, jak inna wartość to było zgłoszenie. Komunikacja podobnie tyle, że na 115200. Wysłanie 1 to zapis FF, zera to zapis 0. Odczytanie bitu to zapis FF i odczyt, jak FF to slave zwraca 1, jak &lt;&gt; od FF to zwrócił 0.<br />Proste a działa na każdym mikrokontrolerze. Próbowałem na AVR, ARM wiem, że działa na porcie COM PC powinno na konwerterze USB-UART ale nie próbowałem. Można sobie zorganizować komunikację w tle (na przerwaniach). WS2812 zarówno na AVR jak i ARM próbowałem na SPI i UART. Działa na przerwaniach ale na AVR lepiej robić to na UART.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21040">ProgramistaAVR</a> — 9 sty 2020, o 19:35</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jarecki]]></name></author>
<updated>2020-01-09T13:52:06+01:00</updated>
<published>2020-01-09T13:52:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224078#p224078</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224078#p224078"/>
<title type="html"><![CDATA[Re: ustawianie pinu, a cli()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224078#p224078"><![CDATA[
<div class="quotetitle">Szofer napisał(a):</div><div class="quotecontent"><br />A to dlatego aby przerwanie mogło jeszcze zmodyfikować stan pinu/portu przed zapisem<br /></div><br /><br /><strong>ProgramistaAVR</strong> czy to dobra odpowiedź? Śledzę ten wątek i uważam, że jest mega ważny i interesujący ale nie wiem czy wszystko dobrze rozumiem a bardzo bym chciał rozumieć <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2511">Jarecki</a> — 9 sty 2020, o 13:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Nef]]></name></author>
<updated>2020-01-09T12:19:30+01:00</updated>
<published>2020-01-09T12:19:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224077#p224077</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224077#p224077"/>
<title type="html"><![CDATA[Re: ustawianie pinu, a cli()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224077#p224077"><![CDATA[
<div class="quotetitle">ProgramistaAVR napisał(a):</div><div class="quotecontent"><br />zasem, aby szybko coś sprawdzić robię to na Arduino. Jak działa, to mam np gotowe, choć niedoskonałe funkcje ale w połączeniu z notą katalogową układu/modułu mogę szybko taki kod przenieść na ARM.<br /></div><br />no chyba że tak, uspokoiłeś mnie <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /><br /><br />Czasem też zamiast grzebać się godzinami w notach wspomagam się libsami arduino bo czasem z kodu idzie szybciej zrozumieć jak dany układ obsłużyć niż z wypocin producenta układu w jego nocie. Nie mniej jednak, za długo w ten kod nie można patrzeć bo można się zarazić złymi nawykami <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20585">Nef</a> — 9 sty 2020, o 12:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ProgramistaAVR]]></name></author>
<updated>2020-01-09T10:47:20+01:00</updated>
<published>2020-01-09T10:47:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224074#p224074</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224074#p224074"/>
<title type="html"><![CDATA[Re: ustawianie pinu, a cli()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224074#p224074"><![CDATA[
Projekty robię na ARM (STM32) a te jak wiesz praktycznie nie są wspierane przez Arduino (np H743). Jeśli już coś jest (F1, F4) nie używają DMA itp tylko &quot;machają pinem&quot; jak w AVR. Z pewnością wiesz, że w ten sposób niewiele da się osiągnąć.<br />Czasem, aby szybko coś sprawdzić robię to na Arduino. Jak działa, to mam np gotowe, choć niedoskonałe funkcje ale w połączeniu z notą katalogową układu/modułu mogę szybko taki kod przenieść na ARM. Gdy coś działa na arduino kiepsko przyglądam się funkcjom a tam np SPI do wyświetlacza graficznego emulowane programowo <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /> Nie dość, że SPI na AVR jest wolne, bo max to jakieś FCPU / 4 to jeszcze SPI emulowane przez machanie pinem! na to może wpaść tylko programista na Arduino.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21040">ProgramistaAVR</a> — 9 sty 2020, o 10:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Nef]]></name></author>
<updated>2020-01-09T09:49:33+01:00</updated>
<published>2020-01-09T09:49:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224072#p224072</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224072#p224072"/>
<title type="html"><![CDATA[Re: ustawianie pinu, a cli()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224072#p224072"><![CDATA[
<div class="quotetitle">ProgramistaAVR napisał(a):</div><div class="quotecontent"><br />Chyba wystąpię do pracodawcy o dodatek do pracy w szkodliwych warunkach jakim jest Arduino.<br /></div><br /><br />Nie wiem gdzie pracujesz ale powinieneś pomyśleć o zmianie pracodawcy. W żadnej porządnej firmie nie spotkałem się osobiście żeby użytkowali Arduino, czy to HW czy ten ich śmieszny framework. I nie mówię tego żeby Ci dopiec ale jako poważną radę zawodową bo wiem jak patrzą na rozmowach kwalifikacyjnych na Ciebie &quot;techniczni&quot; jak im mówisz że masz doświadczenie w embedded a pracowałeś w Arduino. To jest zabawka dla dzieci i dla dorosłych którymn się nie chce i chcą sobie coś na szybko poskładać z marnym efektem.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20585">Nef</a> — 9 sty 2020, o 09:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2020-01-08T19:48:51+01:00</updated>
<published>2020-01-08T19:48:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224067#p224067</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224067#p224067"/>
<title type="html"><![CDATA[Re: ustawianie pinu, a cli()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224067#p224067"><![CDATA[
<div class="quotetitle">ProgramistaAVR napisał(a):</div><div class="quotecontent"><br />Chyba wystąpię do pracodawcy o dodatek do pracy w szkodliwych warunkach jakim jest Arduino.<br /></div><br /><img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /> <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /> dobre<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 8 sty 2020, o 19:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ProgramistaAVR]]></name></author>
<updated>2020-01-08T17:23:03+01:00</updated>
<published>2020-01-08T17:23:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224065#p224065</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224065#p224065"/>
<title type="html"><![CDATA[Re: ustawianie pinu, a cli()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224065#p224065"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">ProgramistaAVR napisał(a):</div><div class="quotecontent"> bezzsensowne jest zatem wyłączanie i to w zły sposób przerwań.<br /></div><br />Nie sprawdzałem tego w andruino - ale jeśli jest tak jak piszesz - i sprawdziłeś to dokładnie - to jakaś masakra. Nie sądziłem że aż tak można spierniczyć sprawę ale też byłaby to kolejna cegiełka do tego dlaczego ludziom w tym andruino zawsze coś się sypie w tych programach.</div><br />W którymś tam katalogu arduino, albo w linku <!-- m --><a class="postlink" href="https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring_digital.c" >https://github.com/arduino/ArduinoCore- ... _digital.c</a><!-- m -->, można znaleźć<br />[syntax=c]uint8_t oldSREG = SREG;<br />cli();<br />if (val == LOW) {<br />*out &amp;= ~bit;<br />} else {<br />*out |= bit;<br />}<br />SREG = oldSREG;[/syntax]<br />widać, że nawet nie znali dobrze bibliotek kompilatora, bo ja bym użył ATOMIC_BLOCK.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 1 minucie ]</span></strong><br /><br /><div class="quotetitle">andrews napisał(a):</div><div class="quotecontent"><br />Prawdopodobnie dlatego, żeby skrócić czas wyłączenia przerwań (czyli czas reakcji na przerwanie) do minimum. Zgodnie z deklaracją producenta:<br />Atmel/Microchip napisał(a):<br />The instruction following SEI will be executed before any pending interrupts.<br />która gwarantuje, że instrukcja następująca bezpośrednio po instrukcji SEI (czyli w tym przypadku zapisanie zmodyfikowanej wartości z powrotem do portu) zostanie wykonana przed wejściem mikrokontrolera w procedurę obsługi przerwania (nawet jeśli to przerwanie już oczekuje na realizację).<br /></div><br />Widzę, że dobrze znasz AVR. Rzekłbym dogłębnie.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 12 minutach ]</span></strong><br /><br />Arduino, z konieczności, nie z własnej woli, zajmuje się sporadycznie od mniej niż roku. Ciągle coś mi nie działa, zaglądam w źródła i ... przerażenie w oczach. To co widzę, to w pijanym widzie by mi do głowy nie przyszło! Brak debugera dopełnia wszystkiego. Można się ratować wczytując kod Arduino do AS7 i .... debuger nie działa! Sprawdzam co mu jest? Ano wyłączony JTAG! Co za idiota wyłącza go przez FUSES gdy i tak startuje bootloader, który może programowo go wyłączyć?<br />Chyba wystąpię do pracodawcy o dodatek do pracy w szkodliwych warunkach jakim jest Arduino.<br />Nawet konstrukcja PCB jest do du....y. Płytka ma konwerter USB-UART na MEGA16U4 z kwarcem 16MHz a mega328 jest taktowana z ceramicznego 16MHz. Szok!<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21040">ProgramistaAVR</a> — 8 sty 2020, o 17:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2020-01-08T16:57:21+01:00</updated>
<published>2020-01-08T16:57:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224064#p224064</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224064#p224064"/>
<title type="html"><![CDATA[Re: ustawianie pinu, a cli()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224064#p224064"><![CDATA[
<div class="quotetitle">ProgramistaAVR napisał(a):</div><div class="quotecontent"><br />Jedyny przypadek, kiedy miałoby to sens, to duże AVR gdzie porty są poza SFR, w obszarze, w którym inne AVR maja SRAM. W takiej sytuacji ustawianie czy kasowanie pinu to 3 rozkazy.<br /></div><br />To nie jest jedyny przypadek. Przestrzeń adresowa IO posiada zakres od 0x00 do 0x3F z czego tylko zakres od 0x00 do 0x1F jest dostępny dla instrukcji SBI oraz CBI (tylko te instrukcje gwarantują atomowość operacji ustawienia/zerowania bitu rejestru). Pozostałe mogą korzystać tylko z instrukcji IN oraz OUT, czyli operacje już nie są atomowe, bo wymagają trzech instrukcji. My tu rozważamy akurat rejestry związane z portami IO, ale przecież problem może dotyczyć prawie każdego rejestru specjalnego przeznaczenia (SFR). Np. rejestr TCCR0A w ATmega644P jest pod adresem 0x24 (w przestrzeni IO), czyli jest jeszcze w zakresie, ale już nie jest dostępny dla instrukcji SBI i CBI, więc jeśli modyfikujemy bity tego rejestru zarówno w pętli głównej, jak i w przerwaniach (co wcale nie jest rzadkością), to mamy analogiczny problem , jak w przypadku portów.<br /><br />Tak czy inaczej, sam fakt, że rejestr znajduje się w przestrzeni IO nie gwarantuje atomowości - musi być jeszcze w pierwszej połowie zakresu.<br /><br /><div class="quotetitle">ProgramistaAVR napisał(a):</div><div class="quotecontent"><br />[syntax=asm]//<br />    CLI<br />    IN R16, PORTD    // POBIERZ<br />    ORI R16, 0x02    //ZMODYFIKUJ (AND/OR)<br />    SEI<br />    OUT PORTD, R16   //ZAPISZ[/syntax]<br />Dlaczego sei jest przez zapisem portu?<br /></div><br />Prawdopodobnie dlatego, żeby skrócić czas wyłączenia przerwań (czyli czas reakcji na przerwanie) do minimum. Zgodnie z deklaracją producenta:<br /><div class="quotetitle">Atmel/Microchip napisał(a):</div><div class="quotecontent"><br />The instruction following SEI will be executed before any pending interrupts.<br /></div>która gwarantuje, że instrukcja następująca bezpośrednio po instrukcji SEI (czyli w tym przypadku zapisanie zmodyfikowanej wartości z powrotem do portu) zostanie wykonana przed wejściem mikrokontrolera w procedurę obsługi przerwania (nawet jeśli to przerwanie już oczekuje na realizację).<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 8 sty 2020, o 16:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Szofer]]></name></author>
<updated>2020-01-08T16:28:03+01:00</updated>
<published>2020-01-08T16:28:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224061#p224061</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224061#p224061"/>
<title type="html"><![CDATA[Re: ustawianie pinu, a cli()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224061#p224061"><![CDATA[
Ja wiem.<br /><br />A to dlatego aby przerwanie mogło jeszcze zmodyfikować stan pinu/portu przed zapisem, jedna instrukcja mniej do wykonania.<br /><br />Wyobraź sobie że wystawiasz sygnał dla defibrillatora I reanimujesz człowieka, pod palec ma podpięty czujnik pulsu i po oddanym strzale przywracania tętna, zabierasz się do kolejnego strzału, a gość wlasnie odzyskał tętno i czujnik zgłosił, że przywrócono akcje serca, jakby nie została zmodyfikowana twoja decyzja to człowiek dostałby jeszcze jednego strzała i mógłby tego nie przeżyć.<br /><br />Od taka opowiastka przyszła mi do głowy względem pytania czemu zapis po sei()<br /><br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7664">Szofer</a> — 8 sty 2020, o 16:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jarecki]]></name></author>
<updated>2020-01-08T15:12:09+01:00</updated>
<published>2020-01-08T15:12:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224052#p224052</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224052#p224052"/>
<title type="html"><![CDATA[Re: ustawianie pinu, a cli()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224052#p224052"><![CDATA[
<div class="quotetitle">ProgramistaAVR napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">Jarecki napisał(a):</div><div class="quotecontent"><div class="quotetitle">ProgramistaAVR napisał(a):</div><div class="quotecontent">Dlaczego? Kto wie?<br /></div><br /><br />Co dlaczego?</div><br />Dlaczego sei jest przez zapisem portu? Przecież może się zdarzyć, że po sei nasąpi przerwanie, które zmodyfikuje zawartość portu. Po zakończeniu przerwania port zostanie ustawiony zawartością ustalona w programie głównym, więc to co zostało zrealizowane w przerwaniu, nie odniesie skutku, ściślej odniesie na krótką chwilę.<br />Logika podpowiada, że sei powinno być po zapisie do portu.</div><br /><br />Nie wiem dlaczego, powiedz <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2511">Jarecki</a> — 8 sty 2020, o 15:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2020-01-08T14:37:17+01:00</updated>
<published>2020-01-08T14:37:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224050#p224050</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224050#p224050"/>
<title type="html"><![CDATA[Re: ustawianie pinu, a cli()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224050#p224050"><![CDATA[
<div class="quotetitle">ProgramistaAVR napisał(a):</div><div class="quotecontent"><br />bezzsensowne jest zatem wyłączanie i to w zły sposób przerwań.<br /></div><br />Nie sprawdzałem tego w andruino - ale jeśli jest tak jak piszesz - i sprawdziłeś to dokładnie - to jakaś masakra. Nie sądziłem że aż tak można spierniczyć sprawę ale też byłaby to kolejna cegiełka do tego dlaczego ludziom w tym andruino zawsze coś się sypie w tych programach.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 8 sty 2020, o 14:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ProgramistaAVR]]></name></author>
<updated>2020-01-08T14:27:08+01:00</updated>
<published>2020-01-08T14:27:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224048#p224048</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224048#p224048"/>
<title type="html"><![CDATA[Re: ustawianie pinu, a cli()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224048#p224048"><![CDATA[
<div class="quotetitle">Jarecki napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">ProgramistaAVR napisał(a):</div><div class="quotecontent">Dlaczego? Kto wie?<br /></div><br /><br />Co dlaczego?</div><br />Dlaczego sei jest przez zapisem portu? Przecież może się zdarzyć, że po sei nasąpi przerwanie, które zmodyfikuje zawartość portu. Po zakończeniu przerwania port zostanie ustawiony zawartością ustalona w programie głównym, więc to co zostało zrealizowane w przerwaniu, nie odniesie skutku, ściślej odniesie na krótką chwilę.<br />Logika podpowiada, że sei powinno być po zapisie do portu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21040">ProgramistaAVR</a> — 8 sty 2020, o 14:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jarecki]]></name></author>
<updated>2020-01-08T12:31:00+01:00</updated>
<published>2020-01-08T12:31:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224045#p224045</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224045#p224045"/>
<title type="html"><![CDATA[Re: ustawianie pinu, a cli()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224045#p224045"><![CDATA[
<div class="quotetitle">ProgramistaAVR napisał(a):</div><div class="quotecontent"><br />Dlaczego? Kto wie?<br /></div><br /><br />Co dlaczego?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2511">Jarecki</a> — 8 sty 2020, o 12:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ProgramistaAVR]]></name></author>
<updated>2020-01-08T12:11:09+01:00</updated>
<published>2020-01-08T12:11:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224044#p224044</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224044#p224044"/>
<title type="html"><![CDATA[Re: ustawianie pinu, a cli()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=224044#p224044"><![CDATA[
<div class="quotetitle">tischtennis napisał(a):</div><div class="quotecontent"><br />W arduino przeglądałem jak działają funkcje &quot;pod spodem&quot; i funkcja &quot;digitalWrite&quot; na którą zawsze wszyscy narzekają, że jest wolna jak porównują arduino i natywne C w środku zawsze przed ustawieniem pinu deaktywuje przerwania i potem je uruchamia. <br />Pierwszy raz się spotkałem z tym i musiałem się zastanowić nad celem tego - przyzwyczaiłem się do makr ustawiających piny jak w BB gdzie nigdy nie dodawało się tego, jednak po przemyśleniu wydaje mi się, że powinny one też być &quot;otoczone&quot; cli() i sei(). Zabezpiecza to przed tym gdy podczas wystawiania danych na port odczytamy coś z portu, a w czasie tego wejdziemy w przerwanie,<br /></div><br />Zobacz rozwinięcie asemblerowe a zobaczysz, że ustawienie czy skasowanie pinu to JEDEN rozkaz. bezzsensowne jest zatem wyłączanie i to w zły sposób przerwań. Jedyny przypadek, kiedy miałoby to sens, to duże AVR gdzie porty są poza SFR, w obszarze, w którym inne AVR maja SRAM. W takiej sytuacji ustawianie czy kasowanie pinu to 3 rozkazy<br />POBIERZ<br />ZMODYFIKUJ (AND/OR)<br />ZAPISZ<br /><br />Dlaczego napisałem, że źle są wyłaczane a właściwie włączane przerwania? Jeśli napiszemy kod<br />CLI<br />CUDA NA KIJU<br />digiotalWrite<br />KOLEJNE CUDA<br />SEI<br />to część kodu, mimo iż miała wykonać się z wyłączonymi przerwaniami, wykona się z włączonymi.<br /><br />Do blokowanie przerwań należy używać ATOMIC_BLOCK konkretnie ATOMIC_BLOSK( ATOMIC_RESTORESTATE )<br />Zadziała to tak<br />zmienna = PSW<br />CLI<br />program w bloku<br />PSW = zmienna<br /><br />Jeśli w kodzie jesteśmy pewni, że przerwania są włączone i wydaje się, że należy zrobić<br />CLI<br />POBIERZ<br />ZMODYFIKUJ (AND/OR)<br />ZAPISZ<br />SEI<br /><br />ale można inaczej, tak dla zmyłki<br />CLI<br />POBIERZ<br />ZMODYFIKUJ (AND/OR)<br />SEI<br />ZAPISZ<br />Dlaczego? Kto wie?<br /><br /><br /><br />Niby Arduino jest idioto odporne, mnie wygląda na to, że pisali je idioci. Jest napisane zwyczajnie po głupiemu. Bascom, niepozbawiony błędów, jest chyba bardziej przemyślany.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21040">ProgramistaAVR</a> — 8 sty 2020, o 12:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[tischtennis]]></name></author>
<updated>2020-01-05T16:39:28+01:00</updated>
<published>2020-01-05T16:39:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=223989#p223989</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=223989#p223989"/>
<title type="html"><![CDATA[Re: ustawianie pinu, a cli()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=223989#p223989"><![CDATA[
Dziękuję bardzo kolego andrews za super rozjaśnienie! Czyli da się bez jakiś tekstów o &quot;andruino druga krew&quot; zwyczajnie wyjaśnić temat.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20653">tischtennis</a> — 5 sty 2020, o 16:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2020-01-05T12:12:51+01:00</updated>
<published>2020-01-05T12:12:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=223987#p223987</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=223987#p223987"/>
<title type="html"><![CDATA[Re: ustawianie pinu, a cli()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=223987#p223987"><![CDATA[
<div class="quotetitle">tischtennis napisał(a):</div><div class="quotecontent"><br />czyli te &quot;podstawowe&quot; ustawianie pinów przez makra zostanie zamienione na sbi i cbi, a stan portu nie będzie czytany i po problemie<br /></div><br />Nie do końca tak jest. Instrukcje te mają swoje zalety, przez co są bardzo chętnie używane przez kompilator. Niemniej mają też pewne ograniczenia:<ul><li>zakres działania tych instrukcji - można je wykonać tylko na rejestrach o adresie mniejszym lub równym 0x1F (31)w przestrzeni adresowej I/O; na szczęście przypadki, gdy mikrokontroler ma rejestry I/O poza tym zakresem są rzadkie i dotyczą raczej mikrokontrolerów o dużej ilości portów/pinów I/O,</li><li>mogą wykonywać operacje tylko na jednym bicie jednocześnie, więc w przypadku instrukcji operującej na kilku bitach np. <strong><em>PORTD |= 0b00101100;</em></strong> kompilator może uznać, że intencją programisty jest zmiana stanu wszystkich bitów w tym samym czasie (takcie zegara) i nie rozbije operacji na szereg instrukcji SBI, bo to wprowadziłoby pewne opóźnienie.</li></ul><br />Oczywiście w większości przypadków wyłączanie przerwań będzie zbędne, jednak trzeba mieć na względzie przypadki szczególne.<br /><br /><div class="quotetitle">tischtennis napisał(a):</div><div class="quotecontent"><br />Zabezpiecza to przed tym gdy podczas wystawiania danych na port odczytamy coś z portu, a w czasie tego wejdziemy w przerwanie, które też coś ustawia na danym porcie i w efekcie możemy nadpisać tamtą wartość - dobrze to rozumiem?<br /></div><br />Myślę, że dobrze to rozumiesz, ale problem dotyczy nie tylko portów I/O, ale także (a może nawet głównie) zmiennych w pamięci RAM współdzielonych przez przerwanie i pętlę główną programu (w niektórych przypadkach nawet tych ośmiobitowych). Tutaj akurat wyłączanie przerwań na czas modyfikacji takiej zmiennej w pętli głównej programu jest bardzo często (choć nie zawsze) niezbędne dla zapewnienia poprawności działania programu i głównie na tym problemie warto się skoncentrować. Mikrokontrolery AVR (przynajmniej tiny i mega), nie posiadają instrukcji ASM do bezpośredniego modyfikowania zawartości komórki pamięci RAM, więc zmienną należy wczytać do rejestrów, zmodyfikować i ponownie zapisać do RAM, co wymaga wykonania kilku(nastu) instrukcji ASM. Jeśli w tym czasie wystąpi przerwanie, które również modyfikuje tę samą zmienną...<br /><br />To tak tylko gwoli uzupełnienia. Jak wspomniał powyżej kolega Mirek, nie sposób przewidzieć tutaj wszystkich możliwych sytuacji oraz zależności i podać krótką, jednoznaczną odpowiedź.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 5 sty 2020, o 12:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[tischtennis]]></name></author>
<updated>2020-01-05T10:54:38+01:00</updated>
<published>2020-01-05T10:54:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=223986#p223986</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=223986#p223986"/>
<title type="html"><![CDATA[Re: ustawianie pinu, a cli()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=223986#p223986"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />Poza tym - w prockach AVR wiele operacji dostępu do pinów portów jak chodzi o pojedyncze piny wykonać można w sposób atomowy o ile wiesz co to oznacza. Krótko mówiąc po to są w asemblrze AVR taki rozkazi jak sbi czy cbi żeby było to możliwe i kompilator C z tego korzysta garściami. W takich przypadkach stosowanie cli i sei przed i po jest po prostu czystym nonsensem. A w andruino jak mówiłem jest jeszcze pierdyliard innych nonsensów więc nie wymagaj żeby je wszystkie tutaj opisywać bo szkoda czasu. Lepiej się pouczyć C;) będzie on wtedy lepiej spożytkowany.<br /></div><br /><br />O tych rozkazach nie wiedziałem - czyli te &quot;podstawowe&quot; ustawianie pinów przez makra zostanie zamienione na sbi i cbi, a stan portu nie będzie czytany i po problemie - w sumie to by była odpowiedź na moje pytanie w jednym zdaniu. Chociaż też nie &quot;lepiej się pouczyć C&quot; bo to trochę zjazd poziom niżej do assemblera.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20653">tischtennis</a> — 5 sty 2020, o 10:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2020-01-05T08:05:15+01:00</updated>
<published>2020-01-05T08:05:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=223985#p223985</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=223985#p223985"/>
<title type="html"><![CDATA[Re: ustawianie pinu, a cli()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=223985#p223985"><![CDATA[
Ale co tu tłumaczyć ? rozpatrywać dlaczego tak andruino sobie wymyśliło ? No to ci wyjaśnię - andruino musi przemyśleć różne nawet najbardziej durne ruchy &quot;programisty&quot; ... dlatego zabezpiecza się na 1000000 sposobów robiąc przy tym miliard nadmiarowych operacji. Mało kto zajmując się andruino nawet zdaje sobie sprawę dobrze co to są przerwania. Więc czego ty oczekujesz ? Jaki jest efekt takich nadmiarowych operacji ? ... dość prosty - mega spowolnienie różnych operacji i duża nadmiarowość generowanego kodu wynikowego we Flash. Podobnie jest w Bascom ... Twórcy tych ala języków programowania muszą wziąć na siebie jak wspominałem tzw idiotoodporność a i tak im się to nie udaje do końca bo im mniej taki programista zadaje sobie trudu żeby nauczyć się czegoś na temat procka i jego działania &quot;od środka&quot; tym więcej ten programista popełnia błędów. Ale spokojnie są też zalety tych języków:<br /><br />1. rzeczywiście gdy ktoś chce stworzyć ot tak - przypadkowo raz na rok albo raz na całe życie jakieś urządzonko - odtworzyć je z netu do swoich potrzeb - no to proszę bardzo - często mu się to udaje<br />2. jest to zawsze jakiś tam startw świat mikrokontrolerów<br />3. na takich językach - środowiskach - można na szybko sprawdzić czy coś działa jeśli w C na początku nie wychodzi - gdy się znajdzie jakiś przykładowy kod w andruino czy bascomie<br />4. akurat do andruino istnieje ogromna społeczność na świecie która tworzy pierdyliard różnych bibliotek - to nic że ogromna ich ilość działa wadliwie albo jest napisana tragicznie i działają mega wolno - ale zawsze coś tam da się odpalić<br /><br /><div class="quotetitle">tischtennis napisał(a):</div><div class="quotecontent"><br />liczyłem na jakieś wyjaśnienie tego problemu/dyskusję<br /></div><br />o to tobie chodziło ? O taką merytoryczną dyskusję ? o rozpatrywanie dlaczego warto zastosować pierdyliard zabezpieczeń zawsze i w każdym momencie ?<br /><br />Powiem ci szczerze - że nie warto nawet nad takimi rzeczami się pochylać i dyskutować ... więcej zrobisz rozpoczynając własną naukę w C, własne próby, pisząc własne kody i nawet jak nie będzie zawsze wychodziło - to po to masz forum żeby dopytać a nie tam rozpoczynać jałowe dyskusje dlaczego coś tam ktoś wymyślił w andruino.<br /><br />Poza tym - w prockach AVR wiele operacji dostępu do pinów portów jak chodzi o pojedyncze piny wykonać można w sposób atomowy o ile wiesz co to oznacza. Krótko mówiąc po to są w asemblrze AVR taki rozkazi jak sbi czy cbi żeby było to możliwe i kompilator C z tego korzysta garściami. W takich przypadkach stosowanie cli i sei przed i po jest po prostu czystym nonsensem. A w andruino jak mówiłem jest jeszcze pierdyliard innych nonsensów więc nie wymagaj żeby je wszystkie tutaj opisywać bo szkoda czasu. Lepiej się pouczyć C;) będzie on wtedy lepiej spożytkowany.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 5 sty 2020, o 08:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[tischtennis]]></name></author>
<updated>2020-01-05T00:40:49+01:00</updated>
<published>2020-01-05T00:40:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=223984#p223984</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=223984#p223984"/>
<title type="html"><![CDATA[Re: ustawianie pinu, a cli()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=223984#p223984"><![CDATA[
chyba nie warto o nic pytać - liczyłem na jakieś wyjaśnienie tego problemu/dyskusję - pytam &quot;jak robić żeby było dobrze i dlaczego tak&quot; i dostałem odpowiedź &quot;myśl i rób tak, żeby było dobrze&quot; z jakimś &quot;arduino ostatnia krew&quot; na dodatek - może za bardzo weekend wleciał i się nie dogadamy o tej porze<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20653">tischtennis</a> — 5 sty 2020, o 00:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2020-01-05T00:24:20+01:00</updated>
<published>2020-01-05T00:24:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=223983#p223983</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=223983#p223983"/>
<title type="html"><![CDATA[Re: ustawianie pinu, a cli()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=223983#p223983"><![CDATA[
Mirek odpowiedział prawidłowo <br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />myśl i pisz program tak jak tego wymaga projekt<br /></div><br />I tyle w temacie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Jeśli wiesz co robisz i przestrzegasz zasad dobrego programowania to żadne zabiegi z main nie będą wpływały na przerwania i odwrotnie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 5 sty 2020, o 00:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[tischtennis]]></name></author>
<updated>2020-01-04T23:59:51+01:00</updated>
<published>2020-01-04T23:59:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=223982#p223982</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=223982#p223982"/>
<title type="html"><![CDATA[Re: ustawianie pinu, a cli()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=223982#p223982"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">tischtennis napisał(a):</div><div class="quotecontent"> Jak robimy uniwersalnie bibliotekę<br /></div><br />Tak jak będziesz robił andruino II ostatnia krew - to wtedy możesz dodać <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> w przeciwnym wypadku myśl i pisz program tak jak tego wymaga projekt</div><br /><br />a coś merytorycznego też można prosić? Czyli to nie jest żaden problem i się tym nie przejmować? Jeśli tak wystarczyło to tak napisać...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20653">tischtennis</a> — 4 sty 2020, o 23:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2020-01-04T23:54:39+01:00</updated>
<published>2020-01-04T23:54:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=223981#p223981</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=223981#p223981"/>
<title type="html"><![CDATA[Re: ustawianie pinu, a cli()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22771&amp;p=223981#p223981"><![CDATA[
<div class="quotetitle">tischtennis napisał(a):</div><div class="quotecontent"><br />Jak robimy uniwersalnie bibliotekę<br /></div><br />Tak jak będziesz robił andruino II ostatnia krew - to wtedy możesz dodać <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> w przeciwnym wypadku myśl i pisz program tak jak tego wymaga projekt<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 4 sty 2020, o 23:54</p><hr />
]]></content>
</entry>
</feed>