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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-01-11T18:56:41+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=58&amp;t=14141&amp;mode</id>
<entry>
<author><name><![CDATA[oowan]]></name></author>
<updated>2016-01-11T18:56:41+01:00</updated>
<published>2016-01-11T18:56:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14141&amp;p=150277#p150277</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14141&amp;p=150277#p150277"/>
<title type="html"><![CDATA[Re: Problem z podciąganiem pinu PD2 do Vcc]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14141&amp;p=150277#p150277"><![CDATA[
Po pierwsze, przepraszam za niepoprawnie wstawione listingi - o pierwszej w nocy szare komórki nie działają już tak, jak powinny  <img src="https://forum.atnel.pl/images/smilies/icon_e_surprised.gif" alt=":o" title="Zdziwiony" /> <br /><div class="quotetitle">janusz17 napisał(a):</div><div class="quotecontent"><br />Moim zdaniem trzeba by tu dodać wpisywanie jedynki na bicie INT0_PIN<br /></div><br />Dziękuję <strong>janusz17</strong>, zaproponowany przez Ciebie sposób rozwiązał problem <img src="https://forum.atnel.pl/images/smilies/icon_exclaim.gif" alt=":!:" title="Wykrzyknik" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9741">oowan</a> — 11 sty 2016, o 18:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[janusz17]]></name></author>
<updated>2016-01-10T09:50:11+01:00</updated>
<published>2016-01-10T09:50:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14141&amp;p=150142#p150142</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14141&amp;p=150142#p150142"/>
<title type="html"><![CDATA[Re: Problem z podciąganiem pinu PD2 do Vcc]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14141&amp;p=150142#p150142"><![CDATA[
Kasowanie podciągania pinu PD2 robisz sobie w tym miejscu:<br />[syntax=c]if(licznik==4)         LED_DATA = pgm_read_byte( &amp;cyfry&#91;cyf1&#93; );    // gdy zapalony wyśw.1 podaj wartość zmiennej cyf1 <br />else if(licznik==8) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cyf2&#93; );    // gdy zapalony wyśw.2 podaj wartość zmiennej cyf2 <br />else if(licznik==16) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cyf3&#93; );    // gdy zapalony wyśw.3 podaj wartość zmiennej cyf3 <br />else if(licznik==32) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cyf4&#93; );    // gdy zapalony wyśw.4 podaj wartość zmiennej cyf4[/syntax]<br /><br />Moim zdaniem trzeba by tu dodać wpisywanie jedynki na bicie INT0_PIN:<br />[syntax=c]if(licznik==4)         LED_DATA = pgm_read_byte( &amp;cyfry&#91;cyf1&#93; ) | INT0_PIN;    // gdy zapalony wyśw.1 podaj wartość zmiennej cyf1 <br />else if(licznik==8) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cyf2&#93; ) | INT0_PIN;    // gdy zapalony wyśw.2 podaj wartość zmiennej cyf2 <br />else if(licznik==16) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cyf3&#93; ) | INT0_PIN;    // gdy zapalony wyśw.3 podaj wartość zmiennej cyf3 <br />else if(licznik==32) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cyf4&#93; ) | INT0_PIN;    // gdy zapalony wyśw.4 podaj wartość zmiennej cyf4[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1226">janusz17</a> — 10 sty 2016, o 09:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[oowan]]></name></author>
<updated>2016-01-11T18:37:47+01:00</updated>
<published>2016-01-10T00:54:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14141&amp;p=150129#p150129</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14141&amp;p=150129#p150129"/>
<title type="html"><![CDATA[Problem z podciąganiem pinu PD2 do Vcc]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14141&amp;p=150129#p150129"><![CDATA[
Witam!<br />Buduję zegar z wyświetlaczami LED. Są to pierwsze, nieśmiałe próby praktycznego zastosowana tego co się nauczyłem.<br /><br /><a href="https://obrazkiforum.atnel.pl/9741/9848a1bc729202c48b612f42ca05be28.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/9741/9848a1bc729202c48b612f42ca05be28.jpg" alt="Obrazek" /></a> <a href="https://obrazkiforum.atnel.pl/9741/e9a6d7435ecaf13f6758cd1d4486221a.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/9741/e9a6d7435ecaf13f6758cd1d4486221a.jpg" alt="Obrazek" /></a><br /><br />Procesor Atmega8 taktuje wewnętrzny oscylator 8 MHz.<br />Czas pobierany jest z PCF8583 - książkowy przykład z BB.<br />Poniżej kod:<br /><br /><span style="color: #FF0000">[ panie szanowny kolego - proszę jak najszybciej poprawić wstawiony kod na forum - przecież masz DOKŁADNĄ instrukcję <!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic7402.html" >topic7402.html</a><!-- l --> - mirekk36 ]</span><br /><br />[syntax=c]/*<br /> * main.c<br />  */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br /><br />#include &quot;disp_led.h&quot;// dołączenie pliku nagłówkowego z obsługą LED<br />#include &quot;I2C_TWI/i2c_twi.h&quot;<br /><br />// UWAGA - wybierz adres jak niżej **<br />#define PCF8583_ADDR 0xA0// gdy A0 --&gt; GND<br />// #define PCF8583_ADDR 0xA2// gdy A0 --&gt; VCC<br /><br />//** konfiguracja migania kropki sekundnika<br />#define INT0_PIN (1&lt;&lt;PD2)// wejście przerwania PD2<br />#define PIN_KROPKI (1&lt;&lt;PB1)// wyjście kropki sekundnika<br />#define LED_MIG PORTB ^= PIN_KROPKI// zmiana stanu kropki (segment DP)<br /><br />// konwersja liczby dziesiętnej na BCD<br />uint8_t dec2bcd(uint8_t dec);<br /><br />// konwersja liczby BCD na cyfrę jednostek dla wyśw. LED<br />uint8_t bcd2cyf1(uint8_t bcd);<br /><br />// konwersja liczby BCD na cyfrę dziesiątek dla wyśw. LED<br />uint8_t bcd2cyf10(uint8_t bcd);<br /><br />// flaga zmieniana w przerwaniu INT0<br />volatile uint8_t int0_flag;<br /><br />// zmienne przechowujące wartości czasu odczytane z RTC<br />volatile uint8_t sek_jedn;// jednostki sekund<br />volatile uint8_t sek_dzies;// dziesiątki sekund<br />volatile uint8_t min_jedn;// jednostki minut<br />volatile uint8_t min_dzies;// dziesiątki minut<br />volatile uint8_t godz_jedn;// jednostki godzin<br />volatile uint8_t godz_dzies;// dziesiątki godzin<br /><br />// definicja typu wyliczeniowego jako<br />// wskazania na indeksy w tablicy (buforze)<br />enum {ss, mm, hh};<br />uint8_t bufor&#91;3&#93;;// rezerwacja bufora na 3 bajty<br /><br />int main(void) {<br /><br />// Inicjalizacja wyświetlacza LED<br />disp_led_init ();<br /><br />sei();// włączenie globalnego zezwolenia na przerwania<br /><br /><br />// Przerwanie INT0<br />MCUCR |= (1&lt;&lt;ISC01);// wyzwalanie zboczem opadającym<br />GICR |= (1&lt;&lt;INT0);// odblokowanie przerwania<br />DDRD &amp;= ~INT0_PIN;// port PD2 jako wejście (INT0)<br />PORTD |= INT0_PIN;// podciąganie pinu INT0 do VCC<br /><br />// port PB1 jako wyjście<br />DDRB |= PIN_KROPKI;<br /><br /><br />// Ustawienie linii I2C<br />PORTC |= (1&lt;&lt;PC4) | (1&lt;&lt;PC5);// podciąganie pinu PC4 i PC5 do VCC<br /><br />// predkość na magistrali I2C - 100 kHz<br />i2cSetBitrate( 100 );<br /><br />// Ustawianie czasu na godzinę: 20:33:12<br />/*<br />//bufor&#91;0&#93; = 0;// setne częci sekundy<br />bufor&#91;0&#93; = dec2bcd(10);// sekundy<br />bufor&#91;1&#93; = dec2bcd(2);// minuty<br />bufor&#91;2&#93; = dec2bcd(19);// godziny<br />// zapis 4 bajtów z bufora pod adres 0x01 w pamięci RAM naszego RTC<br />TWI_write_buf( PCF8583_ADDR, 0x02, 3, bufor );<br />*/<br /><br />while(1) {<br /><br />if ( int0_flag ) {<br /><br />LED_MIG;// zmień stan kropki na przeciwny<br /><br />//odczyt 3 bajtów do bufora od adresu 0x02 z pamięci RAM układu RTC<br />TWI_read_buf( PCF8583_ADDR, 0x02, 3, bufor );<br /><br />sek_jedn = bcd2cyf1( bufor&#91;ss&#93; );<br />sek_dzies = bcd2cyf10( bufor&#91;ss&#93; );<br />min_jedn = bcd2cyf1( bufor&#91;mm&#93; );<br />min_dzies = bcd2cyf10( bufor&#91;mm&#93; );<br />godz_jedn = bcd2cyf1( bufor&#91;hh&#93; );<br />godz_dzies = bcd2cyf10( bufor&#91;hh&#93; );<br /><br />// Przekazywanie obliczonych wyżej wartości na poszczególne cyfry wyświetlacza.<br />if (godz_dzies == 0) cyf1 = 10; // Gdy wartość cyf1=0, to<br />else cyf1 = godz_dzies;// wyświetlacz jest wygaszony.<br />cyf2 = godz_jedn;<br />cyf3 = min_dzies;<br />cyf4 = min_jedn;<br /><br />int0_flag = 0;<br /><br />}<br /><br />}<br /><br /><br />}<br /><br /><br />// procedura obsługi przerwania INT0<br />ISR( INT0_vect ) {<br />int0_flag = 1;<br />}<br /><br /><br />// konwersja liczby dziesiętnej na BCD (dla ustawiania zegara)<br />uint8_t dec2bcd(uint8_t dec) {<br />return ((dec / 10)&lt;&lt;4) | (dec % 10);<br />}<br /><br />// konwersja liczby BCD na cyfrę jednostek dla wyśw. LED<br />uint8_t bcd2cyf1(uint8_t bcd) {<br />    return ((bcd) &amp; 0x0F);<br />}<br /><br />// konwersja liczby BCD na cyfrę dziesiątek dla wyśw. LED<br />uint8_t bcd2cyf10(uint8_t bcd) {<br />    return (((bcd) &gt;&gt; 4) &amp; 0x0F);<br />}[/syntax]<br /><br />[syntax=c]/*<br /> * disp_led.h<br /> */<br /><br />#ifndef _disp_led_h// dyrektywy zabezpieczające przed wielokrotnym dołączaniem<br />#define _disp_led_h// tego samego pliku nagłówkowego jeśli będzie dołączany<br />// w wielu rónych plikach programu<br /><br />// definicje portów i pinów wyświetlacza jako stałe preprocesora<br />#define LED_DATA PORTD // port segmentów<br />#defineLED_DATA_DIR DDRD // port jako wyjście dla &quot;katod&quot; wyświetlaczy<br />#define ANODY_PORT PORTB // port anod - PB2, PB3, PB4, PB5<br />#define ANODY_DIR DDRB // port jako wyjście dla anod wyświetlaczy<br /><br /><br />#define A1 (1&lt;&lt;PB2)// A1 oznacza bit nr.0 portu D<br />#define A2 (1&lt;&lt;PB3)// A2 oznacza bit nr.1 portu D<br />#define A3 (1&lt;&lt;PB4)// A3 oznacza bit nr.4 portu D<br />#define A4 (1&lt;&lt;PB5)// A4 oznacza bit nr.5 portu D<br /><br />#define MASKA_ANODY (A1|A2|A3|A4)<br /><br />// definicje bitów dla segmentów LED. Pin PD2 jest pominięty,<br />// bo jest wejściem przerwania INT0 1Hz.<br />#define SEG_A (1&lt;&lt;0)<br />#define SEG_B (1&lt;&lt;1)<br />#define SEG_C (1&lt;&lt;3)<br />#define SEG_D (1&lt;&lt;4)<br />#define SEG_E (1&lt;&lt;5)<br />#define SEG_F (1&lt;&lt;6)<br />#define SEG_G (1&lt;&lt;7)<br />// #define SEG_DP (1&lt;&lt;7)// w zegarze DP jest sterowany z portu PB1,<br /><br /><br />// Deklaracje zmiennych globalnych przechowujących wartości<br />// poszczególnych cyfr wyświetlacza<br />extern volatile uint8_t cyf1;<br />extern volatile uint8_t cyf2;<br />extern volatile uint8_t cyf3;<br />extern volatile uint8_t cyf4;<br /><br /><br /><br />void disp_led_init(void);<br /><br />#endif// koniec _disp_led_h[/syntax]<br /><br />[syntax=c]/*<br /> * disp_led.c<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;// dołączenie pliku nagłówkowego potrzebnego do odczytu<br />// danych zawartych w pamięci programu FLASH<br /><br />#include &quot;disp_led.h&quot;// dołączenie naszego pliku nagłówkowego<br /><br />// definicje zmiennych globalnych przechowujących cyfry do wyświetlania (zmienne ulotne)<br />volatile uint8_t cyf1;<br />volatile uint8_t cyf2;<br />volatile uint8_t cyf3;<br />volatile uint8_t cyf4;<br /><br /><br />// definicja tablicy zawierającej definicje bitowe cyfr LED<br />// katody sterowane przez tranzystory w scalaku MCT1413 (ULN...)<br />// Przy sterowaniu katod bezpośrednio, wyjścia trzeba zanegować &#91;np. ~(SEG_B|SEG_C),// 1 &#93;<br />const uint8_t cyfry&#91;15&#93; PROGMEM = {<br />(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F),// 0<br />(SEG_B|SEG_C),// 1<br />(SEG_A|SEG_B|SEG_D|SEG_E|SEG_G),// 2<br />(SEG_A|SEG_B|SEG_C|SEG_D|SEG_G),// 3<br />(SEG_B|SEG_C|SEG_F|SEG_G),// 4<br />(SEG_A|SEG_C|SEG_D|SEG_F|SEG_G),// 5<br />(SEG_A|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),// 6<br />(SEG_A|SEG_B|SEG_C),// 7 |SEG_F<br />(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),// 8<br />(SEG_A|SEG_B|SEG_C|SEG_D|SEG_F|SEG_G),// 9<br />0x00 // NIC (wygaszenie cyfry)<br />};<br /><br /><br /><br />// definicja funkcji inicjalizującej pracę z wyświetlaczem multipleksowanym<br />void disp_led_init(void)<br />{<br />LED_DATA_DIR = 0b11111011;// wszystkie piny portu D (oprócz PD2) jako WYJŚCIA(katody)<br />//LED_DATA = 0xFF;// wygaszenie wszystkich katod - stan wysoki (może zanegować?)<br />ANODY_DIR |= A1 | A2 | A3 | A4;// 4 piny portu B jako WYJŚCIA (anody wyświetlaczy)<br />//ANODY_PORT |= A1 | A2 | A3 | A4;// wygaszenie wszystkich wyświetlaczy - anody<br /><br /><br />// Inicjalizacja Timera2<br />TCCR2 |= (1&lt;&lt;WGM21); // tryb CTC<br />TCCR2 |= (1&lt;&lt;CS22)|(1&lt;&lt;CS21); // prescaler = 256<br />OCR2 = 155; // liczba do porównania z licznikiem CTC (rej. przepełnienia)<br />TIMSK |= (1&lt;&lt;OCIE2); // zezwolenie na przerwanie CompareMatch<br /><br />}<br /><br /><br />// PROCEDURA OBSŁUGI PRZERWANIA COMPARE MATCH<br />ISR(TIMER2_COMP_vect)<br />{<br />static uint8_t licznik=4;// zmienna do przełączania kolejno anod wyrwietlacza<br /><br />ANODY_PORT = (ANODY_PORT | MASKA_ANODY);// wygaszenie wszystkich wyświetlaczy<br /><br />if(licznik==4) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cyf1&#93; );// gdy zapalony wyśw.1 podaj wartość zmiennej cyf1<br />else if(licznik==8) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cyf2&#93; );// gdy zapalony wyśw.2 podaj wartość zmiennej cyf2<br />else if(licznik==16) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cyf3&#93; );// gdy zapalony wyśw.3 podaj wartość zmiennej cyf3<br />else if(licznik==32) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cyf4&#93; );// gdy zapalony wyśw.4 podaj wartość zmiennej cyf4<br /><br />ANODY_PORT = (ANODY_PORT &amp; ~MASKA_ANODY) | (~licznik &amp; MASKA_ANODY);// cykliczne przełączanie kolejnej anody w każdym przerwaniu<br /><br />// operacje cyklicznego przesuwania bitu zapalającego anody w zmiennej licznik<br />licznik &lt;&lt;= 1;// przesunięcie zawartości bitów licznika o 1 w lewo<br />if(licznik&gt;32) licznik = 4;// jeśli licznik większy niż 32 to ustaw na 4<br />// porty anod sterowane kolejno: PB2, PB3, PB4, PB5<br />}[/syntax]<br /><br />Pliki disp_led.h i disp_led.c, to zmodyfikowane pliki z BB.<br /><br />Generalnie zegar działa. Tylko coś wyłącza podciągnie pinu PD2 (INT0) do Vcc. Dlatego musiałem dodać rezystor R1.<br />Nie mogę tego błędu znaleźć. Przypuszczam, że jest to związane z &quot;pomijaniem&quot; pinu PD2 w ustawianiu portu D jako wyjście dla segmentów.<br />Dodam, że pierwsze próby zegara robiłem z Atmegą32. Tam porty segmentów &quot;leciały&quot; po kolei i z podciąganiem pinu PD2 do Vcc nie było problemu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9741">oowan</a> — 10 sty 2016, o 00:54</p><hr />
]]></content>
</entry>
</feed>