Używam zegara PCF8583, działa mi jego obsługa itp, natomiast mam problem z jego przerwaniami. Układ jest skonfigurowany by generować przerwanie co 1s, po którym procesor ponownie ustawia odpowiednie flagi w zegarze, bowiem samo przerwanie jest jednokrotne.
W celu inicjalizacji przerwań od zegara używam procedury:
a następnie w obsłudze przerwania w procesorze trzeba ponownie ustawić odpowiednie flagi na zegarze, co robi poniższa procedura:
Problem w tym, że czasami generuje w ten sposób przerwania przez 10s a czasem przez 10min. Podejrzewam, że to może być spowodowane używaniem magistrali I2C w przerwaniu procesora.
Jak temu zaradzić?
W celu inicjalizacji przerwań od zegara używam procedury:
Code:
Sub Init_alarm
I2cstart 'generate start
I2cwbyte &HA0 'write address
I2cwbyte &H00 'select control register
'I2cwbyte &H80 'stop counting
I2cwbyte &H04 'start counting and alarm enable
I2cstop
I2cstart 'generate start
I2cwbyte &HA0 'write address
I2cwbyte &H08 'select alarm register
I2cwbyte &B11000010 'alarm timer 1s int
I2cstop
I2cstart
I2cwbyte &HA0
I2cwbyte &H0F 'select alarm timer
I2cwbyte 1 '1 count
I2cstop
I2cstart
I2cwbyte &HA0
I2cwbyte &H07 'select timer
I2cwbyte 0 'reset timer counter
I2cstop
End Sub
a następnie w obsłudze przerwania w procesorze trzeba ponownie ustawić odpowiednie flagi na zegarze, co robi poniższa procedura:
Code:
Sub Reset_alarm
I2cstart 'generate start
I2cwbyte &HA0 'write address
I2cwbyte &H00 'select control register
I2cwbyte &H04 'start counting and alarm enable
I2cstop
I2cstart
I2cwbyte &HA0
I2cwbyte &H07 'select timer
I2cwbyte &H00 'reset timer counter
I2cstop
end sub
Problem w tym, że czasami generuje w ten sposób przerwania przez 10s a czasem przez 10min. Podejrzewam, że to może być spowodowane używaniem magistrali I2C w przerwaniu procesora.
Jak temu zaradzić?