Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[ATmega8][bascom] Problem z zegarkiem i wejściem sygnału

uszok 23 Mar 2009 00:22 1358 6
  • #1
    uszok
    Level 14  
    Witam

    Wykonałem dosyć ciekawy układ odpowiadający za oddymianie pomieszczenia po otrzymaniu sygnału z czujki dymu. Wszystkie opcje oprogramowania i symulacje [na procku] działają ok. Są jednak 2 problemy:
    1. Nie umiem uruchomić zegarka na kwarcu 8mhz. Ot mam taki prosty programik:
    Code:
     $regfile = "m8def.dat"                                     'Dyrektyway dla kompilatora.
    
     $crystal = 8000000                                         'Oscylator wewnętrzny o częstotliwości 8MHz.

     Config Lcd = 16 * 2
     Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.6 , E = Portd.1 , Rs = Portd.0

     Config Clock = Soft                                        'Konfiguracja czasu.
     Config Date = Dmy , Separator = /                          'Konfig. daty. Dmy=dzień,miesiąc,rok. Seperator=/,albo-,albo. .
     Enable Interrupts                                          'Uruchamiamy odblokowania.
     Date$ = "02/08/06"                                         'Ustawiamy datę od której wystartuje.
     Time$ = "12:00:00"                                         'Ustawiamy czas od którego wystartuje.



     Do                                                         'Pętla główna.
     Cls                                                        'Czyść Lcd.
     Lcd Time$                                                  'Pobierz aktualny czas.
     Locate 1 , 10                                              'Za wyświetlonym czasem na Lcd napisz: "Czas".
     Lcd "Czas"                                                 '
     Lowerline                                                  'W drugiej linii.
     Lcd Date$                                                  'Pobierz aktualną datę.
     Locate 2 , 10                                              'Za datą na wyświetlaczu napisz: "Data".
     Lcd "Data"                                                 '
     Waitms 100                                                 'Trzymaj chwilę wyświetlony czas.
     Loop                                                       'Zamknij pętlę.
     End                                                        'Koniec pętli.

    Zewnętrzny kwarc mam o częstotliwości 8 MHZ. Opis jaki jest do tego programiku:
    Quote:
    'Kwarc zegarkowy lutujemy w miejsce zewnętrznego kwarcu procesora, a sam procesor uruchamiamy na generatorze wewnętrznym,
    '8MHz, ustawiając Fusebit na 0100. Oczywiście datę i czas początkowy musimy wpisać do programu.
    'Po skompilowaniu, zegar startuje i zaczyna mierzyć czas.

    Kwarc mam wlutowany w miejsce XT1 [ustawione jako input], XT2 [ustawione jako output]. Do tego dwa kondensatory 33p i do masy. Fuse bits próbowałem na wewnętrzny zegar 8mhz [w avrdude]: -U hfuse:w:0xD9:m -U lfuse:w:0xe4:m i na zewnętrzny 8 mhz [kwarc]: -U hfuse:w:0xD9:m -U lfuse:w:0xee:m. No chyba, że się mylę w tych fuse bitach... W każdym razie zegarek stoi :(

    2. Sam sygnał z czujki dymu będzie to 5V brane z układu zasilania uC [przekaźnik itd]. Jednakowoż widzę, że mam problem z wykrywaniem jedynki. Zastosowałem zabezpieczenie przeciwko drganiu styków [programowe] ale niestety to nic nie daje. Wejście jest w stanie wysokiej impedancji zapewne. Jak to się profesjonalnie rozwiązuje? Jakieś rezystory podciągające, czy steruje się 0??

    Dziękuję za pomoc

    PS. Konfiguracja portów:
    Code:
    '*******************************************************************************
    
    '***************************** konfiguracja we/wy ******************************
    '*******************************************************************************
    Config Portb = &B10000111
    Config Portc = &B0110000
    Config Portd = &B11111111
    Config 1wire = Portd.1

    '*******************************************************************************
    '*************************** stany spoczynkowe portow **************************
    '*******************************************************************************
    Portb = &B00111000
    Portc = &B1000000
    Portd = &B00000000


    Piny:
    PC.0 - sygnał z czujnika dymu
    PB.6 - XT1
    PB.7 - XT2
  • Helpful post
    #2
    dawid512
    Level 32  
    Lini przeznaczonych do podłączenia kwarcu nie ustawiaj ani na we ani na wy.
    W przypadku zegarka fuse bity ustaw na wew. oscylator.
    Jeśli chodzi o sygnały zew. to masz 2 opcje:
    dodać tranzystor który będzie podawał stan niski po wystąpienia stanu wysokiego lub dodać rezystor podciągający daną linie do masy.
  • #3
    uszok
    Level 14  
    Ad 1 jak nie ustawię to bascom sam je ustawi na wejście... I już tak chyba miałem, ale sprawdzę jak chodzi.
    Ad2 jak podłączyłem przez ULN2803A to niestety było to samo. Czujka daje 1 w momencie wystąpienia sygnału, czyli do tego czasu wejście wisi... A jak rezystor to jakiś 4,7k jak 1wire czy coś rzędu kiladziesiąt ohm??
  • Helpful post
    #4
    dawid512
    Level 32  
    Skoro puściłeś przez ULN2803A to za pewne zapomniałeś o pull-up dlatego "wisi". Jeśli chodzi o rezystor to ok 10k.
  • #5
    uszok
    Level 14  
    Oki - poczytam dokładnie co z tym pull-up :) Bo myślę, że lepiej dla układu będzie jak ten sygnał wejściowy podłączę właśnie przez ULN2803A niż podciągającym.

    A co do zegarka - zmieniem i nadal stoi w miejscu :(
  • Helpful post
    #6
    dawid512
    Level 32  
    Porównaj te 2 zdania:
    Quote:
    Zewnętrzny kwarc mam o częstotliwości 8 MHZ.


    Quote:
    Kwarc zegarkowy lutujemy w miejsce zewnętrznego kwarcu procesora, a sam procesor uruchamiamy na generatorze wewnętrznym...


    Widzisz różnice?
  • #7
    uszok
    Level 14  
    Pull-up - pomogło :D

    Różnicę widzę - jutro lecę do sklepu.