Witam. Mam pewien problem z którym nie mogę sobie poradzić. Zrobiłem układ multipleksowania led i zegarek na ds1307. Niby wszystko działa ale wyświetlacz jakby migał czasem co sekunde czasem co dwie. Był pewien problem bo segmenty wyświetlaczy mam podłączone pod PORTB a na PB2 jest wejście INT0 (atmega8) i nie wiem czy dobrze zmieniłem segment C na PB7.
Na wyświetlaczy wyświetlam narazie minuty i sekundy.
Kod:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include "d_led.h"
#include "lcd44780.h"
#include "I2C_TWI/i2c_twi.h"
#define DS1307_ADDR_Z 0xD0
volatile uint8_t int0_flag=1; // flaga zmieniana w przerwaniu i sprawdzana w pętli głównej
uint8_t ctrl = 0x10;
uint8_t dec2bcd(uint8_t dec); // konwersja liczby dziesiętnej na BCD
uint8_t bcd2dec(uint8_t bcd); // konwersja liczby BCD na dziesiętną
int main(void) {
sei();
lcd_init();
d_led_init();
i2cSetBitrate( 100 );
MCUCR |= (1<<ISC01); // wyzwalanie zboczem opadającym
GICR |= (1<<INT0); // odblokowanie przerwania
PORTD |= (1<<PD2); // podciągnięcie pinu INT0 do VCC
// definiujemy sobie dla polepszenia czytelności programu typ wyliczeniowy
// wskazujący nam później na odpowiednie indeksy w tablicy (buforze)
enum {ss, mm, hh};
uint8_t bufor[3]; // rezerwacja bufora 3 bajty
uint8_t sekundy, minuty, godziny;
// Ustawianie czasu na godzinę: 18:20:40
bufor[0] = dec2bcd(40); // sekundy
bufor[1] = dec2bcd(20); // minuty
bufor[2] = dec2bcd(18); // godziny
// zapis 3 bajtów z bufora pod adres 0x00 w pamięci RAM naszego RTC
TWI_write_buf( DS1307_ADDR_Z, 0x00, 3, bufor );
TWI_write_buf( DS1307_ADDR_Z, 0x07, 1, &ctrl );
while(1) {
if ( int0_flag ) {
//odczyt 3 bajtów do bufora od adresu 0x00 z pamięci RAM naszego RTC
TWI_read_buf( DS1307_ADDR_Z, 0x00, 3, bufor );
sekundy = bcd2dec( bufor[ss] );
minuty = bcd2dec( bufor[mm] );
godziny = bcd2dec( bufor[hh] );
cy4 = (sekundy%10);
cy3 = (sekundy/10)%10;
cy2 = (minuty%10);
cy1 = (minuty/10)%10;
int0_flag=0;
}
}
}
// procedura obsługi przerwania INT 0
ISR( INT0_vect ) {
int0_flag = 1;
}
// konwersja liczby dziesiętnej na BCD
uint8_t dec2bcd(uint8_t dec) {
return ((dec / 10)<<4) | (dec % 10);
}
// konwersja liczby BCD na dziesiętną
uint8_t bcd2dec(uint8_t bcd) {
return ((((bcd) >> 4) & 0x0F) * 10) + ((bcd) & 0x0F);
}
Przy okazji nie mogę zrozumieć tej linijki, co oznacza znak &:
TWI_write_buf( DS1307_ADDR_Z, 0x07, 1, &ctrl );
PORTC katody wyświetlaczy
PD0 segment A
PD1 segment B
PD7 segment C
PD3 segment D
PD4 segment E
PD5 segment F
PD6 segment G
PD2 wyjście ds1307 1hz.
Używam bibliotek z niebieskiej książki.
Dziękuje za pomoc