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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-04-01T18:34:49+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=11193&amp;mode</id>
<entry>
<author><name><![CDATA[sq5rix]]></name></author>
<updated>2015-04-01T18:34:49+01:00</updated>
<published>2015-04-01T18:34:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11193&amp;p=125294#p125294</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11193&amp;p=125294#p125294"/>
<title type="html"><![CDATA[Asembler w Eclipse]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11193&amp;p=125294#p125294"><![CDATA[
Ciekawa sprawa, był jeden na sto odczyt z dziwacznymi wartościami, trzeba uważać z pomiarami we śnie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> <br />W ogóle temat funkcji sleep jest trudny. Zaczynam go zgłębiać!<br /><br />Fajny link znalazłem:<br /><!-- m --><a class="postlink" href="http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_SEI.html" >http://www.atmel.com/webdoc/avrassemble ... b_SEI.html</a><!-- m --><br />Zły wynik był prawdopodobnie spowodowany wskoczeniem przerwania timera po ustawieniu r24 i r25, który popsuł. <br />Wstawię cli i potem sei, po którym wykona się jeszcze jedna komenda przed kolejnym przerwaniem. Czyli w mojej funkcyjce pomiarowej mogę dać cli po sleep, a sei przed ret i ret się wykona...<br /><br />Czytam:<br /><!-- m --><a class="postlink" href="http://www.atmel.com/Images/doc8352.pdf" >http://www.atmel.com/Images/doc8352.pdf</a><!-- m --><br /><!-- m --><a class="postlink" href="http://www.atmel.com/images/doc8003.pdf" >http://www.atmel.com/images/doc8003.pdf</a><!-- m --><br /><!-- m --><a class="postlink" href="http://www.atmel.com/Images/doc0937.pdf" >http://www.atmel.com/Images/doc0937.pdf</a><!-- m --><br /><!-- m --><a class="postlink" href="http://www.atmel.com/images/doc2551.pdf" >http://www.atmel.com/images/doc2551.pdf</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5966">sq5rix</a> — 1 kwi 2015, o 18:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[sq5rix]]></name></author>
<updated>2015-03-31T22:10:39+01:00</updated>
<published>2015-03-31T22:10:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11193&amp;p=125232#p125232</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11193&amp;p=125232#p125232"/>
<title type="html"><![CDATA[Re: Asembler w Eclipse]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11193&amp;p=125232#p125232"><![CDATA[
Hej,<br /><br />zobaczcie biblioteczkę do pomiarów ADC. <br />Funkcja uint16_t adc() może być użyta jako zwykły odczyt lub przy uśpieniu procka w zależności od define<br />Przetwornik musi być odpowiednio zainicjowany przed użyciem tej funkcji. <br />Miłego używania!<br /><br />Kody:<br />[syntax=c]/*<br /> * measure.h<br /> *<br /> *  Created on: Mar 27, 2015<br /> *      Author: tom<br /> */<br /><br />#ifndef MEASURE_H_<br />#define MEASURE_H_<br /><br />// funkcja mierząca wartość napięcia na ADC<br />// przed jej użyciem należy zainicjować przetwornik, np. tak:<br />/*<br /> ADCSRA |= (1&lt;&lt;ADEN); // switch ADC on<br />ADCSRA |= (1&lt;&lt;ADPS2)|(1&lt;&lt;ADPS1)|(1&lt;&lt;ADPS0);  // prescaler 128<br />ADMUX |= (ADC_REF_1_1V) ; //  reference voltage<br />ADMUX = (ADMUX &amp; 0xF0) | 0b1111; //  pomiar temperatury w ATTTiny85<br />lub tak:<br />ADCSRA |= (1&lt;&lt;ADEN); // switch ADC on<br />ADCSRA |= (1&lt;&lt;ADPS2)|(1&lt;&lt;ADPS1)|(1&lt;&lt;ADPS0);  // prescaler 128<br />ADMUX &amp;= ~(ADC_REF_VCC) ; //  reference voltage 5V<br />ADMUX = (ADMUX &amp; 0xF0) | 0b0010; //  channel ADC2, PB4 pin<br /><br />Po pomiarze można wyłączyć przetwornik<br />ADCSRA &amp;= ~(1&lt;&lt;ADEN); // wyłączenie ADC<br /> */<br /><br />extern uint16_t adc(void);<br /><br />#endif /* MEASURE_H_ */[/syntax]<br />[syntax=asm]; adc library<br />; tu jest nazwa, cobyśmy pamiętali w jakim pliku jesteśmy :)<br />.file &quot;measure.s&quot;<br /><br />; załączamy io.h żeby mieć definicje portów i rejestrów<br />#include &lt;avr/io.h&gt;<br />; wszystkie komendy dotyczące portów w C<br />; operują na rejestrach w pamięci - wyższych o 0x20<br />; redefiniuję więc offset (będzie warning, ale to nic - działa tylko w tym pliku )<br />;<br />; jeśli nie chcemy tego robić, też można, tylko wszystkie rejestry muszą mieć postać:<br />; _SFR_IO_ADDR(rejestr)<br />; np. _SFR_IO_ADDR(ADCSRA)<br />; poleczam obejrzeć inne komendy _SFR_* jest ich trochę<br />#define   __SFR_OFFSET    0<br /><br />; zaczynamy kod programu<br />.text<br />; funkcja musi być widziana na zewnątrz w pliku measure.h jest jej definicja<br />.global adc<br /><br />; jeśli działamy z wyłączeniem procka podczas konwersji ADC<br />#define ADCSLEEP 1<br /><br />#if ADCSLEEP == 1<br />; bardzo ważne - jak nie ma wystawienia wektora przerwać na zewnątrz<br />; procek będzie nam się resetował<br />; nazwa taka sama jak w ISR(...)<br />                                ; nie musi być tej funkcji w measure.h !!<br />.global ADC_vect<br />; tu zaczyna się właściwa funkcja adc<br />; rejestr r18 należy do grupy rejestrów które można psuć do woli :)<br />; zasady - r0 jest wolnym rejestrem, nic pewnego o nim nie można powiedzieć,<br />; lepiej tam zapisać zanim się odczyta<br />; r1 - w nim zawsze jest 0, nic się w nim nie da zapisać :O<br />; r2 - r17 - jak zapisujemy w naszej funkcji asm, to należy przywrócić wartość zanim wrócimy do C<br />; tak się tego spodziewa kompilator<br />; r18 - r27 i r30-r31 - można zmieniać do woli w naszej funkcji, kompilator C (i C++) spodziewa się tego<br />; r28 i r29 bywa używany jako frame pointer, jeśli zmienimy, to należy przywrócić<br />adc:<br />sbiADCSRA, ADIE; ustawiam bit przerwania ADC, żeby ADC wiedziało,<br />; że ma się wykonać jako przerwanie we śnie<br />inr18, MCUCR; czytam rejestr sleep do r18<br />orir18, (1&lt;&lt;SM0)|(1&lt;&lt;SE); ustawiam dwa bity - spanie z działającym adc SM0 i<br />; umożliwienie spania SleepEnable<br />outMCUCR, r18; umieszczam rejestr r18 w rejestrze sleep<br />sleep; usypiam procek razem z odpaleniem konwersji<br />ret; tu wraca przerwanie, return z wynikiem w rejestrach r24 i r25<br />ADC_vect:; wektor przerwania przetwornika ADC<br />inr18, MCUCR; wczytuję rejestr snu<br />andir18, ~(1&lt;&lt;SE); zeruję bit Sleep Enable<br />outMCUCR, r18; wczytuję r18 do rejestru snu<br />in r24,  ADCL; wczytuję wynik konwersji do rejestrów powrotu z funkcji<br />in r25,  ADCH; wyższy rejestr<br />reti                           ; powrót z przerwania<br /><br />#else<br />; funkcja przetwornika ADC bez przerwania<br />adc:<br />sbi ADCSRA, ADSC ; ustawiam bit uruchomienia przetwarzania ADC<br />loop:<br />sbisADCSRA, ADIF ; Skip if Bit in I/O Register Set<br />; - w tym przypadku przeskocz o jedną instrukcję<br />; jeśli bit o numerze ADIF (4) jest 1<br />rjmp loop; jeśli ADIF jest 0 - powrót do etykiety loop<br />inr18, SREG; zapamiętuję rejestr SREG (najważniejszy)<br />cli; wyłączam na chwilę przerwania<br />in r24,  ADCL; wczytuję wynik konwersji do rejestrów powrotu z funkcji<br />in r25,  ADCH; wyższy rejestr<br />out SREG, r18; przywracam rejestr SREG<br />ret; wracam z funkcji z ustawionym rejestrami r24 i r25<br />; odczytuję je jako uint16_t<br />#endif<br /><br />; trochę źródełek dla dociekliwych:<br />;<br />; https://gcc.gnu.org/wiki/avr-gcc#Call-Used_Registers<br />; http://www.atmel.com/Images/doc1022.pdf[/syntax]  <br /><br />Oczywiście jak zwykle proszę o uwagi - co tu można poprawić?<br /><br />T.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5966">sq5rix</a> — 31 mar 2015, o 22:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[sq5rix]]></name></author>
<updated>2015-03-29T22:47:29+01:00</updated>
<published>2015-03-29T22:47:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11193&amp;p=125024#p125024</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11193&amp;p=125024#p125024"/>
<title type="html"><![CDATA[Asembler w Eclipse]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11193&amp;p=125024#p125024"><![CDATA[
Uch, przepraszam za duplikowanie, wszystko było już na naszym forum.<br />Nie widziałem i doszedłem własnym &quot;długim marszem&quot; <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Dodatkowa fajna stronka dla kolegów z tegoż postu na forum:<br /><!-- m --><a class="postlink" href="http://msoe.us/taylor/tutorial/ce2810/candasm" >http://msoe.us/taylor/tutorial/ce2810/candasm</a><!-- m --><br />A cały post o asemblerze i C:<br /><!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic5881.html" >topic5881.html</a><!-- l --><br /><br />Powiem Wam, że te same funkcje napisane w asemblerze działają jakby lepiej <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5966">sq5rix</a> — 29 mar 2015, o 22:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[sq5rix]]></name></author>
<updated>2015-03-27T12:10:10+01:00</updated>
<published>2015-03-27T12:10:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11193&amp;p=124770#p124770</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11193&amp;p=124770#p124770"/>
<title type="html"><![CDATA[Re: Asembler w Eclipse]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11193&amp;p=124770#p124770"><![CDATA[
Dzięki !!<br /><br />Apropos dyrektyw, to wszystkie pasujące do tego sposobu kodowania są tu:<br /><br /><!-- m --><a class="postlink" href="http://www.sourceware.org/binutils/docs-2.15/as/Pseudo-Ops.html#Pseudo%20Ops" >http://www.sourceware.org/binutils/docs ... eudo%20Ops</a><!-- m --><br /><br />Super poradnik (wprawdzie o Arduino, ale 99% o asemblerze) jest tu:<br /><!-- m --><a class="postlink" href="https://www.youtube.com/watch?v=h8T3PWauYF4&amp;index=5&amp;list=PLifLftIJFUm-gv-OQr_7WbsKdn3i6zdZD" >https://www.youtube.com/watch?v=h8T3PWa ... Kdn3i6zdZD</a><!-- m --><br /><br />Początek serii.<br /><br />W lengłydżu, ale bardzo jasno przekazane. Nawet dla samych slajdów warto zajrzeć.<br /><br />I najważniejszy dokument, bez tego ani rusz:<br /><br /><!-- m --><a class="postlink" href="http://www.atmel.com/Images/doc1022.pdf" >http://www.atmel.com/Images/doc1022.pdf</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5966">sq5rix</a> — 27 mar 2015, o 12:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[sq5rix]]></name></author>
<updated>2015-03-27T01:57:14+01:00</updated>
<published>2015-03-27T01:57:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11193&amp;p=124757#p124757</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11193&amp;p=124757#p124757"/>
<title type="html"><![CDATA[Re: Asembler w Eclipse]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11193&amp;p=124757#p124757"><![CDATA[
Nie, odpalam wszystko w Eclipse na razie. <br />Czysty asembler to nie jest, bo z definicji chcę używać do krytycznych funkcji, a nie kodować całość.<br /><br />Trochę mi się formatowanie rozjeżdża, w eclipsie jest równo <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5966">sq5rix</a> — 27 mar 2015, o 01:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[WoodPaker]]></name></author>
<updated>2015-03-27T01:48:16+01:00</updated>
<published>2015-03-27T01:48:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11193&amp;p=124756#p124756</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11193&amp;p=124756#p124756"/>
<title type="html"><![CDATA[Re: Asembler w Eclipse]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11193&amp;p=124756#p124756"><![CDATA[
To jest takie C ze wstawkami w assemblerze. Czysty assembler wygląda troszkę inaczej. Ale trzeba przyznać, że sposób dość ciekawy.<br />Sprawdzałeś może czy działa to też w AS?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1425">WoodPaker</a> — 27 mar 2015, o 01:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[sq5rix]]></name></author>
<updated>2015-03-27T22:47:45+01:00</updated>
<published>2015-03-27T01:02:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11193&amp;p=124755#p124755</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11193&amp;p=124755#p124755"/>
<title type="html"><![CDATA[Asembler w Eclipse]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11193&amp;p=124755#p124755"><![CDATA[
Wszystko przez Mirka <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><br /><br />Naoglądałem się poradników i przy soku przyszło mi do głowy, żeby się pobratać z Asemblerem!<br /><br />Ale wstawki to Mirek pięknie pokazał jak mają być, a ja zawsze chcę inaczej. <br /><br />Rozwiązanie jest proste - Eclipse jest z default'u przygotowane na działanie z asemblerem dla AVR-ów. <br /><br />Pokażę jak zacząć.<br /><br />Potrzebujemy pliku main.c, no bo całego programu nie chciałem pisać - wszystko od zera w asemblerze, może za chwilę <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />  <br /><br />Z tym, że main.c jest potrzebny zawsze, nawet jak jest prawie pusty, tylko funkcja main() musi być. Bez tego nie idzie....<br /><br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: Mar 27, 2015<br /> *      Author: tom<br /> */<br /><br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/io.h&gt;<br />#include &quot;blink.h&quot;<br /><br />#define LED (1&lt;&lt;5)<br />#define LED_TOG (PORTB ^= LED)<br /><br />int main(void) {<br /><br />DDRB |= LED;<br />PORTB |= LED;<br /><br />while(1){<br />blink();<br />_delay_ms(1000);<br />}<br />}[/syntax]<br /><br />A oto pojavia się tajemnicza funkcja blink(); <br /><br />Zawartość pliku blink.h <br /><br />[syntax=c]/*<br /> * blink.h<br /> *<br /> *  Created on: Mar 27, 2015<br /> *      Author: tom<br /> */<br /><br />#ifndef BLINK_H_<br />#define BLINK_H_<br /><br />extern void blink(void);<br /><br />#endif /* BLINK_H_ */[/syntax]<br /><br />A teraz najważniejsze !!!! Tadaaaam !!!!<br /> <br />Plik blink.s (&lt;--- s jak syczący słoń) <br /><br />[syntax=asm].global blink<br />blink:; start funkcji <br />inr24, 0x18<br />ldir25, 0x20<br />eorr24, r25<br />out0x18, r24<br />ret; wyjscie z funkcji[/syntax]<br /><br />Nie ma żadnych specjalnych ustawień Eclipse, przynajmniej u mnie na Ubuntu - sprawdźcie prosze na windzie <br /><br />Pozdrawiam wszystkich szalonych asemblerowców !!!!<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 37 minutach ]</span></strong><br /><br />A teraz trzy różne funkcje w pliku - taka sobie mini biblioteka <br /><br />Dyrektywa #define, działa też #include<br /><br />[syntax=asm]; blink library<br /><br />                                .global blink<br />.global ledon<br />.global ledoff<br /><br />                                .equ  LED,  5 <br />                                .equ  PORTB, 0x18<br /><br />blink:; start funkcji <br />in     r24, 0x18<br />ldi    r25, 0x20<br />eor    r24, r25<br />out    0x18, r24<br />ret; wyjscie z funkcji <br /><br />ledon:<br />sbi   PORTB, LED<br />ret<br /><br />ledoff:<br />cbi   PORTB, LED<br />ret<br /><br />; koniec[/syntax]<br /><br />Plik &quot;blink.h&quot;<br /><br />[syntax=c]/*<br /> * blink.h<br /> *<br /> *  Created on: Mar 27, 2015<br /> *      Author: tom<br /> */<br /><br />#ifndef BLINK_H_<br />#define BLINK_H_<br /><br />extern void blink(void);<br />extern void ledon(void);<br />extern void ledoff(void);<br /><br />#endif /* BLINK_H_ */[/syntax]<br /><br />A main.c to sobie sami wymyślcie <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /><br /><br />Niestety edytor za bardzo nie pomaga przy pisaniu, ale co tu można pomóc....<br /><br />Jeszcze jedna &quot;odmiana&quot; biblioteczki:<br /><br />[syntax=asm]; blink library<br />.file &quot;blink.s&quot;<br />.global blink<br />.global ledon<br />.global ledoff<br /><br />#include &lt;avr/io.h&gt;<br /><br />.equ LED, 5 <br />.equ PORT, _SFR_IO_ADDR(PORTB) <br /><br />blink:; start funkcji <br />in r24, 0x18<br />ldi r25, 0x20<br />eor r24, r25<br />out 0x18, r24<br />ret; wyjscie z funkcji <br /><br />ledon:<br />sbi PORT, LED<br />ret<br /><br />ledoff:<br />cbi PORT, LED<br />ret[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5966">sq5rix</a> — 27 mar 2015, o 01:02</p><hr />
]]></content>
</entry>
</feed>