Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Bascom Attiny2313 - początek zagara binarnego działa timer nie wyswietla

Manianasss 06 Jan 2013 22:02 2277 6
  • #1
    Manianasss
    Level 2  
    Witam Wszystkich
    Pisze kod do zegarka binarnego (zaczynam) jestem na etapie sekund.
    Licznik działa ale nie włącza poszczególnych diod led.
    Sterowanie diod jest za pomocą multipleksowania.
    Skupiłem się na razie tylko na wyświetlaniu sekund jak to ruszy to reszta pójdzie łatwo.
    Procesor attiny 2313 kwarc 20MHz Bascom.

    Code: vbnet
    Log in, to see the code


    w miejscu tego


    Code: vbnet
    Log in, to see the code




    wstawię to czyli mruganie co 1 sekundę to działa


    Code: vbnet
    Log in, to see the code
  • #2
    BlueDraco
    MCUs specialist
    Stare przysłowie pszczół: żadnego oczekiwania w procedurze przerwania. Ty co (chyba) 2.4 s każesz w obsłudze przerwania czekać (chyba) ponad 10 sekund. Jak to ma działać?
  • #3
    Manianasss
    Level 2  
    Niby tak jak wykasuje je całkiem to czas odmierza ale bardzo krótko daje stan wysoki na ledy i prawie ich nie widać .
    Chyba mój algorytm jest do bani :(.
  • #4
    emarcus
    Level 38  
    Manianasss wrote:

    Chyba mój algorytm jest do bani :(.


    Chyba tu masz zupełną rację.
    Po piersze: Czy na prawdę taktujesz processor rezonatorem 20 MHz włącznie ze odpowiedno zaprogramowanymi fuse bitami?
    Jeżeli tak to praktycznie nie masz możliwości skonfigurowania timera0 aby nim odmierzyc 8 ms pomijajac reszte błędnych rachunków. Nawet przy prescalerze 1024 nie będzie to 8 ms na tyle dokładne aby przyjąc jako podstawę czasową do zegara czasu rzeczywistego.
    Podejżewam żę masz oryginalny processor z fabrycznym ustawieniem 1MHz .
    Zamiast tak elaborowanego programu, który w zasadzie nie wiele porzytecznego robi, spróbuj skonfigurowa chocby timer0, ale w trybie CTC - odciąży to w znacznym stopniu processor, który w tym czasie może wykonywac inne zadania.
    Gruga sprawa to: Pomimo że rezonatory kwarcowe ogólnego stosowania są relatywnie dośc dokładne to w zasadzie nie nadają sie do taktowania processorów z przeznaczeniem do budowy zegarów. Raczej tu byłby wskazany inny koncept z układem RTC albo inny processor z możliwością podpięcia o wiele dokładniejszego rezonatora "zegarkowego " 32.768kHz.
    Dla przykładu podaję ci konfiguracje dla timera1 aby zobrazowac jak prosty program może byc dla odmierzenia 1 sec., który praktycznie może pracowac "bez udziału processora"
    [code]
    Code: vbnet
    Log in, to see the code

    Oczywiście stosując timer0 nie uzyskasz bezpośrednio czasu 1 sec. ale możesz dobrac sensowny wspólczynnik, który łączne z dobranym rezonatorem i prescalerm da wymagany przedział czasowy służący jako względnie doładna podstawa czasowa dla zegara.
    e marcus
  • #5
    Manianasss
    Level 2  
    ok działa podobny program jest w książce.
    Ale jak teraz "przenieść" to zliczanie w inne miejsce żeby diody zaczeły sie zapalać tak jak che i to jeszcze z multipleksowaniem.
    A co do keawcu to miałem go podłączonego i w fusach też ustawiony był ok.
    Jak narazie dzieki za pomoc.

    Chwile sie pobawiłem i zastanawiałem sie czemu mi zle działa dioda podpięta do
    PORTB.3 a to jest związane z OCR1A dlatego zle działała.
    Ten port musi zostać zwolniony ?
    znaczy nic nim nie sterować.

    Po jakimś tam czasie napisałem takie coś
    Code: vbnet
    Log in, to see the code

    Narazie działa muszę do pisać reszte sekundy, minuty i godziny.
  • #6
    BlueDraco
    MCUs specialist
    W zegarku z wyświetlaczem najwygodniej robić wszystko w jednym przerwaniu timera. Program główny inicjuje procesor i idzie spać.
  • Helpful post
    #7
    emarcus
    Level 38  
    Manianasss wrote:


    Chwile sie pobawiłem i zastanawiałem sie czemu mi zle działa dioda podpięta do
    PORTB.3 a to jest związane z OCR1A dlatego zle działała.


    Nie dlatego, nie ma tu żadnego związku.
    OCR1A jest to wpis do rejestru, który służy do określenia górnej granicy (TOP) do jakiej ma liczyc Timer1 co odpowiada upływowi czasu tu akutat 1 sec., zaczym się wyzeruje. Jeżeli chcesz użyc PORTB.3 jak I/O to musisz odłączyc od niego wyjście Timera1. (usuń "Compare A = Toggle " z configuracji timera), wtedy pin 3 portu B będzie zwyczajny PORTB.3 zamiast OC1A.
    Konieczne byłoby troche głębsze zaznajomienie się z Datasheet. Patrz str.108.
    TCCR1A -bit 6 oraz tabela 43 (druga linia).

    e marcus