• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Konflikt bibliotek softwareserial z PCF8574
#6
W sumie uzywać biblioteki aby transmitować dwa bajty po I2C? Nie szybciej było napisać ten fragment kodu zamiast szukać biblioteki wątpliwej jakości?
Wysłanie bajtu po I2C w AVR mega:
Kod:
//----------------------------------------------------------------------//
byte TWI_Write( byte d )
{
    TWDR = d;
    return( TWI_Action( 0 ) );
}
Porównaj to do tego co robią biblioteki, które w dodatku się wieszają. Cała obsługa PCF to zapis:
Kod:
TWI_Start();
TWI_Write( adres_pcf_da_zapisu );
TWI_Write( dana )
TWI_Stop();
i odczyt:
Kod:
TWI_Start();
TWI_Write( adres_pcf_do_odczytu );
dana = TWI_Read(  false );
TWI_Stop();
Naprawdę potrzeba biblioteki?

Pozostałe potrzebne funkcje obsługi I2C bez ograniczeń w arduino są podobnie banalne
Kod:
byte TWI_Read( byte ack )
{
    if ( ack ) TWI_Action( 1<<TWEA );
    else TWI_Action( 0 );

    TWI_Status = TWSR;
    return( TWDR );
}


byte TWI_Start()
{
    return( TWI_Action( 1<<TWSTA ) );
}

byte TWI_Stop()
{
byte overtime=100;


    TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
    // Generując stop czekamy na bit TWSTO a nie WTINT
    while ( (TWCR & (1<<TWSTO)) )
        {
        _delay_us(10);
        overtime--;
        if ( !overtime ) break;
        }
    return( TWSR );
}


void TWI_Master_Initialise()
{
    TWI_Master_Off();

    //SCL frequency CPU Clock frequency / ( 16 + 2(TWBR) + 4 · TWPS ) TWPS = PRESKALER
    //F_CPU/(16+2*TWBR+4*(TWSR&3))
    // TWBR min 10
    TWBR = ((F_CPU/1000/TWISCK)-16)/2;            // TWISCK - CLK w kHz
    TWCR = (1<<TWEN);        // Enable TWI-interface and release TWI pins.
}
i działa ponowny start w przeciwieństwie do bibliotek arduino, nie ma ograniczenia liczby danych do 32. Do tego wszystkiego potrzebna funkcja:
Kod:
byte TWI_Action( byte command )
{
byte overtime=100;


    //write command to TWCR and make sure TWINT is set
    TWCR = (command | (1<<TWINT) | (1<<TWEN) );
    //now wait for TWINT to be set again (when the operation is completed)
    while( !(TWCR & (1<<TWINT)) )
        {
        _delay_us(10);
        overtime--;
        if ( !overtime ) break;
        }
/*
Istnieją dwa kody stanu, które nie odpowiadają określonym stanie TWI, patrz tabela 120.

Stan 0xF8 wskazuje, że żadne istotne informacje są dostępne ponieważ TWINT Flag
nie jest ustawiona. Dzieje się tak gdy TWI nie jest zaangarzowany w transfer.
Jeśli status F8 pojawia się po wysłaniu warunku statt, może to oznaczać uszkodzenie magistrali IIC (zwarcie lub brak rezystorów podciągających).

Stan 0x00 oznacza, że wystąpił błąd magistrali IIC.
Błąd występuje, gdy START lub STOP pojawił się w nieodpowiednim miejscu najczęściej podczas nielegalnego przejęcia magistrali.
Gdy wystąpi błąd magistrali (w trybie Slave), należy wyserować TWSTO i ustawiC TWINT.
TWI nie wygeneruje nic na magistrali ale zwolni linie.
*/
    TWI_Status = TWSR & 0b11111100;
    return( TWI_Status );
}
Kod z delay to nie kod, to DEMO!
Możliwości sprzętowe uC trzeba wykorzystywać a nie /machać/. GPIO!
Jestem a usilnie chcę być amatorem to dwie różne rzeczy.

http://er-mik.prv.pl/projekty edw.php 
http://er-mik.prv.pl/projekty_avt.php
 
Odpowiedź
  


Wiadomości w tym wątku
RE: Konflikt bibliotek softwareserial z PCF8574 - przez MERASerwis - 18-02-2020, 10:35

Skocz do:


Przeglądający: 1 gości