DS3231 a nefungující přerušení s ATTiny84
Napsal: 13 lis 2021, 14:56
Bastlím zrovna s modulem DS3231 a ATTiny84. Pro komunikaci používám knihovnu i2cmaster. V podstatě modul běží jak má, až na alarm, ten chci aby spustil přerušení každou minutu (případně každou sekundu). Přerušení se ale nevyvolá už ani na úrovni modulu. Pokud mám nastavený SQW výstup na 1Hz (RS0 a RS1 bity na 0), tak vše funguje a na výstupu dostávám 1Hz signál a přerušení ATTiny beží. Pochopil jsem nastavení registrů nějak špatně? Dle datasheetu po zapsaní bytu se adresa inkrementuje, takže v podstatě zapisuji jen hodnoty po určení adresy prvního registru. Pro kontrolu jsem měl na osciloskopu výstup z DS3231 na SQW pinu, ale nic.
Zkoušel jsem i posílat hodnotu jednotlivě do registrů, ale beze změny.
Kód: Vybrat vše
#include <avr/io.h>
extern "C" {
#include <i2cmaster.h>
}
#define DS3231_ReadMode_U8 (0xD1)
#define DS3231_WriteMode_U8 (0xD0)
#define DS3231_REG_ALARM_1 (0x07)
#define DS3231_REG_ALARM_2 (0x0B)
#define DS3231_REG_CONTROL (0x0E)
#define LED PA5
int main(){
DDRA |= (1 << LED);
init_ds3231();
ds3231_SetDateTime(__TIME__);
ds3231_SendMinuteInterrupt();
init_interrupt();
sei();
while(1){
}
}
void init_interrupt(){
MCUCR |= (1 << ISC01) | (1<<ISC00); // Nastavi interrupt na náběžnou hranu INT0 pinu
GIMSK |= (1 << INT0); // Zapne externí přerušení na INT0 pinu
}
ISR(EXT_INT0_vect){
PORTA ^= (1 << LED);
}
void init_ds3231()
{
i2c_init();
i2c_start(DS3231_WriteMode_U8);
i2c_write(DS3231_REG_CONTROL);
i2c_write(0x06); // Nastaví bity INTCN a A2IE
i2c_stop();
}
void ds3231_SendMinuteInterrupt(){
i2c_start(DS3231_WriteMode_U8);
i2c_write(DS3231_REG_ALARM_2); // Registr 0Bh
i2c_write(0x80); // Nastaví A2M2 bit registru 0Bh
i2c_write(0x80); // Nastaví A2M3 bit registru 0Ch
i2c_write(0x80); // Nastaví A2M4 bit registru 0Dh
i2c_stop();
}
void ds3231_SendSecondsInterrupt(){
i2c_start(DS3231_WriteMode_U8);
i2c_write(DS3231_REG_ALARM_1); // Registr 07h
i2c_write(0x80); // Nastaví A1M1 bit registru 07h
i2c_write(0x80); // Nastaví A1M2 bit registru 08h
i2c_write(0x80); // Nastaví A1M3 bit registru 09h
i2c_write(0x80); // Nastaví A1M4 bit registru 0Ah
i2c_stop();
}
void ds3231_SetDateTime()
void ds3231_GetDateTime(){...}
byte dec2bcd(char p_num1, char p_num2){...}
uint8_t bcd2dec(byte p_num, byte p_decimal){...}
Kód: Vybrat vše
void ds3231_SendMinuteInterrupt(){
i2c_start(DS3231_WriteMode_U8);
i2c_write(0x0B);
i2c_write(0x80);
i2c_stop();
i2c_start(DS3231_WriteMode_U8);
i2c_write(0x0C);
i2c_write(0x80);
i2c_stop();
i2c_start(DS3231_WriteMode_U8);
i2c_write(0x0D);
i2c_write(0x80);
i2c_stop();
}