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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-08-04T22:00:29+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=8022&amp;mode</id>
<entry>
<author><name><![CDATA[Miles]]></name></author>
<updated>2014-08-04T21:57:34+01:00</updated>
<published>2014-08-04T21:57:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8022&amp;p=90236#p90236</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8022&amp;p=90236#p90236"/>
<title type="html"><![CDATA[Re: UART - przepisanie prostego kodu z C++ do C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8022&amp;p=90236#p90236"><![CDATA[
No i wszystko jasne. To nie miało prawa działać <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=2482">Miles</a> — 4 sie 2014, o 21:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[atmel]]></name></author>
<updated>2014-08-04T22:00:29+01:00</updated>
<published>2014-08-04T21:54:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8022&amp;p=90234#p90234</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8022&amp;p=90234#p90234"/>
<title type="html"><![CDATA[Re: UART - przepisanie prostego kodu z C++ do C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8022&amp;p=90234#p90234"><![CDATA[
Proszę bardzo <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />No i wszystko jasne - użyta w funkcji &quot;uart_putlong&quot; funkcja &quot;ltoa&quot; zamienia liczbę na jej reprezentację znakową (tekst), czyli szereg zer i jedynek, ponieważ dla parametru systemu liczbowego (radix) podana została dwójka tj. zapis binarny.<br />W takiej sytuacji wszystkie zera były wysyłane jako bajty o wartości 48 i 0 (znak końca łańcucha tekstowego), a liczba 16 odpowiadała szeregowi bajtów: 49, 48, 48, 48, 48, 0 <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Na końcu oczywiście jeszcze reprezentacja binarna sumy kontrolnej.<br />W takim razie wysłanych było, ponad 2 * 6 + 6 + [2..9](checksum) = [20..27] bajtów zamiast 7. Ot taka moja mała uwaga <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1183">atmel</a> — 4 sie 2014, o 21:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Miles]]></name></author>
<updated>2014-08-04T21:31:16+01:00</updated>
<published>2014-08-04T21:31:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8022&amp;p=90231#p90231</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8022&amp;p=90231#p90231"/>
<title type="html"><![CDATA[Re: UART - przepisanie prostego kodu z C++ do C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8022&amp;p=90231#p90231"><![CDATA[
Kod w C++ pisany był na arduino, ja używam zwykłej atmegi8 na płytce stykowej. Prędkość transmisji mam ustawioną na 7800 bps. Pin 2 to pozostałość po obsłudze obrotomierza (nie bierze udziału w obsłudze &quot;dealer mode&quot;).<br /><br />Poniżej wstawiam plik z opisem funkcji:<br />[syntax=c]#include &quot;avr/io.h&quot;<br />#include &quot;myuart.h&quot;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br />void uart_init( uint16_t _UBRR)<br />{<br />//ustawienie prędkości transmisji<br />UBRRH = (uint8_t)(_UBRR&gt;&gt;8);<br />UBRRL = (uint8_t)_UBRR;<br />//załączenie transmisji<br />UCSRB = (1&lt;&lt;TXEN);<br />}<br /><br />void uart_putc( char data )<br />{<br />//oczekiwanie na opróżnienie bufora transmisji<br />while ( !( UCSRA &amp; (1&lt;&lt;UDRE)) );<br />//zapisanie danych do bufora i wysłanie<br />UDR = data;<br />}<br /><br />void uart_puts( char * s ) //wysyłanie łańcucha z pamięci RAM<br />{<br />while ( *s ) uart_putc( *s++ );<br />}<br /><br />void uart_puts_P(const char * s ) //wysyłanie łańcucha z pamięci flash<br />{<br />register char c;<br />while (( c=pgm_read_byte(s++) )) uart_putc( c );<br />}<br /><br />void uart_putlong( uint32_t liczba, uint8_t radix )<br />{<br />char buf&#91;17&#93;;<br />ltoa( liczba, buf, radix );<br />uart_puts( buf );<br />}[/syntax]<br /><br />Oraz plik nagłówkowy:<br />[syntax=c]#ifndef MYUART_H_<br />#define MYUART_H_<br /><br />#define UART_BAUD 7800<br />#define __UBRR ((F_CPU+UART_BAUD*8UL) / (16UL*UART_BAUD)-1)<br /><br /><br />void uart_init( uint16_t _UBRR);<br />void uart_putc( char data );<br />void uart_puts( char * s );<br />void uart_puts_P(const char * s );<br />void uart_putlong( uint32_t liczba, uint8_t radix );<br /><br />#endif[/syntax]<br /><br /><strong>EDIT: Miałeś rację. Zmieniłem na uart_putc i licznik zaczął reagować. Dzięki! <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /></strong><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2482">Miles</a> — 4 sie 2014, o 21:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[atmel]]></name></author>
<updated>2014-08-04T21:19:15+01:00</updated>
<published>2014-08-04T21:19:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8022&amp;p=90230#p90230</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8022&amp;p=90230#p90230"/>
<title type="html"><![CDATA[Re: UART - przepisanie prostego kodu z C++ do C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8022&amp;p=90230#p90230"><![CDATA[
Prędkość transmisji jest poprawna (nietypowa 7800bps)?<br />Nie mam pojęcia za co jest odpowiedzialny pin nr 2 w Arduino w Twoim układzie, ale może brak jego ustawienia jako wyjście stanowi problem...<br />Poza tym nie wiem jak są napisane funckje &quot;uart_putlong&quot;, ale jeśli mają one wyświetlać wartość liczbową to nie jest to zgodne z kodem Arduino, gdyż tam wysyłane są pojedyncze bajty (coś na wzór &quot;uart_putc&quot; powinno być). Jeśli są to pewne dane sterujące w formie komend, to taka różnica ma kolosalne znaczenie, ponieważ powinno być wysłane dokładnie 7 bajtów.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1183">atmel</a> — 4 sie 2014, o 21:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Miles]]></name></author>
<updated>2014-08-04T21:00:41+01:00</updated>
<published>2014-08-04T21:00:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8022&amp;p=90228#p90228</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8022&amp;p=90228#p90228"/>
<title type="html"><![CDATA[UART - przepisanie prostego kodu z C++ do C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8022&amp;p=90228#p90228"><![CDATA[
Witam,<br /><br />Dorwałem wydawać by się mogło bardzo prosty kod składający się tylko z kilkunastu linii, napisany w C++ na Arduino. Chciałem go przepisać do C i stworzyć własny układ. Jednak nie wszystko działa tak jak powinno. Poniżej omawiany kod w C++:<br /><br />[syntax=cpp]int ecm_serial_byte&#91;8&#93;;     // 8 bytes for serial data<br />byte check_sum;             // Check sum of bytes 0 to 6<br /><br />void setup() {<br />  Serial.begin(7800);       // Serial output to gauge Tech line<br />  pinMode(2, OUTPUT);       // For Tach output<br />}<br /><br />void loop() {<br />  <br />  // Dealer Mode (Uncomment to turn on)<br />  // bitSet(ecm_serial_byte&#91;1&#93;,4);<br />  <br />  // Calculate check sum byte  <br />  for(int x = 0; x &lt; 7; x++){<br />    check_sum = check_sum + ecm_serial_byte&#91;x&#93;;<br />  }<br />  <br />  check_sum = 256 - check_sum;<br />  <br />  // Write data bytes to serial<br />  for(int y = 0; y &lt; 7; y++){<br />    Serial.write(ecm_serial_byte&#91;y&#93;);<br />    delay(10);<br />  }<br />  <br />  // Write check sum byte to serial<br />  Serial.write(check_sum);<br />  <br />  // Intermessage delay<br />  delay(60);<br />   <br />    <br />}[/syntax]<br /><br /><br />A oto moje wypociny:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &quot;MYUART/myuart.h&quot;<br /><br />uint8_t ecm_serial_byte&#91;8&#93; = {0, 16, 0, 0, 0, 0, 0};<br />uint8_t check_sum;<br />uint8_t x;<br />uint8_t y;<br /><br />int main(void)<br />{<br />uart_init(__UBRR);<br /><br /><br />while (1)<br />{<br /><br />check_sum = 0;<br /><br />for(x=0; x&lt;7; x++)<br />{<br />check_sum=check_sum+ecm_serial_byte&#91;x&#93;;<br />}<br /><br />check_sum=256-check_sum;<br /><br />for(y=0; y&lt;7; y++)<br />{<br />uart_putlong(ecm_serial_byte&#91;y&#93;, 2);<br />_delay_ms(10);<br />}<br /><br />uart_putlong( check_sum, 2);<br />_delay_ms(60);<br />}<br />}[/syntax]<br /><br />Układ po podłączeniu do licznika prędkości powinien uruchomić w nim tryb &quot;dealer mode&quot;. Tak się jednak nie dzieje. Może mój uproszczony sposób na ustawienie czwartego bitu w pierwszym elemencie tablicy jest błędny? <br /><br />Mój zestaw to Atmega8 taktowana wewnętrznym zegarem z częstotliwością 8 MHz.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2482">Miles</a> — 4 sie 2014, o 21:00</p><hr />
]]></content>
</entry>
</feed>