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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2023-01-16T17:50:17+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=49&amp;t=24384&amp;mode</id>
<entry>
<author><name><![CDATA[Mik20]]></name></author>
<updated>2023-01-16T17:50:17+01:00</updated>
<published>2023-01-16T17:50:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24384&amp;p=236376#p236376</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24384&amp;p=236376#p236376"/>
<title type="html"><![CDATA[Re: Przekazywanie portu jako argumentu funkcji C z wstawką A]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24384&amp;p=236376#p236376"><![CDATA[
Dziękuje za odpowiedź. Port przekazałem jako wartość stałą za pomocą dyrektywy #define. Wykonuję warstwę fizyczną programowego UARTA wg. noty AVR305. Funkcję do nadawania znaków już wykonałem i działa mi można powiedzieć rewelacyjnie. Natomiast mam problem z funkcją odbierania znaków. Nie ukrywam, że już dobry tydzień się z tym męczę.<br />[syntax=c]#define RX_HALF_BAUD_FACTOR((((F_CPU / SOFT_UART_BAUD_RATE) - 4.) / 6.) + 0.49)//obliczanie czasu trwania poszczególnych stanów na RX_UART<br />#define RX_START_BAUD_FACTOR((((F_CPU / SOFT_UART_BAUD_RATE) - 4.) / 6.) + 0.49)<br />#define ALL_BITS_RX8//suma wszystkich bitów w ramce RX_UART (bez bitu startu)[/syntax]<br />[syntax=c]char soft_uart_get_char(void){//niedokończona, nie działa!!!!!!!!!!!!!!!!<br /><br />register uint8_t baud_factor_rx = RX_HALF_BAUD_FACTOR;<br />register uint8_t start_factor_rx = RX_START_BAUD_FACTOR;<br />register char data = '\0';<br /><br />asm volatile(<br /><br />&quot;sbic %&#91;UPORT&#93;-2, %&#91;UPIN&#93;         \n\t&quot;//1-2//jeżeli pin jest w stanie niskim '0' skocz do ldi r16, %&#91;ABITS&#93;<br />        &quot;rjmp _end   \n\t&quot; //2//jeżeli pin jest w stanie wysokim '1' skocz do _end<br />        &quot;ldi r16, %&#91;ABITS&#93;                       \n\t&quot;//1//licznik bitów -&gt; bity danych + bity stopu<br />&quot;mov r17, %&#91;BAUDFH&#93;                 \n\t&quot;//1//TIMER0, załadowanie wartości BAUDFH do r17<br />          &quot;_dehtr0: dec r17          \n\t&quot; //1//TIMER0, dekrementacja wartości licznika<br />&quot;brne _dehtr0  \n\t&quot;//1-2//TIMER0, spr czy licznik wyzerowany jeżeli tak skocz do _dehtr0<br />     &quot;_start: mov r17, %&#91;BAUDF&#93;  \n\t&quot;//1//TIMER1, załadowanie wartości BAUDF do r17<br />          &quot;_dehtr1: dec r17          \n\t&quot; //1//TIMER1, dekrementacja wartości licznika<br />                &quot;brne _dehtr1          \n\t&quot;//1-2//TIMER1, spr czy licznik wyzerowany jeżeli tak skocz do _dehtr1<br />&quot;mov r17, %&#91;BAUDF&#93;                   \n\t&quot;//1//TIMER2, załadowanie wartości BAUDF do r17<br />          &quot;_dehtr2: dec r17          \n\t&quot; //1//TIMER2, dekrementacja wartości licznika<br />                &quot;brne _dehtr2          \n\t&quot;//1-2//TIMER2, spr czy licznik wyzerowany jeżeli tak skocz do _dehtr2<br />/*&quot;clc           \n\t&quot;//1*/ &quot;cbi %&#91;UPORT&#93;, %&#91;TEST&#93;\n\t&quot;//do spr<br />&quot;sbic %&#91;UPORT&#93;-2, %&#91;UPIN&#93;         \n\t&quot; //1-2<br />/*&quot;sec  \n\t&quot; //1*/ &quot;sbi %&#91;UPORT&#93;, %&#91;TEST&#93;\n\t&quot;//do spr<br />&quot;ror %&#91;data&#93;                            \n\t&quot;//1<br />&quot;dec r16                                      \n\t&quot;//1<br />&quot;brne _start                                 \n\t&quot;//1-2<br />      &quot;_end: nop             \n\t&quot; //0<br /><br />: /*WYJSCIA*/&#91;data&#93; &quot;+r&quot; (data)<br />: /*WEJSCIA*/   &#91;UPORT&#93; &quot;I&quot; (_SFR_IO_ADDR(SOFT_UART_PORT)),<br /> &#91;UPIN&#93; &quot;M&quot; (SOFT_UART_RX_PIN),<br />       &#91;ABITS&#93; &quot;M&quot; (ALL_BITS_RX),<br />       &#91;BAUDF&#93; &quot;r&quot; (baud_factor_rx),<br />         &#91;BAUDFH&#93; &quot;r&quot; (start_factor_rx),<br /><br /><br /> &#91;TEST&#93; &quot;M&quot; (SOFT_UART_TX_PIN)<br /><br />);<br /><br />return data;<br /><br />}[/syntax]<br />Powyższa funkcja wywoływana jest w przerwaniu PCINT4 (od dowolnego zbocza); uznałem, że nie ma sensu wywoływania jej w pętli głównej ze względu na ważne zależności czasowe. Prześledziłem funkcję wiele razy niestety jest z nią jakiś problem (baudrate 9600, kwarc 7.3728 MHz). Mianowicie odczytuje mi ona zbyt wiele bitów (przynajmniej tak wynika z analizatora):<br /><a href="https://obrazkiforum.atnel.pl/22003/e5f5cb1ff19d8f34ca052012e2022901.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/22003/e5f5cb1ff19d8f34ca052012e2022901.jpg" alt="Obrazek" /></a><br />Nie jestem w stanie zweryfikować dlaczego tak się dzieje. Jeżeli usunę testowe ustawianie i czyszczenie bitu i zastąpie je domyślnym ustawianiem i czyszczeniem znacznika przepełnienia zmienna &quot;data&quot; zawsze wychodzi 0. Proszę o pomoc, pewnie błąd jest prosty natomiast jestem początkującym w asemblerze.Pozdrawiam.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 49 minutach ]</span></strong><br /><br />Edit: Powyższe szpilki powstają ze względu na drugie zbocze (narastające) po już zakończonej funkcji; do funkcji dodałem opóźnienie tak żeby przerwanie nie powtórzyło się. Natomiast dalej wartość &quot;data&quot;:[syntax=c]data = soft_uart_get_char();[/syntax] po wykonaniu funkcji jest równa '\0'.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=22003">Mik20</a> — 16 sty 2023, o 17:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Mik20]]></name></author>
<updated>2023-01-11T06:39:43+01:00</updated>
<published>2023-01-11T06:39:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24384&amp;p=236350#p236350</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24384&amp;p=236350#p236350"/>
<title type="html"><![CDATA[Przekazywanie portu jako argumentu funkcji C z wstawką ASM]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24384&amp;p=236350#p236350"><![CDATA[
Witam wszystkich<br /><br />Niedawno zacząłem przygodę z wstawkami asemblerowymi do kodu w C. Chciałbym, aby port w którym chcę ustawić jakiś pin na 1 był przekazywany jako argument funkcji. O ile wiele problemów rozwiązałem sam, tak nie wiem w jaki sposób przekazać port do wstawki asm. Kombinowałem z przekazywaniem go jako &quot;r&quot;, zmianą typu argumentu w funkcji C itp., niestety nie uzyskałem poprawnego rezultatu(brak kompilacji lub niepoprawne działanie programu). Proszę o pomoc (mam nadzieję, że jestem w dobrym dziale). Pozdrawiam<br />[syntax=c]void fun1(uint8_t data, uint8_t pin, uint8_t port){ <br />                                                                                                                  <br />    asm volatile(                                                              <br />                 <br />                 &quot;sbi %&#91;port&#93;, %&#91;pin&#93;             \n\t&quot; <br />                                                                                      <br />    :// /*WYJSCIA*/                                  <br />    :&#91;port&#93; &quot;I&quot; ((_SFR_IO_ADDR(port))),   /*WEJŚCIA*/ //tutaj chcę przekazać port<br />     &#91;pin&#93; &quot;r&quot; (pin),                                              <br />     &#91;cos&#93; &quot;M&quot; (COS)                                                                                          <br />     <br />    );                                                                  <br />                                                                          <br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=22003">Mik20</a> — 11 sty 2023, o 06:39</p><hr />
]]></content>
</entry>
</feed>