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

[ATmega644][C] TWI/I2C - komunikacja z STA015

ePeter1234 02 Kwi 2009 00:47 2317 12
REKLAMA
  • #1 6364823
    ePeter1234
    Poziom 18  
    Witam!!!

    Szukałem już wszędzie, ale nie znalazłem rozwiązania mojego problemu. Próbuję napisać podprogram do wysyłanie rozkazów do STA015 przez TWI. Znalazłem kilka gotowych rozwiązań (nota katalogowa ATmegi i internet). Problem polega na tym, że program nie działa i nie wiem co jest grane. Kod wygląda następująco:

    twi.c
    
    #include "twi.h"
    
    
    void twi_start(void)
    {
    	TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
    	while (!(TWCR & (1<<TWINT)));
    }
    
    void twi_send(char twi_data)
    {
    	
    	TWDR = twi_data;
    	TWCR = (1<<TWINT)|(1<<TWEN);
    	
    	while (!(TWCR & (1<<TWINT)))
    	{
    	}
    	
    }
    
    char twi_recive(char twi_ack)
    {
    
    	TWCR = twi_ack
    	?((1<<TWINT)|(1<<TWEN)|(1<<TWEA))
    	:((1<<TWINT)|(1<<TWEN));
    	
    	while (!(TWCR & (1<<TWINT)));
    	
    return TWDR;
    }
    
    void twi_stop(void)
    {
    
    	TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
    	
    	while ((TWCR & (1<<TWSTO)));
    }
    
    

    twi.h
    
    #include <avr/io.h>
    
    #ifndef TWI_H
    
    #define TWI_H
    void twi_start(void);
    void twi_send(char twi_data);
    void twi_stop(void);
    char twi_recive(char twi_ack);
    #endif
    

    main.c
    
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    #include <avr/signal>
    
    char twi_data;
    char twi_ack;
    char spi_data;
    
    
    int main(void)
    {
    
    DDRB = 0xff;
    PORTB = 0x00;
    DDRC = 0xff;
    PORTC = 0x00;
    DDRD = 0xff;
    PORTD = 0x00;
    
    	twi_start();
                twi_send(0x43);																			
    	twi_send(0x01);
    	twi_start();
    	twi_send(0x43);
    	if (twi_recive(twi_ack)==0xAC)
    	{
    		PORTA = (1<< PORTA5);
    	}
    	else
    	{
    		PORTA = (1<< PORTA4);
    	}
    	twi_stop();
    while (1);
    	
    	
    	
    
    return 0;
    }
    


    Po wgraniu programu do procka nic się nie dzieje. Sprawdziłem program w AVR Studio i program zawiesza się w miejscu gdzie sprawdza warunek czy komenda START została wysłana czyli na pętli while. nie wystawia się bit TWINT po skończeniu transmisji. PortC też milczy. nic się na nim nie dzieje. Dodam, że procek jest sprawny (jeden i drugi). Co może być nie tak?? Proszę o pomoc w rozwiązaniu problemu.
  • REKLAMA
  • REKLAMA
  • #3 6366694
    ePeter1234
    Poziom 18  
    Problem nieststy leży ni e w tym miejscu:) Ten problem już porawięłm, chodzi o to, że prock nie dokańcza nawet intrukcji START. :( HELP!!!
  • #5 6368101
    ePeter1234
    Poziom 18  
    Te biblioteki już widziałem i na ich podstawie i datasheet'a zrobiłęm włąsne. Jak by tak je przeanalizować, to wychodzi że się niczym nie różnią. Problem nieststy lezy nie w tym miejscu :(
  • REKLAMA
  • #6 6368162
    dawid512
    Poziom 32  
    A rezystory podciągające są?
  • REKLAMA
  • #7 6373428
    ePeter1234
    Poziom 18  
    Tak, są podciągnięte do zasilania. Rezystory mają wartość 3,3k Ohm. cały czas na SDL mam stan wysoki, a na SCL nic się nie dzieje:(
  • #9 6373627
    ePeter1234
    Poziom 18  
    Czy ustawiam porty jako wejścia czy wyjścia to nie ma znaczenia:( Dalej nie działa. Zauważyłem, że podczas kompilacji programu wywala mi ostrzeżenia:

    warning: implicit declaration of function twi_start
    warning: implicit declaration of function twi_send
    warning: implicit declaration of function twi_stop

    Może tu jest problem??

    Zauważyłem, że gdy testuje poprawność kodu w AVR Studio program dochodzi do podrprogramu twi_start i w miejscu gdzie ma wystawić jedynki na bitach TWINT, TWSTA i TWEN to wystawia tylko bity TWSTA, TWEN. Następnie przechodzi do linijki gdzie oczekuje na wysłanie rozkazu start i wystawienia jedynki na bicie TWINT. W tym miejscu program stoi bo ile by nie czekać to bit TWINT nigdy nie jest jedynką:( Nie wiem czy może jeszcze mam jakieś przerwania odpalić czy co??
  • #10 6373713
    Freddie Chopin
    Specjalista - Mikrokontrolery
    ePeter1234 napisał:
    Czy ustawiam porty jako wejścia czy wyjścia to nie ma znaczenia:(

    Daleki jestem od twierdzeń, że kierunek portów nie ma znaczenia.

    Cytat:

    Dalej nie działa.

    Bo pozatym jest coś jeszcze.

    Cytat:

    Zauważyłem, że podczas kompilacji programu wywala mi ostrzeżenia:

    Nie ma w tym nic dziwnego, skoro nie zrobiłeś nagłówka dla pliku z dodatkowymi funkcjami i nie dołączyłeś go do pliku który ich używa.

    Cytat:

    Może tu jest problem??

    Mało prawdopodobne.

    Cytat:

    Zauważyłem, że gdy testuje poprawność kodu w AVR Studio program dochodzi do podrprogramu twi_start i w miejscu gdzie ma wystawić jedynki na bitach TWINT, TWSTA i TWEN to wystawia tylko bity TWSTA, TWEN.

    Proponuję więc zauważyć, co datasheet ma do powiedzenia na temat bitu TWINT.

    Cytat:

    Nie wiem czy może jeszcze mam jakieś przerwania odpalić czy co??

    Nigdzie nie ustawiasz baudrate'a i prescalera - czyli dostajesz max jaki jest możliwy (FCPU/16).

    4\/3!!
  • #11 6373747
    ePeter1234
    Poziom 18  
    Cytat:
    
    Czy ustawiam porty jako wejścia czy wyjścia to nie ma znaczenia:(
    
    
    Daleki jestem od twierdzeń, że kierunek portów nie ma znaczenia.
    


    Chodziło mi o to, że jak port ustawie jako wejście czy wyjście to i tak program nie działa:) Co do Bitu TWINT to wiem, zę jest on wystawiany dopiero wtedy gdy transmisja TWI zostanie zakończona. Pytanie jest takiem jak usunąć te warningi?? Bo szukam i nie moge znaleść odp.
  • Pomocny post
    #12 6373883
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Freddie Chopin napisał:

    Nie ma w tym nic dziwnego, skoro nie zrobiłeś nagłówka dla pliku z dodatkowymi funkcjami i nie dołączyłeś go do pliku który ich używa.

    Dlaczego muszę się powtarzać?

    4\/3!!
  • #13 6374111
    ePeter1234
    Poziom 18  
    Dodałem plik nagłówkowy do main.c. Teraz kompiluje się bez błędów i ostrzeżeń. Jednak nadal transmisja nie działa:(

    Dodano po 2 [godziny] 10 [minuty]:

    W końcu udalo się TWI działa :D po pierwsze problem leżał w ostrzeżeniach które pojawiały sie podczas kompilacji. Po drugie, to poprawilem luty na plytce i zaskoczylo :D Dziękuję wszytkom za pomoc
    Zamykam temat
REKLAMA