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

AVR "C" TWI SLAVE 2x ATMEGA8

28aug240 19 Maj 2009 19:21 1129 0
REKLAMA
  • #1 6549881
    28aug240
    Poziom 14  
    Witam

    Z braku weny poprzeglądałem forum i znalazłem następujący kod:

    #include "lib/t6963c.c"
    #include <compat/twi.h>
    #include "lib/change_numbers.c"
    #include <avr/interrupt.h> 
    #include <avr/signal.h> 
    
    #define AVR_addr_R 0x18 
    volatile unsigned char buf_TWI[9]; 
    unsigned char *pbuf_TWI; 
    unsigned char temp_kotla, temp_CWU, i; 
    //___________________________ 
    void TWI_init(void) 
    { 
     TWAR=AVR_addr_R; 
     TWBR=10; 
     TWCR=(1<<TWEA)|(1<<TWEN)|(1<<TWIE)|(1<<TWINT); 
    } 
    //___________________________ 
    void AVR_wyslij(unsigned char lb_dane) 
    { 
     cli();                                 // zablokowanie zezwolenia na przerwania 
      
     if(TW_STATUS != TW_ST_SLA_ACK)               // sprawdzenie czy ukłąd mastera wysłał prawidłowy adres Slave'a 
      { 
       goto KONIEC;                           // jeśli nie to błąd i wyjście z procedury 
      } 
     pbuf_TWI=&buf_TWI; 
      
     for(;(lb_dane-1)!=0;lb_dane--) 
      { 
       TWDR=*pbuf_TWI++;                     // przeniesienie danej która ma zostać wysłana z bufora TWI do bufora wysyłającego 
       TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN);         // odpowiednie ustawienie lini sterujących 
       while(!(TWCR & (1<<TWINT)));               // oczekiwanie na koniec transmisji 
       if(TW_STATUS !=TW_ST_DATA_ACK) 
        { 
         goto KONIEC; 
        } 
      } 
      
     TWDR=*pbuf_TWI; 
     TWCR=(1<<TWINT)|(1<<TWEN); 
      
     while(!(TWCR & (1<<TWINT))); 
    
     TWCR=(1<<TWEA)|(1<<TWEN)|(1<<TWIE)|(1<<TWINT); 
     sei(); 
     KONIEC: 
     sei(); 
    } 
    
    
    
    
    //__________________________ 
    SIGNAL (SIG_2WIRE_SERIAL) 
    { 
     AVR_wyslij(1); 
    // buf_TWI[0]+=1;       // w ten sposób działa 
    } 
    //__________________________ 
    int main(void)     //program główny 
    { 
    
    	DDRB|=_BV(0);
     int przerwa=500;
     TWI_init(); 
     sei(); 
     buf_TWI[0]=10;       // jakas wartość poczatkowa 
    
    while(1) 
    { 
    
    PORTB |= _BV(0);
    _delay_ms(przerwa);
    PORTB &= ~_BV(0);
    _delay_ms(przerwa);
    
     buf_TWI[0]++;
    } 
    
    } 


    program działa master otrzymuje odpowiednie dane ....
    tylko jak mam do tego dodać zapis z mastera ?
    kombinowałem jak koń pod górę i nic z tego....

    Dodano po 5 [godziny] 3 [minuty]:

    Ok dałem sobie radę

    to procedura odczytu z mastera:
     if(TW_STATUS == TW_SR_SLA_ACK)               // sprawdzenie czy ukłąd mastera wysłał prawidłowy adres Slave'a do zapisu 
      { 
        TWCR=(1<<TWINT)|(1<<TWEN); 
        while(!(TWCR & (1<<TWINT))); 
        odebralem=TWDR;
        TWCR=(1<<TWEA)|(1<<TWEN)|(1<<TWIE)|(1<<TWINT); 
      }
    



    TEMAT ZAMKNIĘTY
  • REKLAMA
REKLAMA