logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Zawieszanie się PCF8574 przy niskim stanie na P7 (noga 12) z ATMEGA8

Mad Bekon 19 Mar 2005 11:18 1695 5
REKLAMA
  • #1 1328382
    Mad Bekon
    Poziom 23  
    Posty: 794
    Pomógł: 31
    Ocena: 36
    Mam taki problem....

    Gdy wyjście P7(noga 12) ustawie w stan niski to PCF albo uC mi się wiesza.

    Sprawdzałem połączenia, są ok. Przypuszczam ze jakiś błąd w programie, ale nie mogę się doszukać. Zamiszczam program pod ATMEGA8.
    Zczytuję stan wejść w ten sposób:

    while(1){
    unsigned char c=PCF8574_get_inputs(0);

    USART_Transmit(c);
    }
    działa zawsze o ile na nodze P7 jest stan wysoki.
    Załączniki:
    • pcf8574.c (1.98 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • REKLAMA
  • #3 1344562
    Mad Bekon
    Poziom 23  
    Posty: 794
    Pomógł: 31
    Ocena: 36
    Doszedłem to tego że to napewno nie wina PCF'a, bo podlaczajac go do Portu Com w PC sprawdziłem ze działa dobrze i się nie zawiesza.

    Procedura PCF8574_set_oputputs() też jest dobra, też nie zawiesza nic, mimo zmiany wyjścia 7 z 1 na 0 i odwrotnie. Wina zatem musi leżeć w procedurze PCF8574_get_inputs().

    #include <avr/io.h>
    #include <avr/rs232.h>
    #define F_CPU 11059200
    #include <avr/delay2.h>
    
    unsigned char pcf8574_get_inputs ()
    {
    	TWBR = 0x10;
    	TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
    	while (!(TWCR & (1<<TWINT)));
    	TWDR = 0b01000001;
    	TWCR = (1<<TWINT) | (1<<TWEN);
    	while (!(TWCR & (1<<TWINT)));
    	TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN);
    	while (!(TWCR & (1<<TWINT)));
    	unsigned char input = TWDR;
    	TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN);	
    	return input;
    }
    
    
    void pcf8574_set_outputs (unsigned char byte)
    {
    	TWBR = 0x10;
    	TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
    	while (!(TWCR & (1<<TWINT)))	;
    	TWDR = 0b01000000;
    	TWCR = (1<<TWINT) | (1<<TWEN);
    	while (!(TWCR & (1<<TWINT)));
    	TWDR = byte;
    	TWCR = (1<<TWINT) | (1<<TWEN);
    	while (!(TWCR & (1<<TWINT)));
    	TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN);	
    }
    
    int main()
    {
    
    USART_Init(5);
    DDRC=0;
    DDRB=0;
    
    while(1)
    {
    
    USART_Transmit(pcf8574_get_inputs());
    delayms(100);
    }
    
    return 0;
    }
    
    

    przy zmianie stanu z jeden na 0, na nodze 7 PCF'a transmisja ustaje a program zapętla się na: while (!(TWCR & (1<<TWINT)));

    Co jest źle? Co może być przyczyną?!?
  • REKLAMA
  • #4 1346225
    Mad Bekon
    Poziom 23  
    Posty: 794
    Pomógł: 31
    Ocena: 36
    Czasami mam wrażenie, że na tym forum trzeba sobie samemu odpowiadać.

    Pomogłą zmiana 1<<TWEN na 0<<TWEN przy STOPie transmisji.
    Dziwne bo w specyfikacji ATMEGI było podane ze ma byc 1<<TWEN. Ale to nie mój problem. Działa.
  • REKLAMA
  • #5 1346320
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    0<<TWEN = 0 ...
    Logiczne, że po stopie transmisji odłączamy się od magistrali, jeżeli nie ponawiamy startu...
    Light-I
REKLAMA