Compare commits
No commits in common. "feature/Feature-1" and "master" have entirely different histories.
feature/Fe
...
master
4
main.cpp
4
main.cpp
@ -12,12 +12,12 @@ volatile uint8_t sampleReady = 0; //zmienna kotrolująca możliwość podania no
|
||||
volatile uint8_t adcVal = 0;
|
||||
volatile uint8_t effect = REVERB; //wybrany efekt
|
||||
volatile uint32_t counter = 0;
|
||||
static const uint8_t sine [101] = {0,0,0,0,1,1,2,2,3,4,5,6,7,8,10,11,12,14,16,17,19,21,23,25,27,29,32,34,36,39,41,44,46,49,
|
||||
const uint8_t sine [101] = {0,0,0,0,1,1,2,2,3,4,5,6,7,8,10,11,12,14,16,17,19,21,23,25,27,29,32,34,36,39,41,44,46,49,
|
||||
52,55,57,60,63,66,69,72,75,78,81,84,87,91,94,97,100,103,106,109,113,116,119,122,125,128,131,134,137,140,143,145,148,
|
||||
151,154,156,159,161,164,166,168,171,173,175,177,179,181,183,184,186,188,189,190,192,193,194,195,196,197,198,198,199,
|
||||
199,200,200,200,200};
|
||||
volatile uint8_t effectSetting = 5;
|
||||
static const uint8_t effectSettingVector [9] = {0, 5, 15, 30, 55, 90, 130, 180, 255};
|
||||
const uint8_t effectSettingVector [9] = {0, 5, 15, 30, 55, 90, 130, 180, 255};
|
||||
volatile uint8_t encoderDir = 0; //0 - w lewo, 1 - w prawo
|
||||
volatile uint8_t encoderServed = 1;
|
||||
|
||||
|
43
spi.h
43
spi.h
@ -4,6 +4,22 @@
|
||||
#define SS_LOW PORTB &= ~(1<<PORTB2)
|
||||
#define SS_HIGH PORTB |= (1<<PORTB2)
|
||||
|
||||
//Jaki stan musi być na SS żeby DAC odbierał dane??
|
||||
//musi być to stan niski (zarówno wg kursu jak i danycha katalogowych)
|
||||
|
||||
/*"CS is the Chip Select input pin, which requires an
|
||||
active low to enable serial clock and data functions."*/
|
||||
|
||||
/*CPOL (polaryzacja) - mówi o tym jaki ma być stan zegara w bezczynności
|
||||
W przypadku użytego DAC, w trybie 0,0 (Mode 0, 0), powinien być to stan niski, a więc CPOL = 0 */
|
||||
|
||||
/*CPHA (faza) - określa kiedy są odczytywane, a kiedy wystawiane bity na linii danych DAC.
|
||||
Ponieważ bity są wystawiane na zboczu opadającym, to CPHA = CPOL = 0 (czyli DAC pracuje w trybie 0, 0)*/
|
||||
|
||||
/*W ogólności MCP4xxx wspierają tryb 0,0 i 1,1*/
|
||||
|
||||
/*Wg kursu inne piny odpowiadają za SPI niż w rzeczywistości (PB4, 5, 6, 7 zamiast PB2, 3, 4, 5)*/
|
||||
|
||||
//inicjalizacja
|
||||
void spiInit(void) {
|
||||
// /SS, MOSI, SCK jako wyjścia
|
||||
@ -16,9 +32,32 @@ void spiInit(void) {
|
||||
}
|
||||
|
||||
//wysłanie jednego bajtu
|
||||
void spiTransfer(uint8_t data) {
|
||||
/*uint8_t*/ void spiTransfer(uint8_t data) {
|
||||
//rozpocznij transmisję
|
||||
SPDR = data;
|
||||
//poczekaj na koniec
|
||||
while(!(SPSR & (1<<SPIF)));
|
||||
while(!(SPSR & (1<<SPIF))); //wstrzymanie programu trwa do chwili zakończenia transmisji (flaga SPIF = 0 w rejestrze statusowym)
|
||||
//możliwe jest też wywołanie przerwania w takim przypadku: można by zmieniać w nim własną flagę
|
||||
//wysyłanie i tak następuje co 1600 cykli (f = 10 000 Hz), więc oczekiwanie raczej nie jest do niczego potrzebne
|
||||
//BŁĄD!! Żeby wysłać jedna wartość do DAC wysyłane są dwa bajty jeden za drugim
|
||||
//Czas jaki mija między zakończeniem wysyłki pierwszego i rozpoczęcia transmisji
|
||||
//drugiego pakietu wynosi ok. 600 ns - ok. 10 cykli zegarowych (powinno wyjść dokładnie 10 * 62,5 ns = 625 ns).
|
||||
//Można stworzyć dodatkową funkcję - wysyłającą drugi bajt bez czekania
|
||||
//NIE DZIAŁA! Z jakiegoś powodu, wykorzystując taką funkcję wysyła się tylko pierwszy bajt
|
||||
//Dzieje się tak, ponieważ natychmiast po przekazaniu danych do wysyłki następuje rozłaczenie (bit SS = 1)
|
||||
//Aktywacja DAC SPI na stałe (SS = 0) nic nie daje. Nadal bez while'a, wysyłka drugiego bajtu nie następuje
|
||||
//Obsługa przez przerwania prawdopodobnie byłaby nieopłacalna - więcej procesor musiałby się napracować niż marnuje czasu w while'u
|
||||
//Zmiany stanu wyjscia SS są konieczne do poprawnej pracy przetwornika CA, stąd:
|
||||
//- usunięcie while'a po pierwszym bajcie jest niemożliwe, bo natychmiast nastąpiłoby wprowadzanie
|
||||
//kolejnych danych do rejestru SPDR,
|
||||
//- usunięcie while'a po drugim bajcie jest niemożliwe, bo zanim nastąpiłaby wysyłka, doszłoby do
|
||||
//podniesienia linii SS
|
||||
|
||||
//Cała wysyłka jednego bajtu trwa (1940 ns / 62,5 ns) ok. 31 cykli (czas kiedy SS = 0)
|
||||
//Zanim zostanie wysłany pierwszy bit, mijają (1490 ns / 62,5 ns) ok. 24 cykle
|
||||
//While kończy się zanim na MOSI kończy się wysyłka
|
||||
//Przy wysyłaniu dwóch bajtów całość trwa dłużej (4640 ns / 62,5 ns): ok. 74 cykle
|
||||
//W tym przypadku while kończy się po przekazaniu drugiego bajtu (470 ns / 62,5 ns): ok. 7,5 cykli
|
||||
//zwróć odebraną wartość
|
||||
//return SPDR;
|
||||
}
|
Loading…
Reference in New Issue
Block a user