Compare commits

..

No commits in common. "feature/Feature-1" and "master" have entirely different histories.

2 changed files with 43 additions and 4 deletions

View File

@ -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
View File

@ -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 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;
}