Tak jsem tu dnes zůstal do noci a psal a psal. Nakonec jsem ta tlačítka vyřešil jinak (jednoduše mi tam jak delay, tak nic nedělání a čekání na puštění tlačítka, zavazelo). Použil jsem timer0 pomocí kterého každou 1ms přičítám do long proměnné 1. No a mělo by to fungovat takto:
if(!(PIND & 1<<PD1) && predchoziStav == 0 && tlac - cas > 200){ // Zapnutí.
if (zapnuti == 1)
zapnuti = 0;
else
zapnuti = 1;
cas = tlac;
}
predchoziStav = !(PIND & 1<<PD1);
zapnuti je prostě zapnutí, pokdu je jedna, celé zařízení se rozběhne , tlac je právě ta proměnná, do které je každou 1ms přičítána 1. 200 je vstupní zpoždění 200ms.
Ale mám na tebe ještě další otázečky (doufám, že už poslední).
Vytvořil jsem si funkce pro zápis a čtení SPI dle tvých rad.
uint8_t SPI(uint8_t data){
SPDR = data;
while(!(SPSR & (1<<SPIF))); // Počkej na dokončení přenosu.
return SPDR;
}
uint8_t CS8416Read(uint8_t addr, uint8_t data){
PORTB &= ~(1<<PB2);
_delay_us(1);
SPI(0b00100000); // Adresa čipu a Write bit.
SPI(addr); // Adresa registru, ze kterého chci číst.
PORTB |= (1<<PB2);
_delay_us(1);
PORTB &= ~(1<<PB2);
_delay_us(1);
SPI(0b00100001); // Adresa čipu a Read bit.
data = SPI(0xFF); // Čtu data.
PORTB |= (1<<PB2);
return data;
}
void CS8416Write(uint8_t addr, uint8_t data){
PORTB &= ~(1<<PB2);
_delay_us(1);
SPI(0b00100000); // Adresa čipu a Write bit.
SPI(addr); // Adresa registru, do kterého chci zapisovat.
SPI(data); //Zápis.
PORTB |= (1<<PB2);
}
Teď ovšem nastal stav, kdy potřebuju pracovat jen s jednou buňkou v v MAP registru. Dá se to napsat takto?
CS8416Write(0x05, (1<<7)|(1<<2)|(1<<1)); // Nastavení audio výstupu CS8416 na I2S master.
V registru 05h potřebuju zapsat 1 na pin 7, 2 a 1, mám to správně?
Moje další otázka se týká čtení.
if (CS8416Read(0x0B, (1<<0))){ // Pokud je samplovací frekvence menší než 88,1 KHz, nastaví PDUR.
CS8416Write(0x00, !(1<<3));
}
else{
CS8416Write(0x00, (1<<3));
Tady tato funkce by měla číst z registru 0B a kontrolovat pozici nultého bitu. Pokud je zde 1, zapíše do 00h na pozici třetího bitu 0, jinak 1. Bude to takto fungovat?
Zatím moc díky, už to mám snad celé napsané, jen čekám, než mi přijde programátor a zbytek součástek na dostavění modulu s CS8416.