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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-01-21T08:57:37+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=56&amp;t=10310&amp;mode</id>
<entry>
<author><name><![CDATA[miremeryt]]></name></author>
<updated>2015-01-21T08:57:37+01:00</updated>
<published>2015-01-21T08:57:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10310&amp;p=115074#p115074</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10310&amp;p=115074#p115074"/>
<title type="html"><![CDATA[Re: attiny 26 - programowy UART.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10310&amp;p=115074#p115074"><![CDATA[
A tak merytorycznie to dołączę plik main.c p. Mirka z poradnika o terminalu jako wyświetlaczu, no i obsługę ADC z at tiny 26, ale muszę trochę pomyśleć hłe, hłe... jeżeli jeszcze potrafię. MK.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5590">miremeryt</a> — 21 sty 2015, o 08:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[miremeryt]]></name></author>
<updated>2015-01-21T06:12:12+01:00</updated>
<published>2015-01-21T06:12:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10310&amp;p=115066#p115066</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10310&amp;p=115066#p115066"/>
<title type="html"><![CDATA[Re: attiny 26 - programowy UART.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10310&amp;p=115066#p115066"><![CDATA[
No cóż &quot;pierwsze śliwki...&quot; To dla mnie nowość i forum również pierwsze, na którym jestem zarejestrowany, więc &quot;wyjadacze forumowicze&quot; wybaczcie. Nie mniej wezmę sobie i zakonotuję w dziurawym umyśle. Gdy rozmienia się 7 dychę trudno jest ogarnąć wiele prostych wiadomości <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />. Teraz przetrawię uwagi, szkoda, że nadal bez praktyki. Może dotrze cokolwiek do mnie  <img src="https://forum.atnel.pl/images/smilies/icon_redface.gif" alt=":oops:" title="Zawstydzony" /> <br />Przede wszystkim dziękuję za szybki odzew.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5590">miremeryt</a> — 21 sty 2015, o 06:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-01-20T23:00:12+01:00</updated>
<published>2015-01-20T23:00:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10310&amp;p=115053#p115053</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10310&amp;p=115053#p115053"/>
<title type="html"><![CDATA[Re: attiny 26 - programowy UART.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10310&amp;p=115053#p115053"><![CDATA[
Coś tam wycięło bo nie użyłeś dobrego formatowania:<br /><a href="http://forum.atnel.pl/topic7402.html"  class="postlink">Wstawianie listingów programów w postach.</a><br /><br /><div class="quotetitle">miremeryt napisał(a):</div><div class="quotecontent"><br />2) Jak pozbyć się warninga w pliku softuart.<br /></div><br />Masz złą nazwę przerwania. Sprawdź sobie w Eclipse.<br /><br />[syntax=c]#define WITH_STDIO_DEMO  0[/syntax]<br />Mówi, że nie używasz stdio, ale mimo to wywal to z kodu. Możesz też pozbyć się funkcji operujących na łańcuchach znaków z pamięci flash jeśli nie będziesz miał ich zbyt dużo. Dzięki temu zaoszczędzisz pamięć programu, ale każdy napis wtedy zajmie pamięć RAM.<br /><br />Usuń zbędne:<br />[syntax=c]static const char pstring&#91;&#93; PROGMEM = <br />        &quot;adapted for Atmel AVR and this demo by Martin Thomas\r\n&quot;;<br /><br />softuart_puts_P( &quot;\r\nSoftuart Demo-Application\r\n&quot; );  // &quot;implicit&quot; PSTR <br />    softuart_puts_p( PSTR(&quot;generic softuart driver code by Colin Gittins\r\n&quot;) ); // explicit PSTR <br />    softuart_puts_p( pstring ); // pstring defined with PROGMEM[/syntax]<br />To zajmuje jakieś 130 bajtów pamięci programu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 20 sty 2015, o 23:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[miremeryt]]></name></author>
<updated>2015-01-20T16:57:33+01:00</updated>
<published>2015-01-20T16:57:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10310&amp;p=114978#p114978</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10310&amp;p=114978#p114978"/>
<title type="html"><![CDATA[attiny 26 - programowy UART.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10310&amp;p=114978#p114978"><![CDATA[
Zasadniczo chciałem zaprząc AT TINY 26 jako miernik napięcie/prąd. Ponieważ w moich &quot;początkach&quot; zaopatrzyłem się w taki procek (biorąc na serio sugestie wszystkich trochę lepiej zorientowanych).<br />W oparciu o jego parametry (wzmocnienie różnicowe) chciałem zbudować miernik, ale komunikujący się przez UART. Otrzeźwienie przyszło, gdy spojrzałem w notę katalogową. Nie ma sprzętowego UARTA &quot;Tyskie z Polska...&quot; No i zacząłem brnąć. Na razie ściągnąłem (ukradłem) programowy uart i trochę go dostosowałem:<br /> <br />Plik nagłówkowy:<br /><br />[syntax=c]/*<br /> * softuart.h<br /> *<br /> *  Created on: 20-01-2015<br /> *      Author: Mirek<br /> */<br /><br />#ifndef SOFTUART_H_<br />#define SOFTUART_H_<br /><br />#define SOFTUART_BAUD_RATE      9600<br /><br />#if defined (__AVR_ATtiny26__) // || defined (__AVR_ATtiny45__) || defined (__AVR_ATtiny85__)<br /><br />#define SOFTUART_RXPIN   PINB<br />#define SOFTUART_RXDDR   DDRB<br />#define SOFTUART_RXBIT   PB4<br /><br />#define SOFTUART_TXPORT  PORTB<br />#define SOFTUART_TXDDR   DDRB<br />#define SOFTUART_TXBIT   PB5<br /><br />#define SOFTUART_T_COMP_LABEL      TIM0_COMPA_vect<br />#define SOFTUART_T_COMP_REG        OCR0A<br />#define SOFTUART_T_CONTR_REGA      TCCR0A<br />#define SOFTUART_T_CONTR_REGB      TCCR0B<br />#define SOFTUART_T_CNT_REG         TCNT0<br />#define SOFTUART_T_INTCTL_REG      TIMSK<br /><br />#define SOFTUART_CMPINT_EN_MASK    (1 &lt;&lt; OCIE0A)<br /><br />#define SOFTUART_CTC_MASKA         (1 &lt;&lt; WGM01)<br />#define SOFTUART_CTC_MASKB         (0)<br /><br />/* &quot;A timer interrupt must be set to interrupt at three times<br />   the required baud rate.&quot; */<br />#define SOFTUART_PRESCALE (8)<br />// #define SOFTUART_PRESCALE (1)<br /><br />#if (SOFTUART_PRESCALE == 8)<br />#define SOFTUART_PRESC_MASKA         (0)<br />#define SOFTUART_PRESC_MASKB         (1 &lt;&lt; CS01)<br />#elif (SOFTUART_PRESCALE==1)<br />#define SOFTUART_PRESC_MASKA         (0)<br />#define SOFTUART_PRESC_MASKB         (1 &lt;&lt; CS00)<br />#else<br />#error &quot;prescale unsupported&quot;<br />#endif<br /><br />/* &quot;A timer interrupt must be set to interrupt at three times<br />   the required baud rate.&quot; */<br />#define SOFTUART_PRESCALE (8)<br />// #define SOFTUART_PRESCALE (1)<br /><br />#if (SOFTUART_PRESCALE == 8)<br />#define SOFTUART_PRESC_MASKA         (0)<br />#define SOFTUART_PRESC_MASKB         (1 &lt;&lt; CS01)<br />#elif (SOFTUART_PRESCALE==1)<br />#define SOFTUART_PRESC_MASKA         (0)<br />#define SOFTUART_PRESC_MASKB         (1 &lt;&lt; CS00)<br />#else<br />#error &quot;prescale unsupported&quot;<br />#endif<br /><br />#else<br />#error &quot;no defintions available for this AVR&quot;<br />#endif<br /><br /><br />#define SOFTUART_TIMERTOP ( F_CPU/SOFTUART_PRESCALE/SOFTUART_BAUD_RATE/3 - 1)<br /><br />#if (SOFTUART_TIMERTOP &gt; 0xff)<br />#warning &quot;Check SOFTUART_TIMERTOP: increase prescaler, lower F_CPU or use a 16 bit timer&quot;<br />#endif<br /><br />#define SOFTUART_IN_BUF_SIZE     32<br /><br />// Init the Software Uart<br />void softuart_init(void);<br /><br />// Clears the contents of the input buffer.<br />void softuart_flush_input_buffer( void );<br /><br />// Tests whether an input character has been received.<br />unsigned char softuart_kbhit( void );<br /><br />// Reads a character from the input buffer, waiting if necessary.<br />char softuart_getchar( void );<br /><br />// To check if transmitter is busy<br />unsigned char softuart_transmit_busy( void );<br /><br />// Writes a character to the serial port.<br />void softuart_putchar( const char );<br /><br />// Turns on the receive function.<br />void softuart_turn_rx_on( void );<br /><br />// Turns off the receive function.<br />void softuart_turn_rx_off( void );<br /><br />// Write a NULL-terminated string from RAM to the serial port<br />void softuart_puts( const char *s );<br /><br />// Write a NULL-terminated string from program-space (flash)<br />// to the serial port. example: softuart_puts_p(PSTR(&quot;test&quot;))<br />void softuart_puts_p( const char *prg_s );<br /><br />// Helper-Macro - &quot;automatically&quot; inserts PSTR<br />// when used: include avr/pgmspace.h before this include-file<br />#define softuart_puts_P(s___) softuart_puts_p(PSTR(s___))<br /><br /><br />#endif <br />/* SOFTUART_H_ */[/syntax]<br /><br />Plik Softuart.C:<br />[syntax=c]/*<br /> * softuart.c<br /> *<br /> *  Created on: 20-01-2015<br /> *      Author: Mirek<br /> */<br /><br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br /><br />#include &quot;softuart.h&quot;<br /><br />#define SU_TRUE    1<br />#define SU_FALSE   0<br /><br />// startbit and stopbit parsed internally (see ISR)<br />#define RX_NUM_OF_BITS (8)<br />volatile static char           inbuf&#91;SOFTUART_IN_BUF_SIZE&#93;;<br />volatile static unsigned char  qin;<br />static unsigned char           qout;<br />volatile static unsigned char  flag_rx_off;<br />volatile static unsigned char  flag_rx_ready;<br /><br />// 1 Startbit, 8 Databits, 1 Stopbit = 10 Bits/Frame<br />#define TX_NUM_OF_BITS (10)<br />volatile static unsigned char  flag_tx_busy;<br />volatile static unsigned char  timer_tx_ctr;<br />volatile static unsigned char  bits_left_in_tx;<br />volatile static unsigned short internal_tx_buffer; /* ! mt: was type uchar - this was wrong */<br /><br />#define set_tx_pin_high()      ( SOFTUART_TXPORT |=  ( 1 &lt;&lt; SOFTUART_TXBIT ) );<br />#define set_tx_pin_low()       ( SOFTUART_TXPORT &amp;= ~( 1 &lt;&lt; SOFTUART_TXBIT ) );<br />#define get_rx_pin_status()    ( SOFTUART_RXPIN  &amp;   ( 1 &lt;&lt; SOFTUART_RXBIT ) );<br /><br />ISR(SOFTUART_T_COMP_LABEL)<br />{<br />static unsigned char flag_rx_waiting_for_stop_bit = SU_FALSE;<br />static unsigned char rx_mask;<br /><br />static unsigned char timer_rx_ctr;<br />static unsigned char bits_left_in_rx;<br />static unsigned char internal_rx_buffer;<br /><br />unsigned char start_bit, flag_in;<br />unsigned char tmp;<br /><br />// Transmitter Section<br />if ( flag_tx_busy == SU_TRUE ) {<br />tmp = timer_tx_ctr;<br />if ( --tmp == 0 ) { // if ( --timer_tx_ctr &lt;= 0 )<br />if ( internal_tx_buffer &amp; 0x01 ) {<br />set_tx_pin_high();<br />}<br />else {<br />set_tx_pin_low();<br />}<br />internal_tx_buffer &gt;&gt;= 1;<br />tmp = 3; // timer_tx_ctr = 3;<br />if ( --bits_left_in_tx == 0 ) {<br />flag_tx_busy = SU_FALSE;<br />}<br />}<br />timer_tx_ctr = tmp;<br />}<br /><br />// Receiver Section<br />if ( flag_rx_off == SU_FALSE ) {<br />if ( flag_rx_waiting_for_stop_bit ) {<br />if ( --timer_rx_ctr == 0 ) {<br />flag_rx_waiting_for_stop_bit = SU_FALSE;<br />flag_rx_ready = SU_FALSE;<br />inbuf&#91;qin&#93; = internal_rx_buffer;<br />if ( ++qin &gt;= SOFTUART_IN_BUF_SIZE ) {<br />// overflow - reset inbuf-index<br />qin = 0;<br />}<br />}<br />}<br />else {  // rx_test_busy<br />if ( flag_rx_ready == SU_FALSE ) {<br />start_bit = get_rx_pin_status();<br />// test for start bit<br />if ( start_bit == 0 ) {<br />flag_rx_ready      = SU_TRUE;<br />internal_rx_buffer = 0;<br />timer_rx_ctr       = 4;<br />bits_left_in_rx    = RX_NUM_OF_BITS;<br />rx_mask            = 1;<br />}<br />}<br />else {  // rx_busy<br />tmp = timer_rx_ctr;<br />if ( --tmp == 0 ) { // if ( --timer_rx_ctr == 0 ) {<br />// rcv<br />tmp = 3;<br />flag_in = get_rx_pin_status();<br />if ( flag_in ) {<br />internal_rx_buffer |= rx_mask;<br />}<br />rx_mask &lt;&lt;= 1;<br />if ( --bits_left_in_rx == 0 ) {<br />flag_rx_waiting_for_stop_bit = SU_TRUE;<br />}<br />}<br />timer_rx_ctr = tmp;<br />}<br />}<br />}<br />}<br /><br />static void io_init(void)<br />{<br />// TX-Pin as output<br />SOFTUART_TXDDR |=  ( 1 &lt;&lt; SOFTUART_TXBIT );<br />    // RX-Pin as input<br />SOFTUART_RXDDR &amp;= ~( 1 &lt;&lt; SOFTUART_RXBIT );<br />}<br /><br />static void timer_init(void)<br />{<br />unsigned char sreg_tmp;<br /><br />sreg_tmp = SREG;<br />cli();<br /><br />//SOFTUART_T_COMP_REG = SOFTUART_TIMERTOP;     /* set top */<br /><br />//SOFTUART_T_CONTR_REGA = SOFTUART_CTC_MASKA | SOFTUART_PRESC_MASKA;<br />//SOFTUART_T_CONTR_REGB = SOFTUART_CTC_MASKB | SOFTUART_PRESC_MASKB;<br /><br />//SOFTUART_T_INTCTL_REG |= SOFTUART_CMPINT_EN_MASK;<br /><br />SOFTUART_T_CNT_REG = 0; /* reset counter */<br /><br />SREG = sreg_tmp;<br />}<br /><br />void softuart_init( void )<br />{<br />flag_tx_busy  = SU_FALSE;<br />flag_rx_ready = SU_FALSE;<br />flag_rx_off   = SU_FALSE;<br /><br />set_tx_pin_high(); /* mt: set to high to avoid garbage on init */<br /><br />io_init();<br />timer_init();<br />}<br /><br />static void idle(void)<br />{<br />// timeout handling goes here<br />// - but there is a &quot;softuart_kbhit&quot; in this code...<br />// add watchdog-reset here if needed<br />}<br /><br />void softuart_turn_rx_on( void )<br />{<br />flag_rx_off = SU_FALSE;<br />}<br /><br />void softuart_turn_rx_off( void )<br />{<br />flag_rx_off = SU_TRUE;<br />}<br /><br />char softuart_getchar( void )<br />{<br />char ch;<br /><br />while ( qout == qin ) {<br />idle();<br />}<br />ch = inbuf&#91;qout&#93;;<br />if ( ++qout &gt;= SOFTUART_IN_BUF_SIZE ) {<br />qout = 0;<br /><br />}<br /><br />return( ch );<br />}<br /><br />unsigned char softuart_kbhit( void )<br />{<br />return( qin != qout );<br />}<br /><br />void softuart_flush_input_buffer( void )<br />{<br />qin  = 0;<br />qout = 0;<br />}<br /><br />unsigned char softuart_transmit_busy( void )<br />{<br />return ( flag_tx_busy == SU_TRUE ) ? 1 : 0;<br />}<br /><br />void softuart_putchar( const char ch )<br />{<br />while ( flag_tx_busy == SU_TRUE ) {<br />; // wait for transmitter ready<br />  // add watchdog-reset here if needed;<br />}<br /><br />// invoke_UART_transmit<br />timer_tx_ctr       = 3;<br />bits_left_in_tx    = TX_NUM_OF_BITS;<br />internal_tx_buffer = ( ch &lt;&lt; 1 ) | 0x200;<br />flag_tx_busy       = SU_TRUE;<br />}<br /><br />void softuart_puts( const char *s )<br />{<br />while ( *s ) {<br />softuart_putchar( *s++ );<br />}<br />}<br /><br />void softuart_puts_p( const char *prg_s )<br />{<br />char c;<br /><br />while ( ( c = pgm_read_byte( prg_s++ ) ) ) {<br />softuart_putchar(c);<br />}<br />}[/syntax]<br /><br />oraz testowego pliku main.c:<br /><br /> [syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 20-01-2015<br /> *      Author: Mirek<br /> */<br /><br />#define WITH_STDIO_DEMO   0 /* 1: enable, 0: disable */<br /><br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include&lt;avr/io.h&gt;<br />#include &quot;softuart.h&quot;<br /><br /><br />#if WITH_STDIO_DEMO<br />#include &lt;stdio.h&gt;<br /><br />// interface between avr-libc stdio and software-UART<br />static int my_stdio_putchar( char c, FILE *stream )<br />{<br />if ( c == '\n' ) {<br />softuart_putchar( '\r' );<br />}<br />softuart_putchar( c );<br /><br />return 0;<br />}<br /><br />FILE suart_stream = FDEV_SETUP_STREAM( my_stdio_putchar, NULL, _FDEV_SETUP_WRITE );<br /><br />static void stdio_demo_func( void )<br />{<br />stdout = &amp;suart_stream;<br />printf( &quot;This output done with printf\n&quot; );<br />printf_P( PSTR(&quot;This output done with printf_P\n&quot;) );<br />}<br />#endif /* WITH_STDIO_DEMO */<br /><br /><br />int main(void)<br />{<br />char c;<br />static const char pstring&#91;&#93; PROGMEM =<br />&quot;adapted for Atmel AVR and this demo by Martin Thomas\r\n&quot;;<br />unsigned short cnt = 0;<br />#if (F_CPU &gt; 4000000UL)<br />#define CNTHALLO (unsigned int)(0xFFFF)<br />#else<br />#define CNTHALLO (unsigned int)(0xFFFF/3)<br />#endif<br /><br />softuart_init();<br />softuart_turn_rx_on(); /* redundant - on by default */<br /><br />sei();<br /><br />softuart_puts_P( &quot;\r\nSoftuart Demo-Application\r\n&quot; );    // &quot;implicit&quot; PSTR<br />softuart_puts_p( PSTR(&quot;generic softuart driver code by Colin Gittins\r\n&quot;) ); // explicit PSTR<br />softuart_puts_p( pstring ); // pstring defined with PROGMEM<br />softuart_puts( &quot;--\r\n&quot; );  // string &quot;from RAM&quot;<br /><br />#if WITH_STDIO_DEMO<br />stdio_demo_func();<br />#endif<br /><br />for (;;) {<br /><br />if ( softuart_kbhit() ) {<br />c = softuart_getchar();<br />softuart_putchar( '&#91;' );<br />softuart_putchar( c );<br />softuart_putchar( '&#93;' );<br />}<br /><br />cnt++;<br />if (cnt == CNTHALLO) {<br />cnt = 0;<br />softuart_puts_P( &quot; Hello &quot; );<br />}<br /><br />}<br /><br />return 0; <br />/* never reached */<br />}[/syntax].<br /><br />Otóż mam kilka pytań:<br /><br />1) Czy w trakcie modyfikacji nie wyciąłem za dużo?<br />2) Jak pozbyć się warninga w pliku softuart. <br />&quot;[ ISR(SOFTUART_T_COMP_LABEL) ]&quot;<br />3) Czy wystarczy pamięci na procedury ADC?<br /><br />Kompilacja mimo warninga pokazuje 818 bajtów pamięci flash 39,9 %, oraz 52 bajty zajętości pamięci SRAM co stanowi  40,6% zajętości. Może jakieś sugestie zoptymalizowania kodu?<br />Co przerzucić do eepromu?<br /><br />Na razie nie mam możliwości przetestowania układu w praktyce, więc działam po omacku. Będę wdzięczny za wszelkie sugestie i proszę o cierpliwość dla &quot;Zielonego&quot; MK<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5590">miremeryt</a> — 20 sty 2015, o 16:57</p><hr />
]]></content>
</entry>
</feed>