abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×

včera 16:22 | Nová verze

Byla vydána verze 0.11.0 softwaru pro statistickou analýzu dat GNU PSPP (Wikipedie), svobodné alternativy k proprietárnímu softwaru IBM SPSS Statistics (Wikipedie). Vedle několika vylepšení a oprav chyb jsou řešeny také 2 bezpečnostní chyby CVE-2017-10791 a CVE-2017-10792. O týden později byla vydána verze 1.0.0 přinášející pouze aktualizaci překladů. Proč verze 1.0.0 a ne například 0.11.1? Dle vývojářů jsou důvody následující:

… více »
Ladislav Hagara | Komentářů: 0
včera 10:35 | Komunita

Na blogu Oracle se objevila zpráva o tom, že plánovaná verze Java EE 8 bude uvolněna jako open source (referenční implementace a compatibility kit). V současné době je uvolněna jen Java SE (standard edition) pod licencí GPLv2 v podobě OpenJDK (Open Java Development Kit), kterou začal v roce 2006 uvolňovat Sun.

Max | Komentářů: 4
21.8. 23:55 | IT novinky

Google na YouTube oficiálně představil Android 8.0 Oreo. Přehled novinek v příspěvku na blogu věnovaném vývojářům.

Ladislav Hagara | Komentářů: 30
21.8. 16:44 | Zajímavý článek

Po téměř 3 měsících od vydání třetího čísla publikoval Michal Špaček na svých stránkách čtvrté číslo newsletteru věnovanému bezpečnosti, bezpečnému vývoji převážně webových aplikací a bezpečnosti uživatelů. Jedná se současně o číslo poslední: "Nepíše se mi to lehce, a trvalo to, než jsem to ze sebe dostal, ale tohle je poslední newsletter v této podobě. Ani jsem ho nestihl pojmenovat a už jsem ho zabil. Nezbývá mi tolik času, abych každou událost, novinku a změnu v prohlížeči detailně popisoval tak, jak bych v newsletteru chtěl, mrzí mě to".

Ladislav Hagara | Komentářů: 2
21.8. 07:00 | Nová verze

Byla vydána diaspora* ve verzi 0.7.0.0. Jedná se o svobodný software, který slouží jako osobní webový server pro poskytování služeb sociální sítě (Wikipedie). Přehled novinek v příspěvku na blogu a na GitHubu. Sociální síť diaspora* byla před pěti lety předána komunitě.

Ladislav Hagara | Komentářů: 0
21.8. 06:00 | IT novinky

Společnost Hardkernel stojící za jednodeskovými počítači ODROID představila na YouTube minipočítač určený pro domácí cloud ODROID-HC1 vycházející z ODROID-XU4. Minipočítač s kovovou krabičkou, do které stačí vložit 2 a půl palcový disk, lze koupit za 49 dolarů. ODROID-HC1 je stohovatelný.

Ladislav Hagara | Komentářů: 39
20.8. 16:22 | Nová verze

Byl vydán DB Browser for SQLite (sqlitebrowser) ve verzi 3.10.0. Nejnovější stabilní verze této grafické nadstavby nad relačním databázovým systémem SQLite (Wikipedie) přináší například integraci s DBHub.io, tj. platformou pro sdílení SQLite databází. Podrobnosti na GitHubu.

Ladislav Hagara | Komentářů: 2
20.8. 08:00 | IT novinky

Andy Rubin, spoluzakladatel společnosti Android, jež byla v roce 2005 koupena Googlem, nyní CEO společnosti Essential Products, oznámil předprodej chytrého telefonu Essential. Telefon se začne rozesílat 1. září. Cena telefonu je 699 dolarů. Cena telefonu současně s 360° kamerou s rozlišením 4K byla stanovena na 749 dolarů. Kameru, v budoucnu i další příslušenství, lze k telefonu připojit pomocí konektoru s magnety.

Ladislav Hagara | Komentářů: 1
19.8. 13:44 | Zajímavý software

Evropská komise vydala novou verzi 1.4.0.1 svého open source v Javě naprogramovaného softwaru pro online průzkumy EUSurvey. Online dotazníky lze vytvářet na stránkách Evropské komise nebo si lze software stáhnout (zip a war) a nainstalovat lokálně. Zdrojové kódy jsou k dispozici pod licencí EUPL (European Union Public Licence).

Ladislav Hagara | Komentářů: 0
18.8. 23:55 | Komunita

Ubuntu 17.10 (Artful Aardvark) bude ve výchozím stavu zobrazovat Dok (Launcher). Jedná se o rozšíření GNOME Shellu Ubuntu Dock. To bylo forknuto z rozšíření Dash to Dock. Ukázka na YouTube [reddit].

Ladislav Hagara | Komentářů: 8
Těžíte nějakou kryptoměnu?
 (5%)
 (2%)
 (18%)
 (76%)
Celkem 374 hlasů
 Komentářů: 21, poslední 13.8. 09:57
    Rozcestník

    Dotaz: Avr-gcc I2C

    20.6.2009 15:54 agc
    Avr-gcc I2C
    Přečteno: 1748×

    Stáhl jsem si TWI(i2c) master kód pro atmega16 http://www.atmel.com/dyn/resources/prod_documents/AVR315.zip a USI(i2c) slave kód pro attiny2313  http://www.atmel.com/dyn/resources/prod_documents/AVR312.zip. Upravil jsem ho pro použití v avr-gcc a úspěšně rozchodil "bajtovou" komunikaci. Potřeboval bych ale přenášet několik bajtů za sebou jako příkaz/text. Nevím jak mám ten kód upravit.

     

    UKÁZKY:

     master kód:

    messageBuf[0] = (TWI_targetSlaveAddress<<TWI_ADR_BITS) | (FALSE<<TWI_READ_BIT); // The first byte must always consit of General Call code or the TWI slave address.

    messageBuf[1] = TWI_CMD_MASTER_WRITE; // The first byte is used for commands.

    messageBuf[2] = 'A'; // The second byte is used for the data.
    messageBuf[3] = 'C';
    messageBuf[4] = 'T';
    messageBuf[5] = 'I';
    messageBuf[6] = 'V';
    messageBuf[7] = 'E';

    TWI_Start_Transceiver_With_Data( messageBuf, 8 );

    Takto to šlo zkompilovat bez problémů. Otázka zní: přenese se to a bude to na slave čitelné? Dále jak to mám na slave přečíst? Takto to nefunguje, což je celkem jasné:

    temp = USI_TWI_Receive_Byte();
    if (temp=="ACTIVE") { bitSet (PORTB, 0); }

    Nejspíš porovnávám neporovnatelné datové typy a umístění v paměti. Zde je funkce starající se o příjem:
    unsigned char USI_TWI_Receive_Byte( void )

    {

    unsigned char tmptail;

    unsigned char tmpRxTail; // Temporary variable to store volatile

    tmpRxTail = TWI_RxTail; // Not necessary, but prevents warnings

    while ( TWI_RxHead == tmpRxTail );

    tmptail = ( TWI_RxTail + 1 ) & TWI_RX_BUFFER_MASK; // Calculate buffer index

    TWI_RxTail = tmptail; // Store new index

    return TWI_RxBuf[tmptail]; // Return data from the buffer.

    }

    Jak mám ten text "ACTIVE" přečíst? Nedokážu napsat funkci která pozná začátek a konec spojité komunikace a dokáže to spojit/přečíst.

    Odpovědi

    21.6.2009 15:02 agc
    Rozbalit Rozbalit vše Re: Avr-gcc I2C
    Přílohy:

    Přikládám původní neupravené kódy pro master a slave. Na USI slave mohu bez problémů přečíst znak po znaku, ale nevím jak ohlásit začátek a konec komunikace. Vypadá to, že už tam nějaké ACK NACK nastavené jsou, ale moc se v tom neorientuji. Prosím poraďte co s tím.

    21.6.2009 17:33 VSi | skóre: 28
    Rozbalit Rozbalit vše Re: Avr-gcc I2C

    Nenapíšu vám teď přesné řešení, ale alespoň naznačím, jak na to:

    TWI knihovny jsou dost nízkoúrovňové, takže, jak asi i chápete, je možné s nimi pracovat na úrovni bajtů - ne "příkazů". Musíte si tedy vytvořit nějaký jednoduchý protokol, kterým z toho proudu bajtů vyberete příkazy. V nejjednodušší podobě stačí jen nějak rozlišit konec příkazu - obvykle se to dělá nulovým bytem: messageBuf[konec] = 0;

    Na SLAVE straně si pak vytvoříte v paměti nějaký buffer, pro jednoduchost o pevné velikosti (to bude max. délka příkazu), a příchozí znaky do něj budete ukládat, dokud nebude plný nebo dokud nepřijde znak s hodnotou 0. Obsah bufferu pak můžete třeba porovnávat s nějakou tabulkou uloženou v PROGMEM. Pak si nastavíte pozici v bufferu na 0 a můžete přijímat další příkaz. Takto jsem řešil komunikaci přes sériový port, což je podobná situace, jen se obvykle jako koncový používá znak nového řádku (LF).

    Ta tabulka může vypadat třeba takhle (ale to berte už jako rozšířené řešení):

    typedef void (*pt2call)();
    
    struct trm_cmdtab_record {
      char cmd[7];
      pt2call callback;
    };
    
    struct trm_cmdtab_record RX_CMD_TAB[] PROGMEM = {
      { "fs",   &cmd_stor },
      { "d",    &cmd_dump },
      { "cfg",  &cmd_sysconfig },
      { "eepr", &cmd_eep_rd_byte },
      { "eepw", &cmd_eep_wr_byte },
      { "reg",  &cmd_reg },
      { "pwm",  &cmd_pwm },
      { "op",   &cmd_operation }
    };
    
    
    21.6.2009 21:12 snup
    Rozbalit Rozbalit vše Re: Avr-gcc I2C

    Tak jsem si to upravil a zdá se že funguje. Na slave všechno OK:

        if( USI_TWI_Data_In_Receive_Buffer() )     {
            temp = USI_TWI_Receive_Byte();
            i=TWI_BUFFER_SIZE-1;
            while(i>0) {
                    TWI_buffer[i]=TWI_buffer[i-1];
                    i--;
            }
            TWI_buffer[0]=temp;
            if (TWI_buffer[0]=='\n') {
                i=TWI_BUFFER_SIZE;
                while(i>0) {
                    DATA_buffer[i-1]=TWI_buffer[i];
                    TWI_buffer[i]=0;
                    i--;
                }
                TWI_buffer[0]=0;
            }
        }

     

    Na master taky funguje, ale kompilátor hlásí problém:

    main.c: In function ‘eI2Cwritestr’:
    main.c:222: warning: passing argument 1 of ‘TWI_Start_Transceiver_With_Data’ discards qualifiers from pointer target type

     

    // priprava bufferu pro i2c
    void I2C_bufferFill(char *sss){
        unsigned char k;
        while ((k=(*sss++))) {
            messageBuf[bufferPos]=k;
            bufferPos++;
            if (bufferPos>MESSAGEBUF_SIZE) bufferPos--;
        }
        if (bufferPos<=MESSAGEBUF_SIZE) messageBuf[bufferPos]='\n';
    }

    // poslani prikazu
    void eI2Cwritestr(char *data){
        unsigned char TWI_targetSlaveAddress;
        TWI_targetSlaveAddress   = 0x10; // adresa MCU pro ovladani motorku
        messageBuf[0] = (TWI_targetSlaveAddress<<TWI_ADR_BITS) | (FALSE<<TWI_READ_BIT); // The first byte must always consit of General Call code or the TWI slave address.
        messageBuf[1] = TWI_CMD_MASTER_WRITE;             // The first byte is used for commands.
        bufferPos=2;
        I2C_bufferFill(data);
        TWI_Start_Transceiver_With_Data( messageBuf, (bufferPos+1) );
    }

     

    v main uz je jen eI2Cwritestr("ACTIVE");

     

    messageBuf je definována jako volatile unsigned char

     

    V čem je problém?

    22.6.2009 15:27 agc
    Rozbalit Rozbalit vše Re: Avr-gcc I2C

    Nikdo neporadí?

    23.6.2009 00:00 agc
    Rozbalit Rozbalit vše Re: Avr-gcc I2C

     

    24.6.2009 10:00 Tomáš
    Rozbalit Rozbalit vše Re: Avr-gcc I2C

    Pokud je messageBuf opravdu deklarován jako volatile unsigned char messageBuf; , tak se divím, že vám konstrukce messageBuf[1] = projde. A řekl bych, že je definována asi jinak. Až se ujistíme jakého je typu, pak se můžeme bavit o tom implicitním přetypování, který se pro první parametr TWI_Start_Transceiver_With_Data bude dělat.

    Můžu jen hádat, že je deklarovaná jako volatile unsigned char messageBuf[MESSAGEBUF_SIZE];. To co se strácí je příznak volatile. Funkce  TWI_Start_Transceiver_With_Data může pak dávat úplně špatné výsledky, díky tomu, že se jí mění data pod rukama.

    24.6.2009 17:57 agc
    Rozbalit Rozbalit vše Re: Avr-gcc I2C

    Jak mám definovat proměnou messageBuf, když jí používám v mnoha funkcích a potřebuju aby měla pořád stejnou hodnotu?

    25.6.2009 11:29 Tomáš
    Rozbalit Rozbalit vše Re: Avr-gcc I2C

    Doufám, že jsem vaši otázku správně pochopil. Pokud ne,tak následující odpověď je úplně mimo. Předpokládám, že nechcete aby proměná měla pořád stejnou hodnotu, ale aby byla proměná viditelná z různých funkcí.

    Pokuď chcete aby proměná byla viditelná z mnoha funkcí, tak ji nadeklarujte mimo funkci. Např:

    .c:

    static unsigned char foo[100]; /* static = viditelnost jen v rámci současného souboru */
    void write_foo_masterheader(char c) { foo[0]=c; }
    void write_foo_subheader(char c) { foo[1]=c; }
    

     

    Pokud chcete aby byla viditelná i mezi různými moduly ( zdrojovými soubory ), tak ji deklarujte v .h jako extern a v jednom z modulů ji nadeklarujte jako globální (non static).

    .h:

    extern unsigned char foo[100];
    

     

    .c:

    unsigned char foo[100];
    

     

    Pokud, ale to proměné typu pole hodláte zapisovat z různých vláken, tak se budete muset začít zabývat nějakou synchronizací pomocí semaforů/mutexů. To je ale na delší povídání.

    24.6.2009 01:51 agc
    Rozbalit Rozbalit vše Re: Avr-gcc I2C

    Podle všeho to varování znamená že ztrácím nějakou jednoznačnou definici. Kdyby tam bylo const, tak to chápu, ale co tady ztrácím?

    4.7.2009 16:50 agc
    Rozbalit Rozbalit vše Re: Avr-gcc I2C

    Tak už mám komunikaci master>slave vyřešenou. Potřeboval bych ale pomoci se slave>master komunikací. Pokud to správně chápu, tak nejdříve master musí poslat žádost o data a až potom může slave komunikovat. Jak se ale dozví slave, kdy může začít přenos? Pomocí tohoto kódu si master chystá asi komunikaci:

     

              if (TWI_operation == REQUEST_DATA)
              { // Request/collect the data from the Slave
                messageBuf[0] = (TWI_targetSlaveAddress<<TWI_ADR_BITS) | (TRUE<<TWI_READ_BIT); // The first byte must always consit of General Call code or the TWI slave address.
                TWI_Start_Transceiver_With_Data( messageBuf, 2 );       
                TWI_operation = READ_DATA_FROM_BUFFER; // Set next operation        
              }
              else if (TWI_operation == READ_DATA_FROM_BUFFER)
              { // Get the received data from the transceiver buffer
                TWI_Get_Data_From_Transceiver( messageBuf, 2 );
                if(messageBuf[1]=='A') bitClear (PORTB, 0);        // Store data on PORTB.
                TWI_operation = FALSE;        // Set next operation        
              }

     

    Slave má ale jen pro přenos dat příkaz USI_TWI_Transmit_Byte. Jak tedy komunikace probíhá?

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.