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

Mcp41100 i Atmega, po co w kodzie funkcje NOP?

mwojcie3 09 Sty 2012 14:21 1224 3
REKLAMA
  • #1 10371766
    mwojcie3
    Poziom 10  
    Znalazłem kod obsługujący mcp41100, wszystko rozumiem, ale po co w kodzie występują funkcje NOP, i z czego wynika ich ilość w kodzie. Rozumiem że realizują one opóźnienia.

    include <avr/io.h>
    #include <util/delay.h> 
     
    #define DDR_SI   DDRD      //wejście SI 
    #define PORT_SI  PORTD 
    #define SI       PD5 
     
    #define DDR_CS     DDRD      //sygnał CS 
    #define PORT_CS    PORTD 
    #define CS         PD7 
     
    #define DDR_SCK    DDRD      //wyjście zegarowe 
    #define PORT_SCK   PORTD 
    #define SCK        PD6 
     
    void spi_init(void) 
    { 
       DDR_SI |= _BV(SI);    //konfiguracja pinu jako wyjście SI 
     
       DDR_SCK |= _BV(SCK);       //konfiguracja pinu jako wyjście zegarowe 
       PORT_SCK &= ~_BV(SCK); 	  // ustawia SCK w stan niski
     
       DDR_CS |= _BV(CS);         //konfiguracja pinu jako wyjście   CS 
       PORT_CS |= _BV(CS);       //ustaw CS w stan wysoki 
    } 
     
     
    void spi_write(unsigned int cmd) 
    { 
    unsigned int pot = 0;
    	pot = cmd;
    	PORT_CS &= ~_BV(CS);       //CS niski, zezwolenie na transmisję 
       	__asm("nop"); 
       	__asm("nop"); 
       	__asm("nop"); 
       	__asm("nop");  
       for (int i=0; i<16; i++) 
       { 
    		if( pot & 0x80) PORT_SI |= _BV(SI);
    		else PORT_SI &= ~_BV(SI);
             	PORT_SCK |= _BV(SCK); 
             	__asm("nop"); 
             	__asm("nop"); 
             	__asm("nop"); 
             	__asm("nop"); 
    		pot = pot << 1;                   
             	PORT_SCK &= ~_BV(SCK); 
             	__asm("nop"); 
             	__asm("nop"); 
             	__asm("nop"); 
             	__asm("nop"); 
        } 
    	PORT_CS |= _BV(CS); 
    } 
     
    int main(void)
    {
    	spi_init();
    	spi_write(0b0001000111111111); 
    }
  • REKLAMA
  • #2 10372103
    FastProject
    Poziom 28  
    Nie wnikam za bardzo w kod i dokumentację układu MCP, ale zapewne chodzi o to aby zmiana zegara i pinu CS nie następowała zbyt szybko.

    Sprawdź max częstotliwość komunikacji układu MCP i/albo usuń NOP-y a zobaczysz czy są one konieczne.
  • REKLAMA
  • #3 10373173
    mwojcie3
    Poziom 10  
    ok, badałem z nop i bez i nie ma różnicy. Więc przy 1MHz nie znaczenia. Dzieki za odpowiedz
  • #4 10436677
    mwojcie3
    Poziom 10  
    Jeszcze jedno pytanie, mianowicie mam układ, taki jak na rysunku poniżej. Wzmacniacz operacyjny to Op07.
    Ustawiam dzielnik na 128 - czytaj Ra = Rb, czyli powinienem uzyskać wzmocnienie 2.

    Dochodzimy do pomiarów światła.
    I tak na wejściu mamy 210 mV a na wyjściu wzmacniacza 725 mV czyli wzmocnienie g=3,45.

    Robimy drugi pomiar i na wejściu 426mV a na wyjściu 1042mV, czyli g=2,44
    następny we 1315mV wy 2680mV g=2,03 (bliższe prawdzie). Z czego może wynikać taki rozrzut wzmocnienia? Czy dają tu znać o sobie jakieś nieliniowości wzmacniacza, czy jakieś inne wyjaśnienie jest?
REKLAMA