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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-02-27T23:16:58+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=49&amp;t=14544&amp;mode</id>
<entry>
<author><name><![CDATA[kenubi]]></name></author>
<updated>2016-02-16T13:50:14+01:00</updated>
<published>2016-02-16T13:50:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14544&amp;p=153791#p153791</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14544&amp;p=153791#p153791"/>
<title type="html"><![CDATA[Re: Przekazywanie parametrów z C (avr-gcc) do asm (avr-as)-S]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14544&amp;p=153791#p153791"><![CDATA[
dzięki za linka, byłem na tych stronach (<a href="http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_reg_usage"  class="postlink">http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_reg_usage</a>) i zapomniałem że tam jest co poczytać. Ten RS służy mi raczej jako podglądacz, bo do t13 co ma 8 nóg raczej ciężko doczepić wyświetlacz itp., coś 30 bajtów a spore możliwości przesłania danych (mam taki USB pl2303 TTL za kilka zł -dobra i szybka sprawa).<br /><br />No to już chyba wszystko [w zakresie pytania] będę wiedział.<br /><br />[OT] A projekt to taka ładowarka Li-ion z własnym trafo i chińskim modułem TP4056 (takie z alle po 3 zł), dodałem do tego P-MOSFET (TCP8103 bodaj) i procka by to było takie włóż i zapomnij, podlutowałem się pod otwarte kolektory TP4056 Ledów. MOSFET pilnuje biegunowości (moduł się pali choć w nocie coś tam było że niby odporny), odłącza ładowanie po np. 3h definitywnie, itd. Po prostu trochę boję ogniw z laptopów, to ma dodatkowo czuwać nad przebiegiem ładowania. I tylko jeszcze zachciało mi się rozbudowywać o &quot;diagnostykę&quot; ładowania.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12667">kenubi</a> — 16 lut 2016, o 13:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jnk0le]]></name></author>
<updated>2016-02-16T17:10:06+01:00</updated>
<published>2016-02-16T12:30:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14544&amp;p=153789#p153789</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14544&amp;p=153789#p153789"/>
<title type="html"><![CDATA[Re: Przekazywanie parametrów z C (avr-gcc) do asm (avr-as)-S]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14544&amp;p=153789#p153789"><![CDATA[
<span style="font-size: 50%; line-height: normal">Sprzętowy uart i hardcodowane delay'e to niezbyt dobry pomysł.</span>Jednak jest to sw<br /><br />A tu coś więcej o przekazywanych argumentach<br /><!-- m --><a class="postlink" href="http://www.elektroda.pl/rtvforum/topic1091583.html" >http://www.elektroda.pl/rtvforum/topic1091583.html</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8491">jnk0le</a> — 16 lut 2016, o 12:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kenubi]]></name></author>
<updated>2016-02-27T23:16:58+01:00</updated>
<published>2016-02-16T01:53:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14544&amp;p=153771#p153771</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14544&amp;p=153771#p153771"/>
<title type="html"><![CDATA[Przekazywanie parametrów z C (avr-gcc) do asm (avr-as)-STOS]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14544&amp;p=153771#p153771"><![CDATA[
Cześć, lata temu pisałem sporo w Assemblerze (6502,80286+), przez następne lata(nie pytajcie ile) ..prawie zapomniałem jak to było.<br />Dziś dłubię sobie trochę takich użytecznych w domu projekcików (i chyba nakupię attiny13a i attiny24 bo tanie są &lt;2,5zł a ja mam 1000 pomysłów - tylko żona wściekła chodzi. <br />Mam takie pytanko:<br />Jak wymusić na C określony sposób przekazywania parametrów do asm, kiedyś trochę hakowałem małe programy w C na intelu to raczej zawsze szło przez stos z C (C raczej znałem tylko po łebkach wtedy).<br /><br />Tutaj widzę (zaglądałem do .dump w asm) że wszystko jest pchane przez rejestry, głównie r24 i r25, a ja bym chciał tak prościutko wołać w C np. RS232_wyslij(12); zamiast ładować r24 i wołać - tak, oczywiście, to w asm czytam r24, ale czy zawsze to będzie r24? - o to chodzi, można chyba przekazać adres zmiennej z C do ASM, no ale - ale co z tym stosem? - to mnie ciekawi.<br />Ogólnie ten r24 mi nie przeszkadza, ale chciałbym by to (kompilacja) działało na więcej niż jednym kompie (i kompilatorze).<br />Ale może od początku (tak sobie to kompiluję (linux, avrdude,avr-gcc,avr-libc) <br />UWAGA! - wersje &quot;mocno robocze&quot;, takie &quot;tysiąc razy&quot; poprawiane/testowane :<br />[syntax=bash]#!/bin/bash<br />#<br />PRG='ladowarka-ctc2'<br />rm $PRG.o 2&gt;/dev/null<br />rm $PRG.hex 2&gt;/dev/null<br />rm $PRG.bin 2&gt;/dev/null<br />rm $PRG.elf 2&gt;/dev/null<br />echo '-------*** KOMPILOWANIE ***-------'<br />echo '---ASM-----'<br />avr-gcc -g -c -Os -mmcu=attiny13 -DF_CPU=1200000UL $PRG.S -o $PRG-s.o -Wa,--gstabs<br />echo '----C-----'<br />avr-gcc -g -c -Os -Wall -mmcu=attiny13 -DF_CPU=1200000UL $PRG.c -o $PRG-c.o<br />echo '---LINK---'<br />avr-gcc -mmcu=attiny13 -Wl,-Map=tst13,--cref -o $PRG.elf $PRG-c.o $PRG-s.o<br />STAT=$?<br />if &#91; &quot;$STAT&quot; == &quot;0&quot; &#93;;then<br />avr-objdump -C -d ./$PRG.elf &gt;$PRG.dump<br />avr-objcopy -S -O ihex $PRG.elf $PRG.hex<br />avr-objcopy -S -O binary $PRG.elf $PRG.bin<br />#wgranie do scalaka<br />avrdude -p t13 -c usbasp-clone -B20 -U flash:w:${PRG}.hex<br />fi<br />echo '-------**** KONIEC ****-------'[/syntax]<br />no i mam sobie w asm takie wysyłanie przez RS232 (sciągniete z noty ATMELA i prrzerobione na AVR-GCC) &quot;ladowarka-ctc2.S&quot; (duże &quot;.S&quot; !):<br />[syntax=asm]#define __SFR_OFFSET 0<br />#include &lt;avr/io.h&gt;<br />#define BV(bit) (1 &lt;&lt; (bit))<br /><br />;Global register variables, UWAGA dla DEFINE (preprocesowa) stosowac komentarze (za) wg. składni C<br />#definebitcntr16// bit counter<br />#definetempr17// temporary storage register<br />#defineTxbyter18// Data to be transmitted<br />#defineRxbyter19// Received data<br /><br />.equ RxD,3;Receive pin is PD0<br />.equ TxD,4;Transmit pin is PD1<br />.equb,17;9600 bps @ 1.2 MHz crystal<br />.equsb,1;Number of stop bits (1, 2, .. )<br /><br />.global RS_putchar<br />.global RS_getchar<br />.global RS_forever<br />.global RS_reset<br /><br />.section .text<br /><br />;.org 0x0<br />;rjmpreset<br /><br /><br /><br />;***************************************************************************<br />;*<br />;* &quot;putchar&quot;<br />;*<br />;* This subroutine transmits the byte stored in the &quot;Txbyte&quot; register<br />;* The number of stop bits used is set with the sb constant<br />;*<br />;* Number of words:14 including return<br />;* Number of cycles:Depens on bit rate<br />;* Low registers used:None<br />;* High registers used:2 (bitcnt,Txbyte)<br />;* Pointers used:None<br />;*<br />;***************************************************************************<br />.func RS_putchar<br />RS_putchar:<br />ldibitcnt,9+sb;9+sb<br />comTxbyte;Inverte everything<br />sec;Start bit<br />putchar0:<br />brccputchar1;If carry set<br />cbiPORTB,TxD;    send a '0';cbi_SFR_IO_ADDR(PORTB),TxD;    send a '0'<br />rjmpputchar2;else<br /><br />putchar1:<br />sbiPORTB,TxD;    send a '1'<br />nop<br /><br />putchar2:<br />rcallUART_delay;One bit delay<br />rcallUART_delay<br /><br />lsrTxbyte;Get next bit<br />decbitcnt;If not all bit sent<br />brneputchar0;   send next<br />;else<br />ret;   return<br />.endfunc<br /><br />;***************************************************************************<br />;*<br />;* &quot;getchar&quot;<br />;*<br />;* This subroutine receives one byte and returns it in the &quot;Rxbyte&quot; register<br />;*<br />;* Number of words:14 including return<br />;* Number of cycles:Depens on when data arrives<br />;* Low registers used:None<br />;* High registers used:2 (bitcnt,Rxbyte)<br />;* Pointers used:None<br />;*<br />;***************************************************************************<br /><br />.func RS_getchar<br />RS_getchar:<br />ldi bitcnt,9;8 data bit + 1 stop bit<br /><br />getchar1:<br />sbic PINB,RxD;Wait for start bit<br />rjmp getchar1<br /><br />rcallUART_delay;0.5 bit delay<br /><br />getchar2:<br />rcallUART_delay;1 bit delay<br />rcallUART_delay<br /><br />clc;clear carry<br />sbic PINB,RxD;if RX pin high<br />sec;<br /><br />dec bitcnt;If bit is stop bit<br />breq getchar3;   return<br />;else<br />ror Rxbyte;   shift bit into Rxbyte<br />rjmp getchar2;   go get next<br /><br />getchar3:<br />ret<br />.endfunc<br /><br />;***************************************************************************<br />;*<br />;* &quot;UART_delay&quot;<br />;*<br />;* This delay subroutine generates the required delay between the bits when<br />;* transmitting and receiving bytes. The total execution time is set by the<br />;* constant &quot;bps&quot;:<br />;*<br />;*3xb + 7 cycles (including rcall and ret)<br />;*<br />;* Number of words:4 including return<br />;* Low registers used:None<br />;* High registers used:1 (temp)<br />;* Pointers used:None<br />;*<br />;***************************************************************************<br />; Some b values: (See also table in Appnote documentation)<br />;<br />; 1 MHz crystal:<br />;   9600 bps - b=14<br />;  19200 bps - b=5<br />;  28800 bps - b=2<br />;<br />; 2 MHz crystal:<br />;  19200 bps - b=14<br />;  28800 bps - b=8<br />;  57600 bps - b=2<br /><br />; 4 MHz crystal:<br />;  19200 bps - b=31<br />;  28800 bps - b=19<br />;  57600 bps - b=8<br />; 115200 bps - b=2<br />; ---------------------moje------------------<br />; b = ((f/baudrate)-23)/6  -&gt; ((1000000/9600)-23)/6 == 13.53,  dla 1.2Mhz i 9600 == równiutko 17.000<br /><br /><br />UART_delay:<br />lditemp,b<br />UART_delay1:<br />dectemp<br />brneUART_delay1<br />ret<br /><br /><br />;***** Program Execution Starts Here<br /><br />;***** Test program (uwaga, nie wysylac ciagu - zwroci co 2gi znak bo to half-duplex)<br />.func RS_reset<br />RS_reset:<br />sbiPORTB,TxD;Init port pins<br />sbiDDRB,TxD<br /><br />ldiTxbyte,12;Clear terminal<br />rcallRS_putchar<br />.endfunc<br /><br />.func RS_forever<br />RS_forever:<br />rcallRS_getchar<br />movTxbyte,Rxbyte<br />rcallRS_putchar;Echo received char<br />rjmpRS_forever<br />.endfunc[/syntax]<br />Przepraszam - wersja robocza ze śmieciami, działa na Attiny13A (przynajmnie jeszcze niedawno hehe) - transmisja 9600n bodów, 8N1.<br /><br />Tutaj mam kawałek funkcji w C:<br />[syntax=c]void nadawaj(void) {<br />RS_putchar(1);<br />RS_putchar(2);<br />RS_putchar(3);<br />RS_putchar(1);//version<br />RS_putchar(licznikEE);<br />RS_putchar(myflags);<br />RS_putchar(deltaV);<br />RS_putchar(pomiar);<br />RS_putchar(charge_start);<br />RS_putchar(charge_start&gt;&gt;8);<br />RS_putchar(charge_end);<br />RS_putchar(charge_end&gt;&gt;8);<br />....<br />ret[/syntax]<br /><br />No a teraz dump (asm):\<br />[syntax=asm]00000094 &lt;nadawaj&gt;:<br />  94:81 e0       ldir24, 0x01; 1<br />  96:85 d0       rcall.+266    ; 0x1a2 &lt;RS_putchar&gt;<br />  98:82 e0       ldir24, 0x02; 2<br />  9a:83 d0       rcall.+262    ; 0x1a2 &lt;RS_putchar&gt;<br />  9c:83 e0       ldir24, 0x03; 3<br />  9e:81 d0       rcall.+258    ; 0x1a2 &lt;RS_putchar&gt;<br />  a0:81 e0       ldir24, 0x01; 1<br />  a2:7f d0       rcall.+254    ; 0x1a2 &lt;RS_putchar&gt;<br />  a4:80 91 62 00 ldsr24, 0x0062<br />  a8:7c d0       rcall.+248    ; 0x1a2 &lt;RS_putchar&gt;<br />  aa:80 91 6e 00 ldsr24, 0x006E<br />  ae:79 d0       rcall.+242    ; 0x1a2 &lt;RS_putchar&gt;<br />  b0:80 91 60 00 ldsr24, 0x0060<br />  b4:76 d0       rcall.+236    ; 0x1a2 &lt;RS_putchar&gt;[/syntax]<br /><br />(EDIT 18.02.2016) Taka jeszcze uwaga do powyższego (akurat nie złapałem zapisu ze zmiennych 16 bit, te widoczne są uint8_t).<br />[syntax=c]extern RS_putchar(uint8_t);<br />#define lo8(x) ( *((uint8_t*)&amp;x) )<br />#define hi8(x) ( *((uint8_t*)&amp;x+1) )<br />//i<br />RS_putchar( lo8(zmienna16t) );<br />RS_putchar( hi8(zmienna16t) );[/syntax]<br />Daje to mniejszy kod wynikowy w ASM względem RS_putchar( zmienna16t ) - to ładuje r24 i r25;  RS_putchar( zmienna16t&gt;&gt;8 ) - to ładuje r24 i r25 + przepisuje r25 do r24; RS_putchar( lo8(zmienna16t) ) daje tylko ładowanie r24 (lds r24, 0xadres-zmienna16t-pierwszy-bajt).<br />Choc nie wiem czy dałoby się to zapisać ładniej (w C programuję mało i okazjonalnie = słabo pamiętam).<br />(END)<br /><br /><br />Mam jeszcze w C takie coś:<br />[syntax=c]register unsigned char r18 asm(&quot;r18&quot;);//nadawany z RS232<br />register unsigned char r19 asm(&quot;r19&quot;);//odebrany z RS232<br />register unsigned char r24 asm(&quot;r24&quot;);//testujemy C[/syntax]<br /><br />Jeżeli &quot;zarejestrowałem&quot; w C rejest r24 to podczas kompilacji dostaję ostrzeżenia o wykorzystywaniu R24 przez C - całkiem nieźle - ale dla wiedzącego o co kaman.<br />A jak wymusić przekazanie przez stos? <br />.. przez zdefiniowanie czegoś w C inline asm? (przyznam nawet nie próbowałem tego tykać).<br />Czy może jest inny sposób? - zasada np. taka, zrzuca mi na stos, ja zrzucam na stos jeszcze robocze, przestawiam wskaźnik SP -(+) X bajtów parametrów, odczytuje do roboczych parametry ze stosu, robię, pobieram ze stosu wart. roboczych i wracam z procedury.<br />Tylko stos trochę mały <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> 64 RAM uff.<br />Przepraszam za chaotyczność wypowiedzi. Ciut późno skończyłem.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12667">kenubi</a> — 16 lut 2016, o 01:53</p><hr />
]]></content>
</entry>
</feed>