Skocz do zawartości

wojakin

Użytkownicy
  • Zawartość

    5
  • Rejestracja

  • Ostatnio

Reputacja

0 Neutralna

O wojakin

  • Ranga
    2/10

Informacje

  • Płeć
    Mężczyzna
  1. No ok, ustawiłem u Mastera SS jako wyjście i na próbę usunąłem główną pętlę. No i teraz dioda zapala się na ok. sekundę i gaśnie a potem zero reakcji. I to niezależnie ile jak dużych delay'ów dam i ile razy wykonam zestaw TX + _delay_ms. Nie mam pojęcia o co chodzi. Być może to nie u mastera jest błąd a u slave'a . Edit: Zmieniłem program slave i już działa. Dzięki za pomoc.
  2. Witam, ostatnio próbowałem napisać komunikacje SPI z wykorzystaniem wbudowanych peryferiów. No i za cholere nie nie udało mi się tego ruszyć aże nie posiadam analizatora stanów logicznych nie jestem w stanie nawet stwierdzić czy nie wysyłam czy nie odbieram danych. Używam 2x ATMega32a. Oto program: Master #include <avr/io.h> #include "SPI.h" int main(void) { SPIMasterInit(); while(1) { SPIFastTX(0xff); for (uint16_t i =0; i < 10000; i++){}; SPIFastTX(0x00); for (uint16_t i =0; i < 10000; i++){}; SPIFastTX(0xff); for (uint16_t i =0; i < 10000; i++){}; SPIFastTX(0x00); for (uint16_t i =0; i < 10000; i++){}; } } Slave #include <avr/io.h> #include "SPI.h" int main(void) { SPISlaveInit(); DDRD = 0b00000011; while(1) { if(SPIFastRX() == 0xff) PORTD = 1; else PORTD = 0; } } SPI.c #include <avr/io.h> #include "SPI.h" uint8_t SPIBuf [16]; uint8_t SPIDataPointer; uint8_t SPIBytes; uint8_t SPIStatus; //0 = Transmit 1 = Receive void SPIMasterInit(void) // Init SPI as master or slave { //Set IO ports SPI_DDR |= (1<<MOSI_BIT) | (1<<SCK_BIT); SPI_DDR &= ~(1<<MISO_BIT); //Set registers SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR1); //SPI Enable, prescaler 16 } void SPISlaveInit(void) // Init SPI as master or slave { //Set IO ports SPI_DDR |= (1<<MISO_BIT); //SPI_DDR &= ~(1<<MOSI_BIT) | (1<<SCK_BIT); //Set registers SPCR = (1<<SPE); //SPI Enable with interrupt } void SPIStartTransmit(uint8_t bytes) { SPIDataPointer = 0; SPDR = SPIBuf[0]; SPIDataPointer++; SPIBytes = bytes - 1; } void SPIStartReceive(uint8_t bytes) { SPIDataPointer = 0; SPIStatus = 1; SPIBytes = bytes - 1; } void SPIFastTX(uint8_t data) { //if(SPIBytes > 0) return; //while(!(SPSR & (1<<SPIF))); SPDR = data; while(!(SPSR & (1<<SPIF))); } uint8_t SPIFastRX(void) { //if(SPIBytes > 0) return 0; while(!(SPSR & (1<<SPIF))) return SPDR; } int ISR(SPI_STC_vect) { if(SPIStatus == 0) { if(SPIDataPointer <= SPIBytes) { SPDR = SPIBuf[SPIDataPointer]; SPIDataPointer++; } } else { if (SPIDataPointer <= SPIBytes) { SPIBuf[SPIDataPointer] = SPDR; SPIDataPointer++; } } return 0; } SPI.h #ifndef SPI_H_ #define SPI_H_ #define SPI_DDR DDRB #define SPI_PORT PORTB #define SPI_PIN PINB #define MOSI_BIT PB5 #define MISO_BIT PB6 #define SCK_BIT PB7 #define SPI_SLAVE 0 #define SPI_MASTER 1 void SPIMasterInit(void); void SPISlaveInit(void); void SPIStartTransmit(uint8_t bytes); void SPIStartReceive(uint8_t bytes); void SPIFastTX(uint8_t data); uint8_t SPIFastRX(void); #endif /* SPI_H_ */ I płytka: Z góry dzięki za pomoc.
  3. Dziękuję za informacje . Pozdrawiam. Edit: Mam jeszcze pytanie przekazuje do funkcji SPIInt napisanej w asm wartość 8-bitową jako argument z pliku napisanego w c. Z tego co rozumiem adres tej wartości powinien wylądować w rejestrze X ale tak się nie dzieje. Co robię źle? #include <avr/io.h> extern void init (void); extern void SPIInt (uint8_t edata); int main (void) { init(); SPIInt(0xAB); while(1){ } return 0; } #define __SFR_OFFSET 0 #include <avr/io.h> .global init .global SPIInt init: sbi DDRD, 0 ; Set SPI out pin ldi r16,(1<<PB4)|(1<<PB5)|(1<<PB7) out DDRB,r16 ; Enable SPI, enable SPI Interrupt, set Master Mode and set clock rate fck/16 ldi r16,(1<<SPIE)|(1<<SPE)|(1<<MSTR)|(1<<SPR0) out SPCR,r16 ret SPIInt: ld r17,x cpi r17,0xAB breq on reti on: sbi PORTD,0 reti Edit 2: Znalazłem że kompilator wartość podaną jako argument wkłada do rejestru r24. Dla argumentów zawsze ten rejestr obowiązuje?
  4. Witam. Mam pytanie dlaczego używa się rejestrów od r16 wzwyż a nie od r0? Pozdrawiam.
  5. Dobrym sposobem byłoby użycie przerobionego serwa sterowanego mostkiem H. Wtedy regulacje uzyskałbyś poprzez podanie odpowiedniego sygnału PWM na pin enable w mostku H. Jest jeszcze kwestia jak duży moment obrotowy chciałbyś uzyskać. Jeśli nie potrzeba ogromnego sprawdzi się powyższe rozwiązanie.
×
×
  • Utwórz nowe...