Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Wolny start atmega 8. Bascom avr. Przyczyna wolnego startu.

guteczek 27 Lut 2006 18:47 1837 10
  • #1 27 Lut 2006 18:47
    guteczek
    Poziom 10  

    Witam wszystkich.
    Mam ustawione opóźnienie startu na 4mS a po załączeniu program startuje w procku po dobrych 5-6 s,co może być tego przyczyną?.
    Używam bascoma avr.
    Dziękuję za odpowiedzi mogące mi pomóc.

    0 10
  • #2 27 Lut 2006 19:10
    Smoczy
    Poziom 18  

    Opisz dokładniej jak to się objawia i po czym poznajesz, że aż tak długo. Być może masz podłączony pin Reset jako port WE/WY, a w ustawieniach nie wyłaczyłeś funkcji RESET z zewnątrz.

    0
  • #3 28 Lut 2006 07:47
    guteczek
    Poziom 10  

    Witam.
    Poznaję to po tym że wyświetlacz pozostaje ciemny i dopiero po pewnym czasie wskakuje to co ma być na nim wyświetlone.
    Pin reset mam pozostawiony jako reset i podciągnięty do plusa przez 4,7K,fusebit od opóźnienia startu mam ustawiony na 4mS więc nie bardzo rozumiem dlaczego tak leniwie startuje mi program.

    0
  • #4 28 Lut 2006 12:32
    Smoczy
    Poziom 18  

    Więc sprawdź, czy zasilanie jes ok ponieważ, może działać układ BOD.

    0
  • #5 28 Lut 2006 15:59
    guteczek
    Poziom 10  

    Zasilanie typowe przez 7805, napięcie startuje od razu, nawet jak zablokuję fusa od wykrywania spadku napiecia to procek niezmiennie startuje po kilku sekundach

    0
  • #6 01 Mar 2006 15:59
    psiemek
    Poziom 21  

    Na moje to wina wyświetlacza. Po prostu procek czeka aż wyświetlacz zgłosi gotowość. Spróbuj podpiąć diodę Led pod którąś nogę i dopisąc zapalenie jej po starcie i wtedy się okaże że led zapali się po 20ms od startu zasilania.

    0
  • #7 02 Mar 2006 07:53
    guteczek
    Poziom 10  

    wyświetlacz mam na ledach i 74ls164, nie musi zgłaszać gotowości,z ledą już tak zrobiłem, startuje tak samo jak cała reszta, nawet obsługa klawiatury itd. czyli po kilku sekundach.

    0
  • #8 02 Mar 2006 08:04
    Robot_
    Poziom 18  

    Dzieje sie tak na kazdym kodzie czy tylko na tym konkretnym programie ???
    Nie masz gdzies w kodzie funkcji opozniajacych?? moze tam gdzies masz problem?? Jesli masz a do tego podales nie poprawnie kwarc to moze byc problem.
    Podaj kod, bo wrozenie z kart jakos mi dzisiaj nie idzie a i szklana kula sie zbila :)
    Pozdr

    0
  • #9 02 Mar 2006 08:11
    guteczek
    Poziom 10  

    na każdym który napiszę jest tak samo, w nowym temacie powyżej podałem ustawienia fuse bitów, zaraz wkleję kawałek na którym teraz się bawię

    Dodano po 4 [minuty]:


    to kod na którym teraz się bawie



    '*******************************************************************************
    '-------------------- konfiguracje -----------------------------------------
    $regfile = "m8def.dat" 'deklaracja typu procka
    $crystal = 8000000 'deklaracja częstotliwości oscylatora
    Config Timer0 = Timer , Prescale = 8 'konfiguracja tajmera 0 z podziałem /8
    Config Timer1 = Timer , Prescale = 1024 'konfiguracja tajmera 1 z podziałem /1024

    '-------------------------------------------------------------------------------
    On Timer0 Enkoder 'po przerwaniu od tajmer 0 skok do podprogramu"enkoder"
    On Timer1 Wyswietlacz 'po przerwaniu od tajmer 1 skok do podprogramu "wyswietlacz"
    Enable Interrupts 'odblokowanie globalnego systemu przerwań
    Enable Timer0 'odblokowanie przerwania od tajmera 0
    Enable Timer1 'odblokowanie przerwania od tajmera 1
    Load Timer0 , 100 'załadowanie wartości początkowej do taimera 0
    Load Timer1 , 30 'załadowanie wartości początkowej do tajmera 1
    'tajmer 0 (obsługa enkodera) generuje przerwanie co
    'tajmer 1 (obsługa wyświetlacza) generuje przerwanie co
    Start Timer0
    Start Timer1 'wystartowanie odlicznia tajmerów 0,1
    '-------------------------------------------------------------------------------
    '-------------------- konfiguracje portów procka ---------------------------
    Config Portb = &B11111111 'port B ustawiony jako wyjściowy
    Config Portd = &B11110000 'linie 0-3 wejściowe, linie 4-7 wejściowe
    Config Pinc.0 = Output 'wyjście CLK na 74ls164
    Config Pinc.1 = Output 'wyjście data na 74ls164
    Config Pinc.4 = Output 'wyjście na przekaźnik posuw dół
    Config Pinc.5 = Output 'wyjście na przekaźnik posuw góra
    Config Pinc.2 = Input 'wejście A enkodera
    Config Pinc.3 = Input 'wejście B enkodera
    Config Watchdog = 10
    '----------------- załączenie rezystorów na porty wejściowe ----------------




    Set Portd.0
    Set Portd.1
    Set Portd.2
    Set Portd.3
    Set Portc.2
    Set Portc.3
    Set Portc.4
    Set Portc.5
    Portb = &B00111110 'ustawienie niewykorzystanych wyjść w stan niski
    '-------------------------------------------------------------------------------
    '------------ przypisanie nazw własnych do portów i pinów procka -----------
    '-------------------------------------------------------------------------------
    ' przypisanie nazw kolumn i wierszy klawiatury
    Kolumna_1 Alias Portd.4
    Kolumna_2 Alias Portd.5
    Kolumna_3 Alias Portd.6
    Kolumna_4 Alias Portd.7
    Wiersz_1 Alias Pind.2
    Wiersz_2 Alias Pind.1
    Wiersz_3 Alias Pind.0
    Wiersz_4 Alias Pind.3
    Wy_data Alias Portc.1 'port wyjściowy data do 74ls164
    Wy_clk Alias Portc.0 'port wyjściowy clk do 74ls164
    We_a Alias Pinc.2 'pin wejścia A enkodera
    We_b Alias Pinc.3 'pin wejścia B enkodera
    Posuw_d Alias Portc.4 'port sterujący przekaźnikiem pos.d
    Posuw_g Alias Portc.5 'port sterowania przekaźnikiem pos.g
    Led Alias Portb.4 'port sterujący led
    ' przypisanie nazw do anod wyświetlacza LED
    A_1 Alias Portb.5
    A_2 Alias Portb.1
    A_3 Alias Portb.3
    A_4 Alias Portb.2
    '-------------------------------------------------------------------------------
    '***************** deklaracje zmiennych i procedur *************************
    Dim Licznik As Single
    Dim Licznik_pomoc As Single
    Dim Temp_a As Bit
    Dim Temp_b As Bit
    Dim A As Bit
    Dim B As Bit
    Dim Nastaw As Word
    Dim Cyfra(4) As Word
    Dim Licz_wyswietlacz As Byte
    Dim Licz_kolumny As Byte
    Dim Flaga_power_off As Bit
    Dim Flaga_kropka As Bit
    Dim Flaga_cyfry As Bit
    Dim Znak_pila As Bit
    Dim Znak_save As Bit
    Dim Znak_return As Bit
    Dim Znak_err As Bit
    Dim Znak_klamra As Bit
    Dim Znak_kreski As Bit
    Dim Znak_dzielnik As Bit
    Dim Znak_kolka As Bit
    Dim Znak_call As Bit
    Dim Cyfra_do_wysw As Byte
    Dim Czasomierz As Byte
    Dim Mnoznik As Word
    Dim Licznik_enkoder As Single
    'zadziałanie watchdoga po 10 mS
    Start Watchdog 'start watchdoga

    Reset Led
    '*******************************************************************************
    Temp_a = We_a
    Temp_b = We_b
    '---------------- odczyt danych z pamięci ----------------------------------
    '*******************************************************************************
    Readeeprom Nastaw , 2
    '*******************************************************************************
    '* Pętla główna programu *
    '*******************************************************************************

    Do

    Portd = Portd Or &B11110000
    Incr Licz_kolumny

    Select Case Licz_kolumny
    Case 1:

    Reset Kolumna_1

    Debounce Wiersz_1 , 0 , Prog_start , Sub



    End Select

    If Licz_kolumny = 4 Then Licz_kolumny = 0






    Loop
    End
    '------------- koniec pętli głównej programu -------------------------------


    '*******************************************************************************
    '******************* przerwanie tajmer 1 - obsł.wyświetlacza ***************
    '*******************************************************************************
    Wyswietlacz:
    Enable Interrupts 'odblokowanie systemu przerwań
    ' aby nie blokować pracy podprogramu obsługi enkodera
    Nastaw = Licznik
    '------------ obliczanie cyfr 1-4 do wyświetlenia --------------------------
    Cyfra(1) = Nastaw / 1000 'tysiące
    Cyfra(2) = Nastaw Mod 1000
    Cyfra(2) = Cyfra(2) / 100 'setki
    Cyfra(3) = Nastaw Mod 100
    Cyfra(3) = Cyfra(3) / 10 'dziesiątki
    Cyfra(4) = Nastaw Mod 10 'jedności
    '--------------- wygaszanie zer nieznaczących -------------------------------
    If Cyfra(1) = 0 Then
    Cyfra(1) = 10
    If Cyfra(2) = 0 Then
    Cyfra(2) = 10
    If Cyfra(3) = 0 Then
    Cyfra(3) = 10
    If Cyfra(4) = 0 Then Cyfra(4) = 20 'gdy C(4)=0 to kreska pozioma
    End If
    End If
    End If
    If Znak_pila = 1 Then Cyfra(1) = 17


    If Znak_dzielnik = 1 Then Cyfra(1) = 18

    '-------------------------------------------------------------------------------
    Portb = Portb Or &B00101110 ' wygaszenie wszystkich anod
    Incr Licz_wyswietlacz 'dodawannie po 1 do licznika
    Cyfra_do_wysw = Cyfra(licz_wyswietlacz) 'ustalenie kolejnej cyfry do wyświetlenia
    Cyfra_do_wysw = Lookup(cyfra_do_wysw , Segmenty) 'zamiana cyfry na kod 7-segment
    '---------------- zapalenie kropki gdy flaga-kropka=1 ----------------------

    '-------------------------------------------------------------------------------

    Shiftout Wy_data , Wy_clk , Cyfra_do_wysw , 2 'transmisja szeregowa do 74ls164
    '---------- sterowanie anodami wyświetlaczy --------------------------------
    If Flaga_power_off = 1 Then Licz_wyswietlacz = 0
    Select Case Licz_wyswietlacz
    Case 1 : Reset A_1
    Case 2 : Reset A_2
    Case 3 : Reset A_3
    Case 4 : Reset A_4
    End Select
    '-------------------------------------------------------------------------------
    If Licz_wyswietlacz = 1 Then Licznik_enkoder = Licznik
    If Licz_wyswietlacz = 4 Then
    Licz_wyswietlacz = 0
    Incr Czasomierz
    If Czasomierz = 100 Then Toggle Posuw_g
    If Czasomierz = 200 Then
    Toggle Posuw_d
    Czasomierz = 0

    Incr Licznik
    If Licznik > 9999 Then Licznik = 0
    End If
    End If











    Reset Watchdog 'reset watchdoga
    Load Timer1 , 30 ' załadowanie wartości początkowej do tajmer 1
    Return
    '-------------- koniec przerwania obsługi wyświetlacza ---------------------

    '******************* przerwanie tajmer 1 - obsł. enkodera ******************
    Enkoder:
    '******************** sprawdzenie stanu wejść A,B *****************************
    A = We_a
    B = We_b
    '******************** dekodowanie kolejności impulsów A,B *********************


    '------------------------------------------------------------------------------


    Reset Watchdog 'reset watchdoga co przerwanie
    Load Timer0 , 100
    Return 'załadowanie wartości początkowej tajmer 0
    '-------------------------------------------------------------------------------
    '-------------- koniec przerwania obsługi enkodera -------------------------


    Reset Watchdog 'reset watchdoga co przerwanie
    Load Timer0 , 100
    Return 'załadowanie wartości początkowej tajmer 0
    '-------------------------------------------------------------------------------
    '-------------- koniec przerwania obsługi enkodera -------------------------




    '*******************************************************************************
    '* Podprogramy *
    '*******************************************************************************
    '###############################################################################
    '---------------- podprogram obsługi cyfr ----------------------------------
    Cyfry_obsluga:

    Return






    '---------------- koniec podprogramu obsługi cyfr --------------------------
    '###############################################################################
    '---------------- podprogram załączania i wyłączania -----------------------
    Power_on_off:

    Return

    '---------------- podprogram rewers ----------------------------------------
    Prog_rewers:

    Return

    '---------------- koniec podprogramu rewers --------------------------------
    '###############################################################################
    '---------------- podprogram return ----------------------------------------

    Prog_return:

    Return
    '---------------- koniec podprogramu obsługi return ------------------------
    '###############################################################################
    '---------------- podprogram kalibracji ------------------------------------
    Kalibracja:

    Return
    '---------------- koniec podprogramu kalibracji ----------------------------
    '###############################################################################
    '---------------- obsługa klawisza start -----------------------------------
    Prog_start:
    Toggle Posuw_d
    Znak_pila = 0



    Return
    '--------------- koniec podprogramu obsługi startu -------------------------
    '###############################################################################


    '*******************************************************************************
    '******************* linie z danymi typu DATA ******************************
    '*******************************************************************************
    Segmenty:
    Data 18 , 119 , 42 , 38 , 71 , 134 , 130 , 55 , 2 , 6 , 'kod cyfr 0-9
    Data 255 , 138 , 235 , 154 , 54 , 190 , 3 , 226 , 203 , 11 , 239 , 218 , 242,
    Data 174 , 191
    '10-pusta
    '11-E
    '12-r
    '13-[
    '14-]
    '15-=
    '16-A
    '17-kolko
    '18-dzielnik
    '19-P
    '20- -
    '21-L
    '22-u
    '23- 3 kreski
    '24- kreska góra

    0
  • Pomocny post
    #10 02 Mar 2006 09:28
    kamyczek
    Poziom 34  

    zastosuj układ ds 1813 do zerowania procka wyłacz WDT i BOD wtedy potestuj a i zmień kwarca na inny egzęplaż czasem usunięcie lub zmiana c przy kwarcu też daje efekt . problem ze źle startującym oscylatorem ,lub ustawieniem procka na wewętrzny oscylator co kończy sie niewyrobieniem proca przd wtd i resetem ...

    0
  • #11 02 Mar 2006 10:15
    guteczek
    Poziom 10  

    wiem już chyba w czym rzecz, chyba tajmer1 musi zbyt dużo zliczyć impulsów aby nastąpiło pierwsze przerwanie od niego a on właśnie obsługuje wyświetlacz,muszę chyba wpisać wartość wstępną do niego przed pierwszym przerwaniem....

    Dodano po 4 [minuty]:

    zmieniłem prescale tajmera 1 z 1024 na 1 i jest oki :-)

    0