Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 7 lut 2026, o 01:41


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
Autor Wiadomość
PostNapisane: 7 kwi 2015, o 16:14 
Offline
Nowy

Dołączył(a): 27 wrz 2014
Posty: 3
Pomógł: 0

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 kwi 2015, o 16:16 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27449
Lokalizacja: Szczecin
Pomógł: 1045

robo1238 napisał(a):
Przy okazji nie mogę zrozumieć tej linijki, co oznacza znak &:

A czytałeś Bluebooka ?

Rozdział na temat operatora pozyskiwania adresu &

------------------------ [ Dodano po: kilkunastu sekundach ]

czytałeś rozdział na temat I2C i TWI gdzie opisuję te właśnie funkcje ?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 kwi 2015, o 16:26 
Offline
Nowy

Dołączył(a): 27 wrz 2014
Posty: 3
Pomógł: 0

Bluebooka czytałem jednak widocznie nie dokładnie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 kwi 2015, o 13:30 
Offline
Nowy

Dołączył(a): 27 wrz 2014
Posty: 3
Pomógł: 0

To jak koledzy, pomożecie z tym miganiem wyświetlacza ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 kwi 2015, o 15:36 
Offline
Moderator zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 18 lip 2012
Posty: 3230
Lokalizacja: Kraków - obok FAB5 ATMEL'a
Pomógł: 91

robo1238 napisał(a):
Bluebooka czytałem jednak widocznie nie dokładnie.


To przeczytaj dokładnie.

_________________
http://www.jaglarz.info



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO