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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-08-27T12:26:30+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=49&amp;t=8291&amp;mode</id>
<entry>
<author><name><![CDATA[HCOOH]]></name></author>
<updated>2014-08-27T12:26:30+01:00</updated>
<published>2014-08-27T12:26:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8291&amp;p=93102#p93102</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8291&amp;p=93102#p93102"/>
<title type="html"><![CDATA[Re: Zegar - multipleksowanie LED]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8291&amp;p=93102#p93102"><![CDATA[
Dzięki za dobre słowo <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><br /><br />Mogę wśród definicji umieścić makro przyjmujące przyjazną wartość prędkości przesuwu i umieszczać jego wynik w OCR1A <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=2954">HCOOH</a> — 27 sie 2014, o 12:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[doman89]]></name></author>
<updated>2014-08-27T03:00:33+01:00</updated>
<published>2014-08-27T03:00:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8291&amp;p=93066#p93066</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8291&amp;p=93066#p93066"/>
<title type="html"><![CDATA[Re: Zegar - multipleksowanie LED]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8291&amp;p=93066#p93066"><![CDATA[
Witam,<br /><br />Co prawda w C taki zegarek to momencik, natomiast ASM to już coś <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Podziwiam ludzi którzy piszą w tym języku, mi nigdy nie wystarczyło samozaparcia, aby nawet liznąć ten język.<br /><br />Tak więc dobra robota <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />, choć ja bym mniejszy scroll dał bo nie nadążam za nim <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><br /><br /><span style="color: #0000FF">z Niebieskim pozdRowieniem,<br />Doman89</span><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3271">doman89</a> — 27 sie 2014, o 03:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-08-26T23:56:21+01:00</updated>
<published>2014-08-26T23:56:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8291&amp;p=93061#p93061</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8291&amp;p=93061#p93061"/>
<title type="html"><![CDATA[Re: Zegar - multipleksowanie LED]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8291&amp;p=93061#p93061"><![CDATA[
Z łezką w oku patrzę i wspominam swoje boje w czystym ASM na AVR <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... <br /><br />ładnie ładnie ... Myślę że dla celów czysto naukowych i lepszego poznania AVRów warto porobić sobie takie ćwiczenia ....<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 26 sie 2014, o 23:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[HCOOH]]></name></author>
<updated>2014-08-26T21:42:13+01:00</updated>
<published>2014-08-26T21:42:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8291&amp;p=93038#p93038</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8291&amp;p=93038#p93038"/>
<title type="html"><![CDATA[Zegar - multipleksowanie LED]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8291&amp;p=93038#p93038"><![CDATA[
Witam wszystkich <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Jako że w tym dziale się relatywnie mało dzieje, a ja właśnie jestem na etapie nauki assemblera dla avrów, to trochę ożywię forum i pochwalę się nowym programikiem napisanym w asm.<br /><br />Program multipleksuje czteropozycyjny siedmiosegmentowy wyświetlacz, przesuwając na nim datę i godzinę pobieraną przez sprzętowy moduł I2C. Zestaw: ATB 1.04, procek: atmega32, kwarc: 11059200, kalendarium: PCF8583.<br /><br />Wykorzystane są trzy przerwania:<br />INT0 z PCF-a, w którym atmega pobiera datę, &quot;obrabia&quot; dane (przekształca je na graficzne reprezentacje cyfr) i umieszcza w wyświetlanym buforze,<br />OC1A, które przesuwa wyświetlany bufor,<br />OC2, które multipleksuje wyświetlacz.<br /><br /><br />PCF-a już wcześniej zaprogramowałem na daną datę i godzinę. Póki co mój programik tylko odczytuje dane z tego scalaka i jeszcze nic nie zapisuje, ale dzięki temu, że w całości odbywa się w przerwaniach, a główna pętla programu jest pusta, można ją swobodnie zaprzęgnąć do np. ustawiania daty i godziny <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /><br />Jest to mój pierwszy bardziej sensowny program w asm, więc proszę o sugestie i uwagi bardziej zaawansowanych (bo nie znam się jeszcze m.in. na dobrej organizacji kodu asemblerowego, domyślam się też, że pewnie powinienem ujednolicić własne definicje <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" />). A do tych, którzy są w tym temacie krok za mną - jak macie jakieś pytania, to postaram się odpowiedzieć w miarę możliwości <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><br /><br />Poniżej kod i filmik, jak to śmiga.<br /><br />[syntax=asm]/*<br /> * mydefs.inc<br /> *<br /> *  Created: 2014-08-19 19:18:15<br /> *   Author: HCOOH<br /> */ <br /><br /><br />  ; Moje definicje<br /><br /><br />  ; Definicje portow<br /> .equ POZ_PORT= PORTB<br /> .equ POZ_DDR= DDRB<br /> .equ CYF_PORT= PORTA<br /> .equ CYF_DDR= DDRA<br /><br />  ; Czy uzywana optymalna funkcja przetwarzania znaku na jego graficzna interpretacje<br />  ; Bajt pobierany z I2C jest bezposrednio konwertowany w rejestrze<br />  ; z pominieciem przechowania jego wartosci w komorce SRAM<br /> .equ USE_FORM_CHAR_FROM_I2C = 1<br /><br /><br /> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br /><br /> ; Wartosci PORTB<br /> .equ poz1 = 0x0E; wartosci dla PORTB (sterujacy pozycjami)<br /> .equ poz2 = 0x0D; aby wlaczal kolejne pozycje<br /> .equ poz3 = 0x0B<br /> .equ poz4 = 0x07<br /><br /> ; Wartosci PORTA<br /> .equ c0= 0b11000000; wartosci dla PORTA (sterujacy segmentami)<br /> .equ c1= 0b11111001; aby wlaczal symbole kolejnych cyfr<br /> .equ c2= 0b10100100<br /> .equ c3= 0b10110000<br /> .equ c4= 0b10011001<br /> .equ c5= 0b10010010<br /> .equ c6= 0b10000010<br /> .equ c7= 0b11111000<br /> .equ c8= 0b10000000<br /> .equ c9= 0b10010000<br /> .equ dot= 0b01111111<br /> .equ s= 0b11111111<br /> .equ dash= 0b10111111<br /><br /> ; Rejestry<br /> .def rmp= r16; multipurpose regs<br /> .def rmp2= r17; 1 &amp; 2<br /><br /> .def ri2c = r18; rejestry do operacji z I2C<br /> .def rack = r19; 1 &amp; 2<br /> .def rcell = r13; rejestr przechowujacy komorke dostepu w PCF8583<br /><br /> .def rsreg = r15; rejestr do zapamietywania wartosci SREG<br /><br /> .def buf1= r20; cztery rejestry do przechowywania zawartosci wyswietlacza<br /> .def buf2= r21; 1 &amp; 2<br /> .def buf3= r22;   &amp; 3<br /> .def buf4= r23;   &amp; 4<br /><br /> .def cnt1= r25; MSB<br /> .def cnt2= r24; LSB<br /><br /><br /> ; Dlugosc wyswietlanego paska daty i godziny<br />  .equ str_len = 22<br /><br />  .equ PCF_ADR = 0xA2<br /><br /><br /><br /> ; Makra ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br /><br /> ; Ustawienie domyslnych wartosci wyswietlanemu paskowi<br /> ; Niektore z komorek (takie jak te zawierajace wartosc &quot;dash&quot;)<br /> ; oplaca sie inicjowac w ten sposob.<br /> ; Inne mozna pominac, aby zmniejszyc objetosc kodu<br /> ; ale chcialem miec efekt daty i godziny od poczatku pisania programu<br /> ; (zanim pobiore jakiekolwiek dane z I2C)<br /> .macro SetDisplay<br /><br />ldi XH, HIGH(DisplTab)<br />ldi XL, LOW(DisplTab)<br /><br />ldi rmp, s<br />st X+, rmp<br />ldi rmp, s<br />st X+, rmp<br />ldi rmp, s<br />st X+, rmp<br />ldi rmp, s; 4<br />st X+, rmp<br /><br />ldi rmp, c2<br />st X+, rmp<br />ldi rmp, c0<br />st X+, rmp<br />ldi rmp, c1<br />st X+, rmp<br />ldi rmp, c4<br />st X+, rmp; 8<br /><br />ldi rmp, dash<br />st X+, rmp; 9<br /><br />ldi rmp, c0<br />st X+, rmp<br />ldi rmp, c8<br />st X+, rmp; 11<br /><br />ldi rmp, dash<br />st X+, rmp; 12<br /><br />ldi rmp, c1<br />st X+, rmp<br />ldi rmp, c9<br />st X+, rmp; 14<br /><br />ldi rmp, s<br />st X+, rmp<br />ldi rmp, s<br />st X+, rmp; 16<br /><br />ldi rmp, c1<br />st X+, rmp<br />ldi rmp, c7 &amp; dot<br />st X+, rmp<br />ldi rmp, c5<br />st X+, rmp<br />ldi rmp, c6<br />st X+, rmp; 20<br /><br />ldi rmp, s<br />st X+, rmp<br />ldi rmp, s<br />st X+, rmp<br />ldi rmp, s<br />st X+, rmp<br />ldi rmp, s<br />st X+, rmp<br /><br />.endmacro<br /><br /><br /><br /><br />.macro I2C_init<br /><br />ldi ri2c, (1&lt;&lt;TWPS0)|(1&lt;&lt;TWPS1); inicjalizacja I2C<br />out TWSR, ri2c<br />ldi ri2c, 1<br />out TWBR, ri2c<br /><br />.endmacro[/syntax]<br /><br />[syntax=asm]/*<br /> * i2c.asm<br /> *<br /> *  Created: 2014-08-19 21:25:18<br /> *   Author: HCOOH<br /> */ <br /><br /><br />I2C_start:<br /><br />ldi ri2c, (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN)|(1&lt;&lt;TWSTA)<br />out TWCR, ri2c<br />_istrwhile:<br />in ri2c, TWCR<br />sbrs ri2c, TWINT<br />rjmp _istrwhile<br /><br />ret<br /><br /><br />; ; ;<br /><br /><br />I2C_stop:<br /><br />ldi rack, (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN)|(1&lt;&lt;TWSTO)<br />out TWCR, rack<br />_istowhile:<br />in rack, TWCR<br />sbrc rack, TWSTO<br />rjmp _istowhile<br /><br />ret<br /><br /><br />; ; ;<br /><br /><br />I2C_write_byte:<br /><br />out TWDR, ri2c<br />ldi ri2c, (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN)<br />out TWCR, ri2c<br />_istr2while:<br />in ri2c, TWCR<br />sbrs ri2c, TWINT<br />rjmp _istr2while<br /><br />ret<br /><br /><br />; ; ;<br /><br /><br />I2C_read_byte:<br /><br />cpi rack, 1<br />breq _isetack<br /><br />ldi ri2c, (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN)|(0&lt;&lt;TWEA)<br />out TWCR, ri2c<br />rjmp _irgoon<br /><br />_isetack:<br />ldi ri2c, (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN)|(1&lt;&lt;TWEA)<br />out TWCR, ri2c<br /><br />_irgoon:<br />in ri2c, TWCR<br />sbrs ri2c, TWINT<br />rjmp _irgoon<br /><br />in ri2c, TWDR<br /><br /> ret<br /><br /><br /> ; ; ;<br /><br /><br /> ; Procedura pobierajaca jeden bajt z ukladu PCF8583<br /> ; i zwracajaca go w rejestrze ri2c<br /> ; tuz przed jej uruchomieniem trzeba nadac rejestrowi rmp wartosc<br /> ; okreslajaca numer komorki w pamieci RAM ukladu PCF8583<br /> ; z ktorej ma byc pobrany bajt<br /> ; Np. ldi rmp, 2; (komorka przechowujaca sekundy)<br /> ;     rcall PCF_get_byte; wywolanie procedury<br /> ;     out PORTB, ri2c; wyswietlenie na porcie B wartosci binarnej aktualnej ilosci sekund (format BCD)<br /> PCF_get_byte:<br /><br />mov rcell, rmp<br /><br /> rcall I2C_start<br /><br />ldi ri2c, PCF_ADR<br />rcall I2C_write_byte<br /><br />mov ri2c, rcell<br />rcall I2C_write_byte<br /><br />rcall I2C_start<br /><br />ldi ri2c, PCF_ADR + 1<br />rcall I2C_write_byte<br /><br />ldi rack, 0<br />rcall I2C_read_byte<br /><br />rcall I2C_stop<br /><br />nop nop nop<br /><br /> ret<br /> ; innym pomyslem (pewnie lepszym) byloby zrobienie procedury<br /> ; PCF_get_date, ktora za jednym zamachem zczytywalaby kilka bajtow<br /> ; przyspieszyloby to program[/syntax]<br /><br />[syntax=asm]/*<br /> * main.asm<br /> *<br /> * Program pobierajacy date i godzine z ukladu PCF8583<br /> * i wyswietlajacy je na wyswietlaczu LED 7-segmentowym<br /> * w formie przesuwanego paska.<br /> *<br /> *  Created: 2014-08-19 21:39:35<br /> *   Author: HCOOH<br /> */ <br /><br /><br /> .nolist<br /> .include &quot;m32def.inc&quot;<br /> .include &quot;mydefs.inc&quot;<br /> .list<br /><br /><br /><br /> ; Przestrzen FLASH ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br /><br /> .cseg<br /> .org 0<br /><br /><br />; Wektory poczatkowe (zerowanie + przerwania)<br /><br />rjmp Main; poczatek progrmau<br />nop<br /><br />rjmp INT_0; INT0<br />nop; pobranie danych przez I2C<br /><br />reti; INT1<br />nop<br /><br />reti; INT2<br />nop<br /><br />rjmp OC2; OC2<br />nop; multipleksowanie wyswietlacza led<br /><br />reti; OVF2<br />nop<br /><br />reti; ICP1<br />nop<br /><br />rjmp OC1A; OC1A<br />; delay przesuwania napisu<br /><br /><br />; Poczatek programu glownego ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br /><br />Main:<br /><br />SetDisplay; makro ustawiajace wyswietlacz<br /><br />ldi rmp, HIGH(RAMEND); stworzenie stosu<br />out SPH, rmp<br />ldi rmp, LOW(RAMEND)<br />out SPL, rmp<br /><br />I2C_init; inicjalizacja modulu TWI<br /><br />ldi rmp, 0xFF; ustawienie rejestrow in/out<br />out CYF_DDR, rmp; PORTB - pozycje wyswietlacza<br />out POZ_DDR, rmp; PORTA - symbole cyfr<br />out CYF_PORT, rmp<br />out POZ_PORT, rmp<br />out PORTD, rmp<br /><br />ldi rmp, (1&lt;&lt;WGM21)|(1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20); Timer2 w tryb CTC, prescaler 1024<br />out TCCR2, rmp; f = 10800Hz<br />ldi rmp, 0x0B; OCR2 = 11 - f = 10800Hz / 11 = ~982Hz<br />out OCR2, rmp; czestotliwosc odswiezania (dla 4 cyfr) = 982Hz / 4 = 245.5Hz<br /><br />ldi rmp, (1&lt;&lt;WGM12)|(1&lt;&lt;CS10)|(1&lt;&lt;CS12); Timer1 w tryb CTC, prescaler 1024<br />out TCCR1B, rmp; f = 10<br />ldi rmp, 0x07; OCR1AH = 0x07<br />out OCR1AH, rmp<br />ldi rmp, 0x38; OCR1AL = 0x38<br />out OCR1AL, rmp; sumarycznie OCR1A = 1848<br />; czestotliwosc przesuwu paska = 10800Hz / 1848 = ~5.84Hz<br /><br />ldi rmp, (1&lt;&lt;OCIE1A)|(1&lt;&lt;OCIE2)<br />out TIMSK, rmp; zezwolenie na przerwanie OC2 i OC1A<br /><br />ldi cnt1, HIGH(DisplTab); zaladowanie adresu wyswietlanego bufora<br />ldi cnt2, LOW(DisplTab); do pomocniczego rejestru<br /><br />ldi rmp, (1&lt;&lt;ISC01)<br />out MCUCR, rmp; zbocze opadajace na INT0<br /><br />ldi rmp, (1&lt;&lt;INT0); przerwanie od INT0 ON<br />out GICR, rmp<br /><br />sei; przerwania ON<br /><br />; Petla glowna programu ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br /><br />MainLoop:<br /> <br />; petla glowna pusta :)<br />; czyli mozliwosci rozbudowy programu<br />; dopiero sie zaczynaja<br /><br />; np tutaj mozna utworzyc procedury nastawiania zegara<br /><br />; zwroc uwage, ze rejestry rmp i rmp2 sa w przerwaniach uzywane<br />; z odkladaniem i pobieraniem ich ze stosu<br />; wiec w glownym watku mozna z nich korzystac do woli<br /><br />rjmp MainLoop<br /><br />; Koniec petli glownej programu<br /><br /><br />; Koniec programu glownego<br /><br /><br /><br />; ; ;<br /><br /><br /><br />; Procedury obslugi przerwan ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br /><br />; INT0<br /><br />INT_0:<br /><br />push rmp<br /><br />ldi rmp, 3<br />rcall PCF_get_byte<br /><br />mov rmp, ri2c<br /><br />andi ri2c, 0x0F; obrobka bajtu BCD<br />rcall FormCharFromI2C<br />sts dMin1, ri2c<br /><br />mov ri2c, rmp<br />rcall lsr_ri2c_4x; obrobka bajtu BCD<br />andi ri2c, 0x07; cd.<br />rcall FormCharFromI2C<br />sts dMin, ri2c<br /><br />;<br /><br />ldi rmp, 4<br />rcall PCF_get_byte<br /><br />mov rmp, ri2c<br /><br />andi ri2c, 0x0F; obrobka bajtu BCD<br />rcall FormCharFromI2C<br />andi ri2c, dot<br />sts dGodz1, ri2c<br /><br />mov ri2c, rmp<br />rcall lsr_ri2c_4x; obrobka bajtu BCD<br />andi ri2c, 0x03; cd.<br />rcall FormCharFromI2C<br />sts dGodz, ri2c<br /><br />;<br /><br />ldi rmp, 5<br />rcall PCF_get_byte<br /><br />mov rmp, ri2c<br /><br />andi ri2c, 0x0F; obrobka bajtu BCD<br />rcall FormCharFromI2C<br />sts dDzien1, ri2c<br /><br />mov ri2c, rmp<br />rcall lsr_ri2c_4x; obrobka bajtu BCD<br />andi ri2c, 0x03; cd.<br />rcall FormCharFromI2C<br />sts dDzien, ri2c<br /><br />;<br /><br />ldi rmp, 6<br />rcall PCF_get_byte<br /><br />mov rmp, ri2c<br /><br />andi ri2c, 0x0F; obrobka bajtu BCD<br />rcall FormCharFromI2C<br />sts dMies1, ri2c<br /><br />mov ri2c, rmp<br />rcall lsr_ri2c_4x; obrobka bajtu BCD<br />andi ri2c, 0x01; cd.<br />rcall FormCharFromI2C<br />sts dMies, ri2c<br /><br />pop rmp<br /><br />reti<br /><br />; pomocniczna (optymalizujaca flash) procedura do przesuniecia bitowego ri2c &gt;&gt; 4<br />lsr_ri2c_4x:<br />lsr ri2c<br />lsr ri2c<br />lsr ri2c<br />lsr ri2c<br />ret<br /><br />; INT0 - koniec<br /><br /><br /><br /><br />; Output Compare Match 2<br /><br />OC2:<br /><br />push rmp2<br />push rmp<br />lds rmp2, Pos<br /><br />_oc2_beg:<br />inc rmp2; rotujacy licznik 0 - 4<br />cpi rmp2, 0x05<br />breq _oc2_zero<br /><br />cpi rmp2, 0x01<br />breq _oc2_1<br /><br />cpi rmp2, 0x02<br />breq _oc2_2<br /><br />cpi rmp2, 0x03<br />breq _oc2_3<br /><br />cpi rmp2, 0x04<br />breq _oc2_4<br /><br />;;<br />_oc2_1:<br />ldi rmp, poz4<br />out POZ_PORT, rmp; uruchomienie pozycji 4<br />out CYF_PORT, buf1<br />rjmp _oc2_end<br /><br />_oc2_2:<br />ldi rmp, poz3<br />out POZ_PORT, rmp; uruchomienie pozycji 3<br />out CYF_PORT, buf2<br />rjmp _oc2_end<br /><br />_oc2_3:<br />ldi rmp, poz2<br />out POZ_PORT, rmp; uruchomienie pozycji 2<br />out CYF_PORT, buf3<br />rjmp _oc2_end<br /><br />_oc2_4:<br />ldi rmp, poz1<br />out POZ_PORT, rmp; uruchomienie pozycji 1<br />out CYF_PORT, buf4<br />rjmp _oc2_end<br />;;<br /><br />_oc2_zero:<br />clr rmp2<br />rjmp _oc2_beg<br /><br />_oc2_end:<br />sts Pos, rmp2<br />pop rmp<br />pop rmp2<br /><br />reti<br /><br />; Output Compare Match 2 - koniec<br /><br /><br /><br />; Output Compare Match 1A<br /><br />OC1A:<br /><br />push rmp<br />push rmp2<br />lds rmp, Slide<br />ldi rmp2, 0x00<br /><br />_oc1a_beg:<br />mov XH, cnt1<br />mov XL, cnt2<br /><br />ld buf1, X+<br />ld buf2, X+<br />ld buf3, X+<br />ld buf4, X+<br /><br />inc cnt2<br />adc cnt1, rmp2<br /><br />inc rmp<br />cpi rmp, str_len<br />breq _oc1a_again<br /><br />sts Slide, rmp<br />pop rmp2<br />pop rmp<br />reti<br /><br /><br />_oc1a_again:<br />ldi rmp, 0x00<br />ldi cnt1, HIGH(DisplTab)<br />ldi cnt2, LOW(DisplTab)<br />rjmp _oc1a_beg<br /><br />reti<br /><br />; Output Compare Match 1A - koniec<br /><br /><br /><br /><br /><br />; Procedury - inne ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br /><br /><br />.if USE_FORM_CHAR_FROM_I2C == 0<br /><br />; wersja procedury bez uzycia z I2C<br />; czyli uformowanie znaku z jakiegokolwiek zrodla<br />; troche wolniejsza i pozerajaca dodatkowy bajt SRAM<br />; ale za to bardziej uniwersalna pod wzgledem<br />; korzystania z rejestrow, a wiec bardziej elastyczna<br />FormChar:<br /><br />push rmp2<br /><br />lds rmp2, Recreate<br /><br />cpi rmp2, 0<br />breq _form_0<br /><br />cpi rmp2, 1<br />breq _form_1<br /><br />cpi rmp2, 2<br />breq _form_2<br /><br />cpi rmp2, 3<br />breq _form_3<br /><br />cpi rmp2, 4<br />breq _form_4<br /><br />cpi rmp2, 5<br />breq _form_5<br /><br />cpi rmp2, 6<br />breq _form_6<br /><br />cpi rmp2, 7<br />breq _form_7<br /><br />cpi rmp2, 8<br />breq _form_8<br /><br />cpi rmp2, 9<br />breq _form_9<br /><br />ldi rmp2, dot<br />sts Recreate, rmp2<br />rjmp _form_end<br /><br />_form_0:<br />ldi rmp2, c0<br />sts Recreate, rmp2<br />rjmp _form_end<br /><br />_form_1:<br />ldi rmp2, c1<br />sts Recreate, rmp2<br />rjmp _form_end<br /><br />_form_2:<br />ldi rmp2, c2<br />sts Recreate, rmp2<br />rjmp _form_end<br /><br />_form_3:<br />ldi rmp2, c3<br />sts Recreate, rmp2<br />rjmp _form_end<br /><br />_form_4:<br />ldi rmp2, c4<br />sts Recreate, rmp2<br />rjmp _form_end<br /><br />_form_5:<br />ldi rmp2, c5<br />sts Recreate, rmp2<br />rjmp _form_end<br /><br />_form_6:<br />ldi rmp2, c6<br />sts Recreate, rmp2<br />rjmp _form_end<br /><br />_form_7:<br />ldi rmp2, c7<br />sts Recreate, rmp2<br />rjmp _form_end<br /><br />_form_8:<br />ldi rmp2, c8<br />sts Recreate, rmp2<br />rjmp _form_end<br /><br />_form_9:<br />ldi rmp2, c9<br />sts Recreate, rmp2<br />rjmp _form_end<br /><br />_form_end:<br />pop rmp2<br /><br />ret<br />.endif<br /><br /><br /><br />; druga wersja:<br />; Procedura otrzymujaca w rejestrze bajt z wartoscia 0x00 - 0x09<br />; i przerabiajaca go na graficzna interpretacje cyfry<br />; wartosci &gt; 0x09 zostana zmienione na znaczek &quot;.&quot; (dot)<br />;<br />; wartosc otrzymywana jest z I2C w rejestrze ri2c<br />; i tamze zmieniana (bez angazowania pamieci RAM)<br />.if USE_FORM_CHAR_FROM_I2C<br />FormCharFromI2C:<br /><br />cpi ri2c, 0<br />breq _form_0<br /><br />cpi ri2c, 1<br />breq _form_1<br /><br />cpi ri2c, 2<br />breq _form_2<br /><br />cpi ri2c, 3<br />breq _form_3<br /><br />cpi ri2c, 4<br />breq _form_4<br /><br />cpi ri2c, 5<br />breq _form_5<br /><br />cpi ri2c, 6<br />breq _form_6<br /><br />cpi ri2c, 7<br />breq _form_7<br /><br />cpi ri2c, 8<br />breq _form_8<br /><br />cpi ri2c, 9<br />breq _form_9<br /><br />ldi ri2c, dot<br />rjmp _form_end<br /><br />_form_0:<br />ldi ri2c, c0<br />rjmp _form_end<br /><br />_form_1:<br />ldi ri2c, c1<br />rjmp _form_end<br /><br />_form_2:<br />ldi ri2c, c2<br />rjmp _form_end<br /><br />_form_3:<br />ldi ri2c, c3<br />rjmp _form_end<br /><br />_form_4:<br />ldi ri2c, c4<br />rjmp _form_end<br /><br />_form_5:<br />ldi ri2c, c5<br />rjmp _form_end<br /><br />_form_6:<br />ldi ri2c, c6<br />rjmp _form_end<br /><br />_form_7:<br />ldi ri2c, c7<br />rjmp _form_end<br /><br />_form_8:<br />ldi ri2c, c8<br />rjmp _form_end<br /><br />_form_9:<br />ldi ri2c, c9<br />rjmp _form_end<br /><br />_form_end:<br /><br />ret<br />.endif<br /><br /><br /><br />; ; ;<br /><br /><br /><br /><br />.include &quot;i2c.asm&quot;; doklejenie procedur obslugi I2C<br /><br /><br /><br /><br /><br />; ; ;<br /><br /><br /><br />; Przestrzen SRAM ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br /><br /> .dseg<br /> .org 0x0060<br /><br /> Pos:; numer wyswietlanej pozycji<br /> .byte 1<br /> <br /> Slide:; wartosc przesuniecia napisu<br /> .byte 1<br /><br /> .if USE_FORM_CHAR_FROM_I2C == 0<br /> Recreate:; komorka przetwarzajaca wartosc binarna cyfry na graficzna interpretacje<br /> .byte 1; (przy pomocy procedury FormChar)<br /> .endif<br /><br /> DisplTab:; bufor przesuwanego napisu<br /> .byte str_len<br /><br />   ; Pozycje wyswietlacza<br />   ; aliasy do latwiejszego poruszania sie po<br />   ; fragmentach wyswietlanego bufora (napisu)<br />.equ dRok1 = DisplTab + 7<br />.equ dMies = DisplTab + 9<br />.equ dMies1 = DisplTab + 10<br />.equ dDzien = DisplTab + 12<br />.equ dDzien1 = DisplTab + 13<br />.equ dGodz = DisplTab + 16<br />.equ dGodz1 = DisplTab + 17<br />.equ dMin = DisplTab + 18<br />.equ dMin1 = DisplTab + 19[/syntax]<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 1 minucie ]</span></strong><br /><br />Filmik będzie za chwil kilka <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 33 minutach ]</span></strong><br /><br />Oto i on:<br /><br /><!-- m --><a class="postlink" href="https://www.youtube.com/watch?v=B32EgeLAvaY" >https://www.youtube.com/watch?v=B32EgeLAvaY</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2954">HCOOH</a> — 26 sie 2014, o 21:42</p><hr />
]]></content>
</entry>
</feed>