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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2020-04-18T20:20:57+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=22&amp;t=23035&amp;mode</id>
<entry>
<author><name><![CDATA[Makowka]]></name></author>
<updated>2020-04-18T20:20:57+01:00</updated>
<published>2020-04-18T20:20:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23035&amp;p=226357#p226357</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23035&amp;p=226357#p226357"/>
<title type="html"><![CDATA[Re: VirtualCasino - Nowy system rozrywkowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23035&amp;p=226357#p226357"><![CDATA[
<div class="quotetitle">roberto_k_w napisał(a):</div><div class="quotecontent"><br />Projekt dopieszczony nie tylko od strony sprzętowej, jestem pod wrażeniem czystości kodu i konsekwencji w dążeniu do ideału <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /><br /></div><br /><br />Dzięki Robert! Prawda jest taka, że we wszystkich poprzednich projektach zawsze brakowało mi odpowiedniego podejścia od strony właśnie programistycznej. Dlatego uznałem, po obejrzeniu wielu poradników dotyczących struktur, wskaźników itd., że czas najwyższy napisać porządnie program. Jak wiadomo, projekt służył tutaj głównie celom motywacyjnym.  <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=10748">Makowka</a> — 18 kwi 2020, o 20:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[roberto_k_w]]></name></author>
<updated>2020-04-18T17:05:45+01:00</updated>
<published>2020-04-18T17:05:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23035&amp;p=226354#p226354</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23035&amp;p=226354#p226354"/>
<title type="html"><![CDATA[Re: VirtualCasino - Nowy system rozrywkowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23035&amp;p=226354#p226354"><![CDATA[
Projekt dopieszczony nie tylko od strony sprzętowej, jestem pod wrażeniem czystości kodu i konsekwencji w dążeniu do ideału <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=13729">roberto_k_w</a> — 18 kwi 2020, o 17:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2020-04-17T21:05:56+01:00</updated>
<published>2020-04-17T21:05:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23035&amp;p=226331#p226331</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23035&amp;p=226331#p226331"/>
<title type="html"><![CDATA[Re: VirtualCasino - Nowy system rozrywkowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23035&amp;p=226331#p226331"><![CDATA[
Ja cię nie mogę! ... Panie kochany - ty chyba możesz się zatrudnić w Las Vegas ! <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> w tamtejszych kasynach ... no już dawno TAKIEGO bajeru, tak ładnie dopracowanej konstrukcji nie widziałem !!! <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />GRATULACJE - śliczny projekt - prześliczny !<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 17 kwi 2020, o 21:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Makowka]]></name></author>
<updated>2020-04-17T18:19:05+01:00</updated>
<published>2020-04-17T18:19:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23035&amp;p=226327#p226327</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23035&amp;p=226327#p226327"/>
<title type="html"><![CDATA[VirtualCasino - Nowy system rozrywkowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23035&amp;p=226327#p226327"><![CDATA[
Witam,<br /><br />Kilka lat temu udało mi się stworzyć projekt sprzętowy o nazwie VirtualQuiz (jeżeli ktoś nie miał jeszcze okazji się zapoznać, zachęcam do przeczytania opisu na forum <a href="https://forum.atnel.pl/topic19010.html"  class="postlink">https://forum.atnel.pl/topic19010.html</a> <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> ). Ostatnio, z uwagi na sporą ilość wolnego czasu, postanowiłem raz jeszcze podjąć wyzwanie i stworzyć system do popularnej gry kasynowej Blackjack (Jeżeli nie miałeś jeszcze okazji się z nią zapoznać, zasady na szybko są wyjaśnione tutaj: <a href="https://pl.wikipedia.org/wiki/Blackjack"  class="postlink">https://pl.wikipedia.org/wiki/Blackjack</a>) w wersji numerycznej, ale nie tylko! <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Dlaczego? Otóż uznałem, że najwyższy czas stworzyć projekt utrwalający wiedzę z książek Mirka (w końcu praktyka czyni mistrza) oraz przetestować kilka posiadanych już bibliotek w języku C. Dodatkowo, w mojej szufladzie znajduje się wiele PCB zamówionych na potrzeby innych, przeszłych projektów. Po zdecydowaniu się na jedną z nich, powstały poniższe założenia:<br /><br /><strong>ZAŁOŻENIA:</strong><br /><br />- Serce układu - Atmega88P<br />- User interface oparty na wyświetlaczu dotykowym NEXTION - <span style="color: #4040FF">Przedstawiam przy okazji obsługę takiego wyświetlacza w kodzie źródłowym</span>, być może komuś się przyda  <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />- Komunikacja za pomocą SoftUART pomiędzy MCU a wyświetlaczem (na podstawie biblioteki Mirka),<br />- Komunikacja za pomocą sprzętowego UART pomiędzy MCU a komputerem/aplikacją w trybie manualnym (w trakcie oprogramowywania  <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> ),<br />- Zabudowany system pasków LED WS2812B (wskazujący, na przykład, wynik rozgrywki, lub kolejkę danego gracza)<br /><br /><br /><strong>KOD ŹRÓDŁOWY</strong><br /><br />Aby maksymalnie uprościć kodowanie i przyszłe modyfikacje, większość operacji sprzętowych (np. stan wciśnięcia przycisków) wykonywana jest za pomocą przerwań timerowych, jak i zewnętrznych PCINT. Najważniejsze zmienne <em>opakowałem </em> w struktury, co pozwoliło mi dodatkowo przećwiczyć korzystanie ze wskaźników! Plik main.c, common.c, oraz nagłówkowy common.h załączone są poniżej.<br /><br />main.c<br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: Apr 11, 2020<br /> *      Author: Michal Makowka<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;string.h&gt;<br /><br />#include &quot;MK_USART/mkuart.h&quot;<br />#include &quot;SoftUART/soft_uart.h&quot;<br />#include &quot;WS2812/ws281x.h&quot;<br />#include &quot;common.h&quot;<br /><br /><br /><br />int main (void) {<br /><br />// Soft and hardware USART init<br />suart_init();<br />USART_Init(__UBRR);<br /><br /><br />// Common IO, Timers, PCINT init<br />common_init();<br /><br />// Variable contains mode and settings info<br />GAME game;<br /><br /><br />// Global interrupts enabled<br />sei();<br /><br />// Used initial configuration<br />mode_and_players(&amp;game);<br /><br />// Test diode<br />//DDRB |= (1&lt;&lt;PB0);<br /><br /><br />// Random seed taken from Timer0<br />srand(TCNT0);<br /><br />while(1) {<br /><br />if(game.mode == Blackjack) {<br />BLACKJACK(&amp;game);<br />}<br />if(game.mode == Chess) {<br />CHESS();<br />}<br />if(game.mode == Manual) {<br /><br />}<br />}<br />}[/syntax]<br /><br /><br />common.h<br />[syntax=c]/*<br /> * common.h<br /> *<br /> *  Created on: Apr 13, 2020<br /> *      Author: Michal Makowka<br /> */<br /><br />#ifndef COMMON_H_<br />#define COMMON_H_<br /><br /><br />// DEFINE BUTTONS<br />#define R1_PORT PORTC<br />#define R1_PINPINC<br />#define R1_DIRDDRC<br />#define R1(1&lt;&lt;PC0)<br /><br />#define G1_PORT PORTC<br />#define G1_PINPINC<br />#define G1_DIRDDRC<br />#define G1(1&lt;&lt;PC1)<br /><br />#define R2_PORT PORTC<br />#define R2_PINPINC<br />#define R2_DIRDDRC<br />#define R2(1&lt;&lt;PC2)<br /><br />#define G2_PORT PORTC<br />#define G2_PINPINC<br />#define G2_DIRDDRC<br />#define G2(1&lt;&lt;PC3)<br /><br />#define R3_PORT PORTC<br />#define R3_PINPINC<br />#define R3_DIRDDRC<br />#define R3(1&lt;&lt;PC4)<br /><br />#define G3_PORT PORTC<br />#define G3_PINPINC<br />#define G3_DIRDDRC<br />#define G3(1&lt;&lt;PC5)<br /><br /><br />// DEFINE WS2812B COLOURS<br />#define RED 0x410000<br />#define GREEN 0x004100<br />#define BLUE 0x000041<br />#define YELLOW 0x202000<br />#define WHITE 0x000000<br /><br />#define WIN0x004100<br />#define TIE0x200020<br />#define LOOSE 0x410000<br /><br /><br />extern volatile uint16_t Timer1, Timer2;<br />extern volatile uint8_t key_cnt&#91;6&#93;;// Debouncing flag variables<br /><br />enum {Blackjack, Chess, Manual};<br /><br />typedef struct{<br />uint8_t players;<br />uint8_t mode;<br />}GAME;<br /><br />typedef struct{<br />uint8_tgreen;<br />uint8_t red;<br />uint8_t B_score;<br />uint8_t C_time;<br />}PLAYER;<br /><br />externvolatile PLAYER p1, p2, p3;<br /><br />void common_init(void);<br />void mode_and_players(GAME *tmpgame);<br />uint8_t random_blc_hand(void);<br /><br />void BLACKJACK(GAME *wgame);<br />void CHESS(void);<br /><br />#endif /* COMMON_H_ */[/syntax]<br /><br /><br /><br />common.c<br />[syntax=c]/*<br /> * common.c<br /> *<br /> *  Created on: Apr 13, 2020<br /> *      Author: Michal Makowka<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;string.h&gt;<br /><br /><br />#include &quot;SoftUART/soft_uart.h&quot;<br />#include &quot;MK_USART/mkuart.h&quot;<br />#include &quot;WS2812/ws281x.h&quot;<br />#include &quot;common.h&quot;<br /><br />/**** NEXTION COMMANDS ***<br /> *<br /> * &#91;SELECT MODE&#93;<br /> * &quot;e\x01\x02&quot; - Blackjack<br /> * &quot;e\x01\x03&quot; - Chess Timer<br /> * &quot;e\x01\x04&quot; - Manual (PC)<br /> *<br /> * &#91;SETTINGS&#93;<br /> * &quot;e\x05\x03&quot; - 2 players<br /> * &quot;e\x05\x04&quot; - 3 players<br /> *<br /> * Example: MCU -&gt; NEXTION transmission<br /> * n0.val=(17)\xff\xff\xff<br /> * Where variable is in the brackets<br /> */<br /><br />volatile uint16_t Timer1, Timer2;<br /><br />char sbuf&#91;35&#93;;// Soft UART buffer<br /><br />// Button flags indicating the press state<br />volatile PLAYER p1, p2, p3;<br />// Debounce variable used in PCINT and MAIN.c<br />volatile uint8_t key_cnt&#91;6&#93;;<br />// Chess time storage variables<br />volatile int8_t c_min, c_sec = 0;<br /><br /><br />// WS2812B Init<br />TWSRGB ws_rgb_leds&#91; WS_LED_CNT &#93;;<br />uint8_t * pasek = (uint8_t*) ws_rgb_leds;<br /><br />TWSRGB ws_rgb_leds_left&#91; WS_LED_CNT_LEFT &#93;;<br />uint8_t * pasek_lewy = (uint8_t*) ws_rgb_leds_left;<br /><br />TWSRGB ws_rgb_leds_right&#91; WS_LED_CNT_RIGHT &#93;;<br />uint8_t * pasek_prawy = (uint8_t*) ws_rgb_leds_right;<br /><br /><br />void common_init(void) {<br />// 8-bit Timer0 Init  (100 Hz)<br />TCCR0A = (1&lt;&lt;WGM01);//CTC Mode<br />TCCR0B = (1&lt;&lt;CS00) | (1&lt;&lt;CS02);// Prescaler 1024<br />OCR0A = 107;// Compare register<br />TIMSK0 = (1&lt;&lt;OCIE0A);// Interrupt enabled<br /><br />// PCINT interrupt config<br />PCICR |= (1&lt;&lt;PCIE1);// External interrupts on PORTC enabled<br />PCMSK1 |= (1&lt;&lt;PCINT8) | (1&lt;&lt;PCINT9) | (1&lt;&lt;PCINT10) | (1&lt;&lt;PCINT11) | (1&lt;&lt;PCINT12) | (1&lt;&lt;PCINT13);<br /><br />// Buttons init (-&gt;VCC)<br />R1_PORT |= R1;<br />R2_PORT |= R2;<br />R3_PORT |= R3;<br />G1_PORT |= G1;<br />G2_PORT |= G2;<br />G3_PORT |= G3;<br /><br />// WS2812B Pins init<br />WS_DIR |= WS_PIN | WS_PIN_LEFT | WS_PIN_RIGHT;<br /><br />// Chess mode init<br />c_min = 11;<br />c_sec =0;<br /><br />}<br /><br />uint8_t random_blc_hand(void){<br />return (1 + rand() % 10);<br />}<br /><br /><br />void CHESS(void){<br /><br />if (c_sec &lt; 0) {c_sec = 59; c_min--;}<br />suart_puts(&quot;n0.val=&quot;);<br />suart_putint(c_min);<br />suart_puts(&quot;\xff\xff\xff&quot;);// Display minutes<br />suart_puts(&quot;n1.val=&quot;);<br />suart_putint(c_sec);<br />suart_puts(&quot;\xff\xff\xff&quot;);// Display minutes<br /><br />if (p1.red || p1.green == 1){<br />suart_puts(&quot;t1.txt=\x22Player 2\x22\xff\xff\xff&quot;);<br />p1.red = 0;<br />p1.green = 0;<br />}<br /><br />if (p2.red || p2.green == 1){<br />suart_puts(&quot;t1.txt=\x22Player 1\x22\xff\xff\xff&quot;);<br />p2.red = 0;<br />p2.green = 0;<br />}<br /><br />_delay_ms(20);<br /><br />}<br /><br />void clear_buttons(void){<br />p1.green = 0;<br />p1.red = 0;<br />p2.green = 0;<br />p2.red = 0;<br />p3.green = 0;<br />p3.red = 0;<br />}<br /><br />void BLACKJACK(GAME *wgame){<br />uint8_t p1flag, p2flag, p3flag, dflag;<br />uint8_t Dlr_score;<br /><br />_delay_ms(250);// Set time<br /><br /><br />// Make sure that initially button flags are cleared<br />clear_buttons();<br /><br /><br />// WS2812B Initial color set<br />ws_cls_left(pasek_lewy,YELLOW);// P1 color yellow<br />ws_cls_right(pasek_prawy,BLUE);// P2 color blue<br />ws_cls_left(pasek_lewy,YELLOW);// P1 color yellow<br />ws_cls_right(pasek_prawy,BLUE);// P2 color blue<br />if (wgame-&gt;players == 3){<br />ws_cls(pasek,BLUE);// P3 color blue<br />ws_cls(pasek,BLUE);// P3 color blue<br />}else {ws_cls(pasek,WHITE); ws_cls(pasek,WHITE);}// P3 color white (inactive)<br /><br /><br />for (uint8_t i=0; i&lt;6; i++)<br />{<br />// Init game (BCO, Player hands values)<br />suart_puts(&quot;t1.bco=65504\xff\xff\xff&quot;);// P1 Yellow BCO<br />suart_puts(&quot;t2.bco=65535\xff\xff\xff&quot;);// P2 White BCO<br />suart_puts(&quot;t3.bco=65535\xff\xff\xff&quot;);// P3 White BCO<br /><br />suart_puts(&quot;n1.pco=13729\xff\xff\xff&quot;);// P1 Green PCO<br />suart_puts(&quot;n2.pco=13729\xff\xff\xff&quot;);// P2 Green PCO<br />suart_puts(&quot;n3.pco=13729\xff\xff\xff&quot;);// P3 Green PCO<br /><br />suart_puts(&quot;n4.pco=0\xff\xff\xff&quot;);// Dealer PCO Black<br />}<br /><br />for (uint8_t i=0; i&lt;4; i++){<br />Dlr_score = random_blc_hand();<br />suart_puts(&quot;n4.val=&quot;);<br />suart_putint(Dlr_score);<br />suart_puts(&quot;\xff\xff\xff&quot;);<br /><br />p1.B_score = random_blc_hand();<br />suart_puts(&quot;n1.val=&quot;);<br />suart_putint(p1.B_score);<br />suart_puts(&quot;\xff\xff\xff&quot;);<br /><br />p2.B_score = random_blc_hand();<br />suart_puts(&quot;n2.val=&quot;);<br />suart_putint(p2.B_score);<br />suart_puts(&quot;\xff\xff\xff&quot;);<br />}<br /><br />if (wgame-&gt;players == 3){// If 3 players<br />p3.B_score = random_blc_hand();<br /><br />for (uint8_t i=0; i&lt;4; i++){<br />suart_puts(&quot;n3.val=&quot;);<br />suart_putint(p3.B_score);<br />suart_puts(&quot;\xff\xff\xff&quot;);<br />}<br />}<br /><br />// P1 TURN HANDLING SERVICE<br />for (uint8_t i=0; i&lt;4; i++){<br />suart_puts(&quot;t0.txt=\x22Player 1\x22\xff\xff\xff&quot;);// Print &quot;Player 1&quot; in the focus box<br />suart_puts(&quot;n0.val=&quot;);<br />suart_putint(p1.B_score);<br />suart_puts(&quot;\xff\xff\xff&quot;);// Print P1 score in the focus box<br />}<br /><br />// Make sure that initially button flags are cleared<br />clear_buttons();<br /><br />p1flag = 1;// P1 TURN<br />while(p1flag){<br />if (p1.red == 1){// If STAY decision made<br />for (uint8_t i=0; i&lt;6; i++){<br />suart_puts(&quot;t1.bco=65535\xff\xff\xff&quot;);// P1 White BCO<br />}<br />p1.red = 0;// Cancell button flag<br />ws_cls_left(pasek_lewy,BLUE);// P1 color blue<br />ws_cls_left(pasek_lewy,BLUE);// P1 color blue<br />p1flag = 0;// End of turn<br />}<br />if (p1.green == 1){// If HIT decision made<br />p1.B_score = (p1.B_score + random_blc_hand());<br />for (uint8_t i=0; i&lt;4; i++){<br />suart_puts(&quot;n0.val=&quot;);<br />suart_putint(p1.B_score);<br />suart_puts(&quot;\xff\xff\xff&quot;);<br />suart_puts(&quot;n1.val=&quot;);<br />suart_putint(p1.B_score);<br />suart_puts(&quot;\xff\xff\xff&quot;);// Print score after HIT on P1 and focus box<br />}<br />p1.green = 0;// Cancell button flag<br />if (p1.B_score == 21){// If Blackjack obtained<br />for (uint8_t i=0; i&lt;6; i++){<br />suart_puts(&quot;t1.bco=2016\xff\xff\xff&quot;);// P1 Green BCO<br />}<br />ws_cls_left(pasek_lewy,GREEN);// P1 color green<br />ws_cls_left(pasek_lewy,GREEN);// P1 color green<br />p1flag = 0;// End of turn<br />_delay_ms(1000);<br />}<br />}<br />if (p1.B_score &gt; 21){// Check if 21 exceeded<br />for (uint8_t i=0; i&lt;6; i++){<br />suart_puts(&quot;t1.bco=63488\xff\xff\xff&quot;);// P1 Red BCO<br />suart_puts(&quot;n1.pco=63488\xff\xff\xff&quot;);// P1 Red PCO<br />}<br />ws_cls_left(pasek_lewy,RED);// P1 color red<br />ws_cls_left(pasek_lewy,RED);// P1 color red<br />p1flag = 0;// End of turn<br />_delay_ms(1000);// Wait before moving to the next player<br />}<br />}<br />// Change WS2812B color set<br />ws_cls_right(pasek_prawy,YELLOW);// P2 color yellow<br />ws_cls_right(pasek_prawy,YELLOW);// P2 color yellow<br /><br />// Make sure that initially button flags are cleared<br />clear_buttons();<br /><br />// P2 TURN HANDLING SERVICE<br />for (uint8_t i=0; i&lt;4; i++){<br />suart_puts(&quot;t2.bco=65504\xff\xff\xff&quot;);// P2 Yellow BCO<br /><br />suart_puts(&quot;t0.txt=\x22Player 2\x22\xff\xff\xff&quot;);// Print &quot;Player 2&quot; in the focus box<br />suart_puts(&quot;n0.val=&quot;);<br />suart_putint(p2.B_score);<br />suart_puts(&quot;\xff\xff\xff&quot;);// Print P2 score in the focus box<br />}<br /><br /><br />p2flag = 1;// P2 TURN<br />while(p2flag){<br />if (p2.red == 1){// If STAY decision made<br />for (uint8_t i=0; i&lt;6; i++){<br />suart_puts(&quot;t2.bco=65535\xff\xff\xff&quot;);// P2 White BCO<br />}<br />p2.red = 0;// Cancell button flag<br />ws_cls_right(pasek_prawy,BLUE);// P2 color blue<br />ws_cls_right(pasek_prawy,BLUE);// P2 color blue<br />p2flag = 0;// End of turn<br />}<br />if (p2.green == 1){// If HIT decision made<br />p2.B_score = (p2.B_score + random_blc_hand());<br />for (uint8_t i=0; i&lt;6; i++){<br />suart_puts(&quot;n0.val=&quot;);<br />suart_putint(p2.B_score);<br />suart_puts(&quot;\xff\xff\xff&quot;);<br />suart_puts(&quot;n2.val=&quot;);<br />suart_putint(p2.B_score);<br />suart_puts(&quot;\xff\xff\xff&quot;);// Print score after HIT on P2 and focus box<br />}<br />p2.green = 0;// Cancell button flag<br />if (p2.B_score == 21){// If Blackjack obtained<br />for (uint8_t i=0; i&lt;6; i++){<br />suart_puts(&quot;t2.bco=2016\xff\xff\xff&quot;);// P2 Green BCO<br />}<br />ws_cls_right(pasek_prawy,GREEN);// P2 color green<br />ws_cls_right(pasek_prawy,GREEN);// P2 color green<br />p2flag = 0;// End of turn<br />_delay_ms(1000);<br />}<br />}<br />if (p2.B_score &gt; 21){// Check if 21 exceeded<br />for (uint8_t i=0; i&lt;6; i++){<br />suart_puts(&quot;t2.bco=63488\xff\xff\xff&quot;);// P2 Red BCO<br />suart_puts(&quot;n2.pco=63488\xff\xff\xff&quot;);// P2 Red PCO<br />}<br />ws_cls_right(pasek_prawy,RED);// P2 color red<br />ws_cls_right(pasek_prawy,RED);// P2 color red<br />p2flag = 0;// End of turn<br />_delay_ms(1000);// Wait before moving to the next player<br />}<br />}<br /><br />// Make sure that initially button flags are cleared<br />clear_buttons();<br /><br /><br />// P3 TURN HANDLING SERVICE (If 3 players selected beforehand)<br />if (wgame-&gt;players == 3){<br />ws_cls(pasek,YELLOW);// P3 color yellow<br />ws_cls(pasek,YELLOW);// P3 color yellow<br /><br />for (uint8_t i=0; i&lt;6; i++){<br />suart_puts(&quot;t3.bco=65504\xff\xff\xff&quot;);// P3 Yellow BCO<br /><br />suart_puts(&quot;t0.txt=\x22Player 3\x22\xff\xff\xff&quot;);// Print &quot;Player 3&quot; in the focus box<br />suart_puts(&quot;n0.val=&quot;);<br />suart_putint(p3.B_score);<br />suart_puts(&quot;\xff\xff\xff&quot;);// Print P3 score in the focus box<br />}<br />p3flag = 1;// P3 TURN<br /><br /><br />while(p3flag){<br />if (p3.red == 1){// If STAY decision made<br />for (uint8_t i=0; i&lt;6; i++){<br />suart_puts(&quot;t3.bco=65535\xff\xff\xff&quot;);// P3 White BCO<br />}<br />ws_cls(pasek,BLUE);// P3 color blue<br />ws_cls(pasek,BLUE);// P3 color blue<br />p3.red = 0;// Cancell button flag<br />p3flag = 0;// End of turn<br />}<br />if (p3.green == 1){// If HIT decision made<br />p3.B_score = (p3.B_score + random_blc_hand());<br />for (uint8_t i=0; i&lt;4; i++){<br />suart_puts(&quot;n0.val=&quot;);<br />suart_putint(p3.B_score);<br />suart_puts(&quot;\xff\xff\xff&quot;);<br />suart_puts(&quot;n3.val=&quot;);<br />suart_putint(p3.B_score);<br />suart_puts(&quot;\xff\xff\xff&quot;);// Print score after HIT on P3 and focus box<br />}<br />p3.green = 0;// Cancell button flag<br />if (p3.B_score == 21){// If Blackjack obtained<br />for (uint8_t i=0; i&lt;6; i++){<br />suart_puts(&quot;t3.bco=2016\xff\xff\xff&quot;);// P3 Green BCO<br />}<br />ws_cls(pasek,GREEN);// P3 color green<br />ws_cls(pasek,GREEN);// P3 color green<br />p3flag = 0;// End of turn<br />_delay_ms(1000);<br />}<br />}<br />if (p3.B_score &gt; 21){// Check if 21 exceeded<br />for (uint8_t i=0; i&lt;6; i++){<br />suart_puts(&quot;t3.bco=63488\xff\xff\xff&quot;);// P3 Red BCO<br />suart_puts(&quot;n3.pco=63488\xff\xff\xff&quot;);// P3 Red PCO<br />}<br />ws_cls(pasek,RED);// P3 color red<br />ws_cls(pasek,RED);// P3 color red<br />p3flag = 0;// End of turn<br />_delay_ms(1000);// Wait before moving to the next player<br />}<br />}<br /><br /><br />}<br /><br />ws_cls_left(pasek_lewy,BLUE);// P1 color blue<br />ws_cls_right(pasek_prawy,BLUE);// P2 color blue<br />ws_cls_left(pasek_lewy,BLUE);// P1 color blue<br />ws_cls_right(pasek_prawy,BLUE);// P2 color blue<br />if (wgame-&gt;players == 3){<br />ws_cls(pasek,BLUE);// P3 color blue<br />ws_cls(pasek,BLUE);// P3 color blue<br />} else {ws_cls(pasek,WHITE); ws_cls(pasek,WHITE);}// P3 color white<br /><br />// Dealer service<br />dflag = 1;<br />while(dflag){<br /><br />Dlr_score = (Dlr_score + random_blc_hand());<br />for (uint8_t i=0; i&lt;4; i++){<br />suart_puts(&quot;n4.val=&quot;);<br />suart_putint(Dlr_score);<br />suart_puts(&quot;\xff\xff\xff&quot;);<br />}<br /><br />if (Dlr_score &gt;= 17){<br />if (Dlr_score &gt; 21){<br />for (uint8_t i=0; i&lt;4; i++){<br />suart_puts(&quot;n4.pco=63488\xff\xff\xff&quot;);<br />}<br />}<br />dflag = 0; // End of dealer's turn<br />}<br />_delay_ms(1000);<br />}<br /><br />// Make sure that initially button flags are cleared<br />clear_buttons();<br /><br />// Match results to the strip color<br />if (p1.B_score &lt; Dlr_score || p1.B_score &gt; 21){ ws_cls_left(pasek_lewy,LOOSE); ws_cls_left(pasek_lewy,LOOSE); }<br />if ((p1.B_score &gt; Dlr_score &amp;&amp; p1.B_score &lt;= 21) || (Dlr_score &gt; 21 &amp;&amp; p1.B_score &lt;= 21)){ws_cls_left(pasek_lewy,WIN); ws_cls_left(pasek_lewy,WIN);}<br />if (p1.B_score == Dlr_score &amp;&amp; p1.B_score &lt;= 21){ ws_cls_left(pasek_lewy,TIE); ws_cls_left(pasek_lewy,TIE);}<br /><br /><br />if (p2.B_score &lt; Dlr_score || p2.B_score &gt; 21){ ws_cls_right(pasek_prawy,LOOSE); ws_cls_right(pasek_prawy,LOOSE);}<br />if ((p2.B_score &gt; Dlr_score &amp;&amp; p2.B_score &lt;= 21) || (Dlr_score &gt; 21 &amp;&amp; p2.B_score &lt;= 21)){ ws_cls_right(pasek_prawy,WIN); ws_cls_right(pasek_prawy,WIN);}<br />if (p2.B_score == Dlr_score &amp;&amp; p2.B_score &lt;= 21){ ws_cls_right(pasek_prawy,TIE); ws_cls_right(pasek_prawy,TIE);}<br /><br /><br />if (wgame-&gt;players == 3){<br />if (p3.B_score &lt; Dlr_score || p3.B_score &gt; 21){ ws_cls(pasek,LOOSE); ws_cls(pasek,LOOSE);}<br />if ((p3.B_score &gt; Dlr_score &amp;&amp; p3.B_score &lt;= 21) || (Dlr_score &gt; 21 &amp;&amp; p3.B_score &lt;= 21)) {ws_cls(pasek,WIN); ws_cls(pasek,WIN);}<br />if (p3.B_score == Dlr_score &amp;&amp; p3.B_score &lt;= 21){ ws_cls(pasek,TIE); ws_cls(pasek,TIE);}<br />}<br /><br /><br /><br />while (1){<br />if (p1.red==1) { p1.red = 0; break;}// Press R1 to restet<br />}<br /><br />// Reset score variables<br />Dlr_score = 0;<br />p1.B_score = 0;<br />p2.B_score = 0;<br />p3.B_score = 0;<br /><br />}<br /><br /><br /><br /><br />void mode_and_players(GAME *tmpgame) {<br /><br />// Default number of players (if not overwritten)<br />tmpgame-&gt;players = 2;<br /><br />while(1){<br />// Wait for Nextion data<br />suart_gets(sbuf,sizeof(sbuf));<br /><br />// If 3 players button pressed<br />if (!strcmp(sbuf,&quot;e\x05\x04&quot;))tmpgame-&gt;players = 3;<br /><br />// If 2 players button pressed<br />if (!strcmp(sbuf,&quot;e\x05\x03&quot;))tmpgame-&gt;players = 2;<br /><br />// If BLACKJACK mode<br />if (!strcmp(sbuf,&quot;e\x01\x02&quot;)){<br />tmpgame-&gt;mode = Blackjack;<br />break;<br />}<br />// If CHESS mode<br />if (!strcmp(sbuf,&quot;e\x01\x03&quot;)){<br />tmpgame-&gt;mode = Chess;<br />break;<br />}<br />// If MANUAL mode<br />if (!strcmp(sbuf,&quot;e\x01\x04&quot;)){<br />tmpgame-&gt;mode = Manual;<br />break;<br />}<br />}<br /><br />}<br /><br />//********** INNTERRUPTS SECTION **********<br /><br />// Main auxiliary Timer interrupt<br />ISR(TIMER0_COMPA_vect){<br /><br />uint16_t x;<br />x = Timer1;<br />if (x) Timer1 = --x;<br />x = Timer2;<br />if (x) Timer2 = --x;<br /><br />// Auxiliary key flags (button debounce)<br />if (!Timer1){<br />for (uint8_t i=0; i&lt;6; i++){<br />if (key_cnt&#91;i&#93;)key_cnt&#91;i&#93;--;<br />}<br />Timer1 = 5;<br />}<br /><br />// Chess clock timer<br />if (!Timer2){<br />c_sec--;<br />//PORTB ^= (1&lt;&lt;PB0);// Test diode blink<br />Timer2 = 106;<br />}<br />}<br /><br />// External interrupt checkig each button state<br />ISR(PCINT1_vect){<br />// Set button flag<br />if (!(R1_PIN &amp; R1) &amp; !key_cnt&#91;0&#93;) {<br />key_cnt&#91;0&#93; = 10;<br />p1.red=1;<br />}<br />if (!(R2_PIN &amp; R2) &amp; !key_cnt&#91;1&#93;) {<br />key_cnt&#91;1&#93; = 10;<br />p2.red=1;<br />}<br />if (!(R3_PIN &amp; R3) &amp; !key_cnt&#91;2&#93;) {<br />key_cnt&#91;2&#93; = 10;<br />p3.red=1;<br />}<br />if (!(G1_PIN &amp; G1) &amp; !key_cnt&#91;3&#93;) {<br />key_cnt&#91;3&#93; = 10;<br />p1.green=1;<br />}<br />if (!(G2_PIN &amp; G2) &amp; !key_cnt&#91;4&#93;) {<br />key_cnt&#91;4&#93; = 10;<br />p2.green=1;<br />}<br />if (!(G3_PIN &amp; G3) &amp; !key_cnt&#91;5&#93;) {<br />key_cnt&#91;5&#93; = 10;<br />p3.green=1;<br />}<br />}[/syntax]<br /><br /><strong>KILKA WAŻNYCH ASPEKTÓW:</strong><br /><br />Chciałbym zwrócić uwagę na kilka szczegółów, które być może przydadzą się również w waszych projektach. <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />  Po pierwsze, w jaki sposób uporałem się z pseudolosowością funkcji <span style="color: #BF40BF">rand()</span>. Jeżeli wczytaliście się wcześniej w opis jej działania, lub też testowaliście ją na żywo na pewno zwróciliście uwagę na fakt, iż pierwsze wartości przez nią zwracane zawsze będą takie same (w niniejszym projekcie takie działanie byłoby niedopuszczalne). Aby to zmienić należy raz, na początku programu, zainicjować zmienną &quot;seed&quot; (ziarno) daną wartością w trakcie inicjalizacji, tak aby za każdym razem ciąg pseudolosowy był inny. W programowaniu na komputery klasy PC możnaby spokojnie zrobić to poprzez przekazanie czasu systemowego jako argument funkcji <span style="color: #BF40BF">srand()</span>. Niemniej, tu takiej możliwości nie było. Rozwiązaniem tego problemu było proste podstawienie wartości rejestru timera <span style="color: #0040FF">TCNT0 </span>(wers 45. pliku main.c). W ten sposób, napisana przeze mnie funkcja <em>random_blc_hand()</em> zawsze zwraca losową zmienną o wartości od 1 do 10. Nie jest to na pewno najlepszy sposób, jednak empirycznie mogę potwierdzić, że jak na razie nie udało mi się zaobserwować takich samych ciągów liczb, a to dobry znak!  <img src="https://forum.atnel.pl/images/smilies/icon_mrgreen.gif" alt=":mrgreen:" title="Pan Zielony" /> <br /><br />Zmienne p1,p2 oraz p3 specjalnie nie są zdefiniowane w pliku głównym, gdyż wykorzystywane są one w przerwaniu, którego funkcje znajdują się w common.c. Oczywiście, mógłbym przekopiować je do main.c a następnie przekazywać je za pomocą wskaźników (jak ma to miejsce ze zmienną typu GAME). Przyznam szczerze, nie wiem na ile aktualne podejście jest poprawne. W każdym razie u mnie działa bez problemu.  <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> Gdy program bardziej się skomplikuje najpewniej rozważę zmianę.<br /><br />Warto wspomnieć w jaki sposób komunukuję się z wyświetlaczem NEXTION. Każda ramka danych wysyłana do niego zakończona musi być trzema bitami [<span style="color: #0000FF">0xff</span>]. Natomiast w przypadku odbioru danych, wysyła on następującą ramkę danych:<br /><br />[<span style="color: #0000FF">0x65</span>] (początek ramki) [<span style="color: #0000FF">0x01</span>]  (numer strony) [<span style="color: #0000FF">0x02</span>] (numer elementu)  (...) [<span style="color: #0000FF">0xff</span>][<span style="color: #0000FF">0xff</span>][<span style="color: #0000FF">0xff</span>] (koniec ramki)<br /><br />Drgania styków! Aby się z nimi uporać przerobiłem lekko mechanizm przedstawiony na blogu, tak aby można było korzystać z niej w przerwaniu Timera.<br /><br />Dodam na koniec tylko, że wsad można podmienić wstrzykując nowy za pomocą RS232 poprzez bootloader (wyprowadzenie USB drukarkowego widać na krawędzi obudowy).<br /><br /><strong>PREZENTACJA:</strong><br />Z opisu to by chyba było na tyle. <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />  Zapraszam Was do obejrzenia filmu z prezentacją oraz zapoznania się ze zdjęciami.<br /><br /><br /><a href="https://obrazkiforum.atnel.pl/10748/0a8e2f4f32c7a72af5c7512b65f7c27a.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/10748/0a8e2f4f32c7a72af5c7512b65f7c27a.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/10748/022d7b3675b4d308f9e7af9c6091e839.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/10748/022d7b3675b4d308f9e7af9c6091e839.jpg" alt="Obrazek" /></a><br /><br /><a href="https://obrazkiforum.atnel.pl/10748/4ba9223848669910a88df343081539db.JPG"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/10748/4ba9223848669910a88df343081539db.JPG" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/10748/971923e44527b2b4a71037cba76e76b7.JPG"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/10748/971923e44527b2b4a71037cba76e76b7.JPG" alt="Obrazek" /></a><br /><br /><br /><br /><div style="width: 583px; height: 471px; margin: 0 auto; padding-left: 26px; padding-top: 48px; background: url('https://www.atnel.pl/download/atnel_tv.png') no-repeat;"> <strong>iframe</strong> </div><br /><br />Pozdrawiam <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=10748">Makowka</a> — 17 kwi 2020, o 18:19</p><hr />
]]></content>
</entry>
</feed>