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

[Atmega32][C] TWI sprzętowe - problem

calasilyar 08 Lis 2010 22:15 1590 8
REKLAMA
  • #1 8719958
    calasilyar
    Poziom 11  
    Witam, chcę połączyć procesor ATMega32 z przetwornikiem C/A LTC1669 przez I2C.
    Niestety jest problem w komunikacji TWI. Procesor ustawiłem na częstotliwość 8MHz.

    Poniżej zamieszczam kod, byłbym wdzięczny za każdą sugestię, czemu TWI może nie działać... Jestem początkujący, a dzięki temu miałbym jakiś trop, gdzie szukać przyczyn.

    Funkcje:
    
    void TWI_inicjacja(void)
    {
      TWSR =0b00000000;    // Preskaler = 1  ->> TWPS1=0 TWPS0=0
      TWBR =0b00100000;
    } 
    
    void TWI_zapis(unsigned char adres,
                unsigned char command,
                unsigned char liczba1,
    	    unsigned char liczba2)
     {
      TWCR =(1 << TWINT) | (1 << TWSTA) | ( 1 << TWEN );
      while(!(TWCR & (1 << TWINT)));
      TWDR =adres;
      TWCR =(1 << TWINT) | (1 << TWEN);
      while(!(TWCR & (1 << TWINT)));
      TWDR =command;
      TWCR =(1 << TWINT) | (1 << TWEN);
      while(!(TWCR & (1 << TWINT)));
      TWDR =liczba1;
      TWCR =(1 << TWINT) | (1 << TWEN);
      while(!(TWCR & (1 << TWINT)));
      TWDR =liczba2;
      TWCR =(1 << TWINT) | (1 << TWEN);
      while(!(TWCR & (1 << TWINT)));
      TWCR =(1 << TWINT) | (1<<TWEN) | (1<<TWSTO);
    } 
    
    


    main:
    
    #define F_CPU 8000000UL  // 8 MHz
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <stdio.h>
    #include <util/delay.h>
    #include <string.h>
    #include "lcd.h"
    #include "twi.h"
    
    //RS PC5
    //RW PC6
    //E  PC7
    //DATA PA
    
    int main(void){
    
    /* wyłączenie interfejsu JTAG */
    MCUCSR |= (1<<JTD);
    MCUCSR |= (1<<JTD);
    
    /* deklaracja we/wy */
    DDRA = 0xff; // porty A i B jako wyjscia
    PORTA = 0x00;
    DDRC = 0xff;
    PORTC &= 0x1f;
    
    DDRD = 0x00; // port D jako wejscie
    PORTD = 0xff; // pull-up
    
    
    /* LCD */
    
    while(1)
    {
    	/* wyciąłem nie związane rzeczy */
    
    	// wysłanie za pomocą TWI wartości do DAC
    	TWI_inicjacja();
    	TWI_zapis(0x40, 0x00, 0xff, 0xff);
    
    delay_ms(1000);
    }
    
    return 0;
    }
    


    Z góry dzięki za odzew!

    #edit
    ramka do wysłania do przetwornika:
    [start][adres slave'a][Wr=0][Ack][bajt komend=0x00][Ack][młodszy bajt danych][Ack][Starszy bajt danych][Ack][stop]
  • REKLAMA
  • #2 8720009
    tadzik85
    Poziom 38  
    A komenda gdzie?
  • REKLAMA
  • #4 8720095
    tadzik85
    Poziom 38  
    Ja tam w dokumentacji widzę 4 bajtową ramkę danych:
    adres, komenda, 2 bajty danych. Wycofuje bo poprawiłeś.
  • REKLAMA
  • #5 8720127
    calasilyar
    Poziom 11  
    nom, walnąłem wielbłąd, ale poprawiłem i nic to nie zmieniło :/ ciągle 0-1 miliwolt na wyjściu :/
  • #6 8720182
    tadzik85
    Poziom 38  
    Za duża prędkość jeśli dobrze liczę.
  • REKLAMA
  • #7 8720275
    calasilyar
    Poziom 11  
    Prędkość według moich obliczeń wychodzi ok, bo 100kHz (chyba że się mylę...)

    $$SCL-freq = \frac{8000kHz}{16+2\cdot 32 \cdot 4^{0}} = \frac{8000kHz}{16+64}=\frac{8000kHz}{80}=100kHz$$

    a max prędkość to 400kHz, więc powinno pasować. Czyżby to było źle?
  • #8 8720803
    tadzik85
    Poziom 38  
    Ja z dokumentacji odczytuje max 100kHz. Połączenie przetwornika masz ok? Pull-upy są na liniach? Piny adresowe poprawnie podłączone?
  • #9 8752940
    calasilyar
    Poziom 11  
    Okazało się, że problem tkwił w pull-upach. Przyjąłem je sobie na wiarę, a należało obliczyć ich wartość z wzoru. Problem rozwiązany.
REKLAMA