logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Różne czasy otwarcia w pętli nieskończonej na ATmega32 - Timer1

maniio 30 Sie 2006 19:41 1733 8
REKLAMA
  • #1 2970571
    maniio
    Poziom 14  
    Posty: 149
    Pomógł: 3
    Ocena: 9
    witam!

    mam problem z timerem1 opis problemu ponizej:

    
    .... 'jakis tamprogram sobie leci po czym sa nastepujace komendy
    Timer1 = 0
    Start Timer1
    Waitus 250
    Do
       If We2 = 1 Then Incr Czas_otwarcia 'caly czas jest 1
    Loop Until Timer1 = 62500
    Stop Timer1
    Incr Zmienna
    Setfont Font8x8
    If Zmienna = 3 Then Lcdat 2 , 0 , Czas_otwarcia
    If Zmienna = 4 Then Lcdat 3 , 0 , Czas_otwarcia
    If Zmienna = 5 Then Lcdat 2 , 64 , Czas_otwarcia
    If Zmienna = 6 Then Lcdat 3 , 64 , Czas_otwarcia
    ...' dalsza czesc programu

    problem w tym iz to jest w petli nieskonczonej i chodzi o to ze na wyswietlaczy widze 4 rozne czasy :/ jak to mozliwe :/
    dla zmiennej 3 czas otwarcia wynosi 96
    dla zmiennej 4 czas otwarcia wynosi 42
    dla zmiennej 5 czas otwarcia wynosi 246
    dla zmiennej 6 czas otwarcia wynosi 193

    pytanie mam takie

    dlaczego czasy sa rozne? na moj sposob myslenia powinny byc takie same:/
  • REKLAMA
  • #2 2970681
    roiman
    Poziom 14  
    Posty: 88
    Pomógł: 7
    Ocena: 2
    najprawdopodobniej liczenie timera nie zaczyna sie zawsze od tej samej wartosci , moge pomoc tylko musze wiecej wiedziec najlepij wklej caly kod, na pocatek mozesz zmienic timer1=0 na " Load Timer1, 0 "
  • REKLAMA
  • #3 2970691
    maniio
    Poziom 14  
    Posty: 149
    Pomógł: 3
    Ocena: 9
    $lib "glcdks108.lbx"
    $lib "double.lbx"
    '$lib "i2c.LBX"
    $crystal = 16000000
    $regfile = "m32def.dat"
    $include "font8x8.font"
    
    
    Config Graphlcd = 128 * 64sed , Dataport = Porta , Controlport = Portc , Ce = 2 , Ce2 = 3 , Cd = 5 , Rd = 6 , Reset = 1 , Enable = 7
    Disable Adc
    
    Config Pinb.1 = Input                                       'wtryskiwacz
    Config Pinb.2 = Input                                       'wtryskiwacz
    Config Pinc.0 = Input                                       'key2
    Config Pind.2 = Input                                       'key1
    Config Pind.3 = Input                                       'imp_predkosci
    Config Pind.5 = Input                                       'power down
    
    
    Config Pinb.6 = Output                                      'buzzer
    Config Pinb.3 = Output                                      'podswietlanie led
    
    Config 1wire = Pind.7                                       'konfiguracja 1-wire
    Config Timer1 = Timer , Prescale = 64                       'timer mierzący czas otwarcia wtryskiwacza
    Config Int2 = Falling
    Config Int1 = Falling
    
    
    Config Scl = Portd.0                                        'konfiguracja I2C
    Config Sda = Portd.1                                        'konfiguracja I2C
    
    
    Set Portb.1
    Set Portb.2
    Set Portc.0
    Set Portd.2
    Set Portd.3
    Set Portd.5
    
    Declare Sub Convallt                                        'deklaracja procedury do odczytu 1-wire
    Declare Function Decigrades(byval Sc(9) As Byte) As Integer 'deklaracja funkcji okreslajacej ID czujników
    
    Const Stala_drogi = 100000                                  'stala drogi 100km = 100 000m
    
    
    
    Const Stala_wtrysku = 213                                   ' stala dla czasu 3ms 'stala wtrysku - wyznaczona doswiadczalnie
    'Const Stala_wtrysku = 800                                  ' stala dla czasu 3,2 ms 'stala wtrysku - wyznaczona doswiadczalnie
    'Const Stala_wtrysku = 1250                                  ' stala dla czasu 5ms 'stala wtrysku - wyznaczona doswiadczalnie
    Const Stala_paliwowa = 6.1                                  'stala paliwawa - warunek wyznaczenia stalej wtrysku, podany przez producenta
    
    Dim Przycisk As Byte                                        ' zmienna licznikowa od przycisku
    Dim Dsid1(8) As Byte                                        'tablica do ID ds18s20
    Dim Dsid2(8) As Byte                                        'tablica do ID ds18s20
    Dim Sc(9) As Byte                                           'tablica pomocnicza
    Dim Dg As Integer                                           'wartosc temperatury
    Dim Imp_predkosci As Byte                                   'zmienna licznikowa od czujnika predkosci
    Dim Czas_otwarcia As Byte                                   'czas otwarcia wtryskiwacza
    
    Dim Metr As Byte                                            'zmienna pomocnicza 0 - 100m
    Dim Droga As Byte                                           'ulamkowa wartosc przebiegu 0.1 - 0.9 km
    Dim Przebieg As Word                                        'calkowita wartosc przebiegu 1 - 99 999km
    
    Dim Pkt_chwilowe As Byte                                    'zmienna pomocnicza do ustawienia kursora
    Dim Pkt_srednie As Byte                                     'zmienna pomocnicza do ustawienia kursora
    Dim Pkt_przebieg As Byte                                    'zmienna pomocnicza do ustawienia kursora
    Dim Pkt_zasieg As Byte
    Dim Pkt_ilosc As Byte
    Dim Pkt_calkowite As Byte
    Dim Chwilowe_spalanie As Single                             'wartosc chwilowego zuzycia paliwa
    Dim Chwilowe As Single                                      'zmienna pomocnicza
    Dim Calkowite_spalanie As Single                            'wartosc calkowitego zuzycia paliwa
    Dim Calkowite As Single                                     'zmienna pomocnicza
    
    Dim Chwilowe_spal_cz_ul_single As Single
    Dim Chwilowe_spal_cz_cal As Byte
    Dim Chwilowe_spal_cz_ul As Byte
    Dim Licznik_chwilowe As Byte
    
    Dim Srednie_spal_cz_ul_single As Single
    Dim Srednie_spal_cz_cal As Byte
    Dim Srednie_spal_cz_ul As Byte
    Dim Srednie_spalanie As Single
    
    Dim Calkowite_spal_cz_ul_single As Single
    Dim Calkowite_spal_cz_cal As Byte
    Dim Calkowite_spal_cz_ul As Byte
    
    Dim Zasieg As Word
    Dim Zasieg_single As Single
    Dim Poziom_paliwa As Single
    
    Dim Flaga_key_1 As Bit
    Dim Kasowanie As Bit
    Dim Juz_wyswietlone As Byte
    Dim Flaga As Byte                                           'flaga opoznienia na konwersje temperatury
    Dim Wyswietl As Bit                                         'opoznienie 1s , co 1s wyswietlenie
    Dim Flaga_wtrysku As Bit                                    'flaga wtrysku, ustawiona jezeli jest wtrysk
    Dim Flaga_predkosci As Bit
    Dim Sekunda As Byte
    Dim Minuta As Byte
    Dim Godzina As Byte
    Dim Dzien As Byte
    Dim Miesiac As Byte
    Dim Rok As Word
    
    
    Dim Stara_sekunda As Byte
    Dim Poziom As Byte
    Dim Odczyt As Byte
    Dim Ilosc_paliwa As Byte
    Dim Zmienna As Byte
    
    Enable Interrupts
    
    
    Enable Timer1
    
    
    
    
    
    'On Int1 Wtryskiwacz
    On Int2 Pomiar_drogi
    
    '-------------------------------------------------------------------------------
                         'deklaracja aliasow
    '-------------------------------------------------------------------------------
    Led Alias Portb.3
    Key_1 Alias Pind.2
    Key_2 Alias Pinc.0
    We Alias Pinb.1
    Power_down Alias Pind.5
    Buzzer Alias Portb.6
    We2 Alias Pind.3
    '-------------------------------------------------------------------------------
                         'ustawianie zmiennych
    '-------------------------------------------------------------------------------
    Przebieg = 0
    Flaga = 0
    Wyswietl = 0
    Droga = 0
    Imp_predkosci = 0
    Metr = 0
    Przycisk = 1
    Buzzer = 1
    Led = 0
    Juz_wyswietlone = 0
    Flaga_key_1 = 0
    Flaga_predkosci = 0
    
    Pkt_przebieg = 96
    Pkt_chwilowe = 20
    Pkt_srednie = 20
    
    Stara_sekunda = 61
    '---------------------------------------ustawienie ukladow 1-wire---------------
    Mcucr = &B00000010
    Dsid1(1) = 1wsearchfirst()                                  'zapisanie ID pierwszego znalezionego ukladu
    Do
     Dsid2(1) = 1wsearchnext()                                  'zapisanie ID kolejnego znalezionego ukladu
    Loop Until Err = 1
    Poczatek:
    '---------------------------------nastawienie zegarka---------------------------
    Cls
    If Key_2 = 0 Then
    Waitms 50
    Cls
    Waitms 500
    Gosub Ustaw_czas
    Przycisk = 1
    End If
    Disable Interrupts
    Showpic 0 , 0 , Ford_logo
    Wait 1
    Cls
    Waitms 200
    Enable Interrupts
    'Enable Int1
    Enable Int2
    
    
    
    
    
    
    
    
    
    '-------------------------------------------------------------------------------
                                      'program główny
    '-------------------------------------------------------------------------------
    Do
    If Key_1 = 0 Then
       Waitms 40
       Do
       If Key_2 = 0 Then Kasowanie = 1
       Loop Until Key_1 = 1
       Waitms 40
       Incr Przycisk
       If Przycisk = 5 Then Przycisk = 1
    End If
    
    
    
    
    Timer1 = 0
    Start Timer1
    Waitus 250
    Do
       If We2 = 1 Then Incr Czas_otwarcia 'caly czas jest 1
    Loop Until Timer1 = 62500
    Stop Timer1
    Incr Zmienna
    Setfont Font8x8
    If Zmienna = 3 Then Lcdat 2 , 0 , Czas_otwarcia
    If Zmienna = 4 Then Lcdat 3 , 0 , Czas_otwarcia
    If Zmienna = 5 Then Lcdat 2 , 64 , Czas_otwarcia
    If Zmienna = 6 Then Lcdat 3 , 64 , Czas_otwarcia
    
    Gosub Odczytaj_czas
    
    If Sekunda <> Stara_sekunda Then
       Wyswietl = 1
       Stara_sekunda = Sekunda
    End If
    '---------------------------------wyznaczenie stalej wtrysku--------------------
    If Key_2 = 0 Then
    Wait 1
    Lcdat 3 , 0 , Czas_otwarcia
    End If
    
    
    
    '---------------------------------kasowanie-------------------------------------
    If Kasowanie = 1 Then
       Kasowanie = 0
       Metr = 0
       Droga = 0
       Przebieg = 0
       Calkowite_spalanie = 0
    
    End If
    
    '---------------------------------POWERDOWN-------------------------------------
    '(
    If Power_down = 0 Then
       Led = 1
       Portc.2 = 1
       Glcdcmd &B00111110
       Portc.7 = 1
       Glcdcmd &B00111110
       'zapisanie zmiennych do pamieci
       Writeeeprom Metr , 1
       Writeeeprom Droga , 3
       Writeeeprom Przebieg , 4
       Writeeeprom Calkowite_spalanie , 6
    
       Powersave
       'Odczytanie Zmiennych Z Pamieci
       Readeeprom Metr , 1
       Readeeprom Droga , 3
       Readeeprom Przebieg , 4
       Readeeprom Calkowite_spalanie , 6
    
       Portc.2 = 1
       Glcdcmd &B00111111
       Portc.7 = 1
       Glcdcmd &B00111111
       Led = 0
       Goto Poczatek
    End If
    ')                                                     '
    
    '--------------------------------POMIAR DROGI-----------------------------------
    If Metr >= 100 Then
          Incr Droga                                            'droga <- wartosc ulamkowa z przejechanego dystansu
          Metr = 0                                              'metr <- ilosc przejechanych metrow
          If Droga = 10 Then
             Incr Przebieg                                      'przebieg <- przebieg auta
             If Przebieg > 99999 Then Przebieg = 0
             Droga = 0
          End If
    End If
    '--------------------------------POMIAR CHWILOWEGO ZUZYCIA----------------------
       Chwilowe_spalanie = Czas_otwarcia / Stala_wtrysku
       Chwilowe_spalanie = Chwilowe_spalanie * Stala_paliwowa
       Chwilowe_spal_cz_cal = Int(chwilowe_spalanie)            'wyznaczenie czesci calkowitej z chwilowego zuzycia paliwa
       Chwilowe_spal_cz_ul_single = Frac(chwilowe_spalanie)
       Chwilowe_spal_cz_ul_single = Chwilowe_spal_cz_ul_single * 10
       Chwilowe_spal_cz_ul = Int(chwilowe_spal_cz_ul_single)    'wyznaczenie czesci ulamkowej z chwilowego zuzycia paliwa
    
    
    '--------------------------------POMIAR CALKOWITEGO ZUZYCIA---------------------
    'If Wyswietl = 1 Then
       Calkowite = Chwilowe / Stala_drogi
       Calkowite = Calkowite * Metr                             ' wartosc zuzytego paliwa w ciagu 1s
       Calkowite_spalanie = Calkowite_spalanie + Calkowite      'calkowite_spalanie <- wartosc calkowitego zuzycia paliwa
       Calkowite_spal_cz_cal = Int(calkowite_spalanie)          'wyznaczenie czesci calkowitej z calkowitego zuzycia paliwa
       Calkowite_spal_cz_ul_single = Frac(calkowite_spalanie)
       Calkowite_spal_cz_ul_single = Calkowite_spal_cz_ul_single * 10
       Calkowite_spal_cz_ul = Int(calkowite_spal_cz_ul_single)  'wyznaczenie czesci ulamkowej z chwilowego zuzycia paliwa
    'End If
    '-------------------------------POMIAR SREDNIEGO ZUZYCIA------------------------
    'If Wyswietl = 1 Then
       Srednie_spalanie = Calkowite_spalanie / Przebieg
       Srednie_spalanie = Srednie_spalanie * 100                'srednie_spalanie <- wartosc sredniego zuzycia paliwa
       Srednie_spal_cz_cal = Int(srednie_spalanie)              'wyznaczenie czesci calkowitej z sredniego zuzycia paliwa
       Srednie_spal_cz_ul_single = Frac(srednie_spalanie)
       Srednie_spal_cz_ul_single = Srednie_spal_cz_ul_single * 10
       Srednie_spal_cz_ul = Int(srednie_spal_cz_ul_single)      'wyznaczenie czesci ulamkowej z sredniego zuzycia paliwa
    'End If
    
    
    If Key_1 = 0 Then
       Waitms 40
       Do
       If Key_2 = 0 Then Kasowanie = 1
       Loop Until Key_1 = 1
       Waitms 40
       Incr Przycisk
       If Przycisk = 5 Then Przycisk = 1
    End If
    '(
    Select Case Przycisk                                        'wybor menu w zaleznosci od wartosci PRZYCISK
    
    Case 1:                                                     'menu1 - chwilowe zuzycie + przebieg
    
             If Juz_wyswietlone <> 1 Then
    
                Cls
                Disable Interrupts
                Showpic 0 , 17 , Lcd_zuzycie_chwilowe
                Showpic 66 , 17 , Lcd_przebyta_droga
                Enable Interrupts
                Pset 27 , 30 , 255
                Pset 27 , 29 , 255
                Pset 26 , 30 , 255
                Pset 26 , 29 , 255
                Pset 102 , 30 , 255
                Pset 102 , 29 , 255
                Pset 103 , 30 , 255
                Pset 103 , 29 , 255
                Juz_wyswietlone = Przycisk
                If Chwilowe_spal_cz_cal > 9 Then Pkt_chwilowe = 12
                If Przebieg > 9 And Przebieg <= 99 Then Pkt_przebieg = 88
                If Przebieg > 99 And Przebieg <= 999 Then Pkt_przebieg = 80
                If Przebieg > 999 And Przebieg <= 9999 Then Pkt_przebieg = 72
                If Przebieg > 9999 And Przebieg <= 99999 Then Pkt_przebieg = 64
                If Chwilowe_spal_cz_cal > 99 Then Chwilowe_spal_cz_cal = 99
                Setfont Font8x8
                Lcdat 4 , 29 , Chwilowe_spal_cz_ul
                Lcdat 4 , Pkt_chwilowe , Chwilowe_spal_cz_cal
                Lcdat 4 , 105 , Droga
                Lcdat 4 , Pkt_przebieg , Przebieg
                Gosub Pokaz_czas
             End If
    
             If Wyswietl = 1 Then
                If Chwilowe_spal_cz_cal > 9 Then Pkt_chwilowe = 12
                If Przebieg > 9 And Przebieg <= 99 Then Pkt_przebieg = 88
                If Przebieg > 99 And Przebieg <= 999 Then Pkt_przebieg = 80
                If Przebieg > 999 And Przebieg <= 9999 Then Pkt_przebieg = 72
                If Przebieg > 9999 And Przebieg <= 99999 Then Pkt_przebieg = 64
                If Chwilowe_spal_cz_cal > 99 Then Chwilowe_spal_cz_cal = 99
                Setfont Font8x8
                Lcdat 4 , 29 , Chwilowe_spal_cz_ul
                Lcdat 4 , Pkt_chwilowe , Chwilowe_spal_cz_cal
                Lcdat 4 , 105 , Droga
                Lcdat 4 , Pkt_przebieg , Przebieg
                Gosub Pokaz_czas
                Lcdat 1 , 41 , Sekunda
                Wyswietl = 0
             End If
    
    Case 2:                                                     'menu2 - temperatura wewnetrzna i zewnetrzna
    
    If Juz_wyswietlone <> 2 Then
             Cls
             Disable Interrupts
             Showpic 0 , 17 , Lcd_temp_wew
             Showpic 66 , 17 , Lcd_temp_zew
             Enable Interrupts
             Juz_wyswietlone = Przycisk
             Gosub Pokaz_czas
    End If
    
    
    If Wyswietl = 1 Then
       Setfont Font8x8
       Gosub Pokaz_czas
       If Flaga = 0 Then
          Call Convallt
       End If
       Incr Flaga
       If Flaga = 2 Then
          Flaga = 0
          1wverify Dsid1(1)
          If Err = 1 Then
             Lcdat 1 , 1 , "DsId1 no"
             Elseif Err = 0 Then
             1wwrite &HBE
             Sc(1) = 1wread(9)
             If Sc(9) = Crc8(sc(1) , 8) Then
                Dg = Decigrades(sc(9))
                Dg = Dg / 10
                Lcdat 4 , 23 , Dg
             End If
          End If
          1wverify Dsid2(1)
          If Err = 1 Then
             Lcdat 1 , 65 , "DsId2 no"
             Elseif Err = 0 Then
             1wwrite &HBE
             Sc(1) = 1wread(9)
             If Sc(9) = Crc8(sc(1) , 8) Then
                Dg = Decigrades(sc(9))
                Dg = Dg / 10
                Lcdat 4 , 89 , Dg
             End If
          End If
       End If
       Wyswietl = 0
    End If
    
    Case 3:                                                     'menu3 - srednie i calkowite zuzycie paliwa
    
             Pkt_calkowite = 86
             If Juz_wyswietlone <> 3 Then
    
                Cls
                Disable Interrupts
                Showpic 0 , 17 , Lcd_zuzycie_srednie
                Showpic 66 , 17 , Lcd_zuzycie_calkowite
                Enable Interrupts
                If Srednie_spal_cz_cal > 9 Then Pkt_srednie = 12
                Pset 27 , 30 , 255
                Pset 27 , 29 , 255
                Pset 26 , 30 , 255
                Pset 26 , 29 , 255
                Pset 93 , 30 , 255
                Pset 93 , 29 , 255
                Pset 92 , 30 , 255
                Pset 92 , 29 , 255
                Juz_wyswietlone = Przycisk
                If Srednie_spal_cz_cal > 9 Then Pkt_srednie = 12
                If Calkowite_spal_cz_cal > 9 And Calkowite_spal_cz_cal <= 99 Then Pkt_calkowite = 78
                If Calkowite_spal_cz_cal > 99 Then Pkt_calkowite = 70
                Setfont Font8x8
                Lcdat 4 , 29 , Srednie_spal_cz_ul
                Lcdat 4 , Pkt_srednie , Srednie_spal_cz_cal
                Lcdat 4 , 95 , Calkowite_spal_cz_ul
                Lcdat 4 , Pkt_calkowite , Calkowite_spal_cz_cal
                Gosub Pokaz_czas
             End If
             If Wyswietl = 1 Then
                If Srednie_spal_cz_cal > 9 Then Pkt_srednie = 12
                If Calkowite_spal_cz_cal > 9 And Calkowite_spal_cz_cal <= 99 Then Pkt_calkowite = 78
                If Calkowite_spal_cz_cal > 99 Then Pkt_calkowite = 70
                Setfont Font8x8
                Lcdat 4 , 29 , Srednie_spal_cz_ul
                Lcdat 4 , Pkt_srednie , Srednie_spal_cz_cal
                Lcdat 4 , 95 , Calkowite_spal_cz_ul
                Lcdat 4 , Pkt_calkowite , Calkowite_spal_cz_cal
                Gosub Pokaz_czas
                Wyswietl = 0
             End If
    
    
    Case 4:                                                     'poziom ilosci paliwa + szacowany mozlwy dystans do przejechania
    
             Pkt_zasieg = 105
             Pkt_ilosc = 35
             If Juz_wyswietlone <> 4 Then
    
                Cls
                Disable Interrupts
                Showpic 0 , 17 , Lcd_poziom_paliwa
                Showpic 66 , 17 , Lcd_zasieg
                Enable Interrupts
                Juz_wyswietlone = Przycisk
                Gosub Pokaz_czas
                Gosub Odczyt_paliwa
                Poziom_paliwa = Poziom_paliwa + Poziom
                If Odczyt = 10 Then
                '            If Odczyt = 240 Then
                   Poziom_paliwa = Poziom_paliwa / Odczyt
                   Ilosc_paliwa = Int(poziom_paliwa)
                End If
    
                Zasieg_single = Srednie_spalanie / Ilosc_paliwa
                Zasieg_single = 100 / Zasieg_single
                Zasieg = Int(zasieg_single)
                If Zasieg > 9 And Zasieg <= 99 Then Pkt_zasieg = 96
                If Zasieg > 99 And Zasieg <= 999 Then Pkt_zasieg = 88
                If Zasieg > 999 And Zasieg <= 9999 Then Pkt_zasieg = 80
                If Zasieg > 9999 And Zasieg <= 99999 Then Pkt_zasieg = 72
                If Ilosc_paliwa > 9 And Ilosc_paliwa <= 99 Then Pkt_ilosc = 26
                Setfont Font8x8
                Lcdat 4 , Pkt_ilosc , Ilosc_paliwa
                Lcdat 4 , Pkt_zasieg , Zasieg
             End If
    
             If Wyswietl = 1 Then
    
                Gosub Pokaz_czas
                Gosub Odczyt_paliwa
                Poziom_paliwa = Poziom_paliwa + Poziom
                If Odczyt = 10 Then
                '            If Odczyt = 240 Then
                   Poziom_paliwa = Poziom_paliwa / Odczyt
                   Ilosc_paliwa = Int(poziom_paliwa)
                End If
    
                Zasieg_single = Srednie_spalanie / Ilosc_paliwa
                Zasieg_single = 100 / Zasieg_single
                Zasieg = Int(zasieg_single)
                If Zasieg > 9 And Zasieg <= 99 Then Pkt_zasieg = 96
                If Zasieg > 99 And Zasieg <= 999 Then Pkt_zasieg = 88
                If Zasieg > 999 And Zasieg <= 9999 Then Pkt_zasieg = 80
                If Zasieg > 9999 And Zasieg <= 99999 Then Pkt_zasieg = 72
                If Ilosc_paliwa > 9 And Ilosc_paliwa <= 99 Then Pkt_ilosc = 26
                Setfont Font8x8
                Lcdat 4 , Pkt_ilosc , Ilosc_paliwa
                Lcdat 4 , Pkt_zasieg , Zasieg
                Wyswietl = 0
             End If
      End Select
    ')
      Loop
    End                                                         'koniec programu
    '-------------------------------------------------------------------------------
                         'odczyt temperatury
    '-------------------------------------------------------------------------------
    Sub Convallt
       1wreset
       1wwrite &HCC
       1wwrite &H44
    End Sub
    
    Function Decigrades(byval Sc(9) As Byte)
       Dim Tmp As Byte , T As Integer , T1 As Integer
       Tmp = Sc(1) And 1
       If Tmp = 1 Then Decr Sc(1)
       T = Makeint(sc(1) , Sc(2))
       T = T * 50
       T = T - 25
       T1 = Sc(8) - Sc(7)
       T1 = T1 * 100
       T1 = T1 / Sc(8)
       T = T + T1
       Decigrades = T / 10
    End Function
    
    
    '-------------------------------------------------------------------------------
                         'Pomiar drogi
    '-------------------------------------------------------------------------------
    Pomiar_drogi:
       Disable Int2
          Incr Imp_predkosci
          If Imp_predkosci = 4 Then
          Imp_predkosci = 0
          Incr Metr
          End If
       Enable Int2
    Return
    '-------------------------------------------------------------------------------
                         'pomiar czasu otwarcia wtryskiwacza
    '-------------------------------------------------------------------------------
    Wtryskiwacz:
       Disable Int1
          Timer1 = 0
          Start Timer1
             Do
             Lcdat 2 , 0 , Timer1
             Loop Until We2 = 1
             Czas_otwarcia = Timer1
             Flaga_wtrysku = 1
    
       Enable Int1
    Return
    
    '-------------------------------------------------------------------------------
                         'RTC
    '-------------------------------------------------------------------------------
    
    '---------------------------------pokaz czas------------------------------------
    Pokaz_czas:
    
                If Godzina < 10 Then
                   Lcdat 1 , 0 , "0"
                   Lcdat 1 , 8 , Godzina
                   Else
                   Lcdat 1 , 0 , Godzina
                End If
                Lcdat 1 , 16 , ":"
                If Minuta < 10 Then
                   Lcdat 1 , 24 , "0"
                   Lcdat 1 , 32 , Minuta
                   Else
                   Lcdat 1 , 24 , Minuta
                End If
                If Dzien < 10 Then
                   Lcdat 1 , 64 , "0"
                   Lcdat 1 , 72 , Dzien
                   Else
                   Lcdat 1 , 64 , Dzien
                End If
                Lcdat 1 , 80 , "-"
                If Miesiac < 10 Then
                   Lcdat 1 , 88 , "0"
                   Lcdat 1 , 96 , Miesiac
                   Else
                   Lcdat 1 , 88 , Miesiac
                End If
                Lcdat 1 , 104 , "-"
                If Rok < 10 Then
                   Lcdat 1 , 112 , "0"
                   Lcdat 1 , 120 , Rok
                   Else
                   Lcdat 1 , 112 , Rok
                End If
    
    Return
    
    '-------------------------------------odczytaj czas-----------------------------
    Odczytaj_czas:
       I2cstart
       I2cwbyte 208
       I2cwbyte 0
       I2cstop
       Waitms 10
       I2cstart
       I2cwbyte 209
       I2crbyte Sekunda , Ack
       I2crbyte Minuta , Ack
       I2crbyte Godzina , Ack
       I2crbyte Dzien , Ack
       I2crbyte Dzien , Ack
       I2crbyte Miesiac , Ack
       I2crbyte Rok , Nack
       I2cstop
       Waitms 10
       Rok = Makedec(rok)
       Miesiac = Makedec(miesiac)
       Dzien = Makedec(dzien)
       Godzina = Makedec(godzina)
       Minuta = Makedec(minuta)
       Sekunda = Makedec(sekunda)
    Return
    
    '---------------------------------------ustaw czas------------------------------
    Ustaw_czas:
    
    Setfont Font8x8
    Sekunda = 0
    Minuta = 0
    Godzina = 0
    Dzien = 1
    Miesiac = 1
    Rok = 6
    Gosub Pokaz_czas
    Lcdat 3 , 0 , "                "
    Lcdat 3 , 0 , "ustaw godzine"
    Wait 1
    Do
    If Key_2 = 0 Then
    Waitms 250
    Incr Godzina
    End If
    If Godzina > 24 Then Godzina = 0
    If Godzina < 10 Then
       Lcdat 1 , 0 , "0"
       Lcdat 1 , 8 , Godzina
       Else
       Lcdat 1 , 0 , Godzina
    End If
    Loop Until Key_1 = 0
    Waitms 50
    
    Gosub Pokaz_czas
    Lcdat 3 , 0 , "                "
    Lcdat 3 , 0 , "ustaw minuty"
    Do
    If Key_2 = 0 Then
    Waitms 250
    Incr Minuta
    End If
    If Minuta > 59 Then Minuta = 0
    If Minuta < 10 Then
       Lcdat 1 , 24 , "0"
       Lcdat 1 , 32 , Minuta
       Else
       Lcdat 1 , 24 , Minuta
       End If
    Loop Until Key_1 = 0
    Waitms 50
    
    Gosub Pokaz_czas
    Lcdat 3 , 0 , "                "
    Lcdat 3 , 0 , "ustaw dzien"
    Do
    
    If Key_2 = 0 Then
    Waitms 250
    Incr Dzien
    End If
    If Dzien > 31 Then Dzien = 0
    If Dzien < 10 Then
       Lcdat 1 , 64 , "0"
       Lcdat 1 , 72 , Dzien
       Else
       Lcdat 1 , 64 , Dzien
    End If
    Loop Until Key_1 = 0
    Waitms 50
    
    Gosub Pokaz_czas
    Lcdat 3 , 0 , "                "
    Lcdat 3 , 0 , "ustaw miesiac"
    Do
    If Key_2 = 0 Then
    Waitms 250
    Incr Miesiac
    End If
    If Miesiac > 12 Then Miesiac = 0
    If Miesiac < 10 Then
       Lcdat 1 , 88 , "0"
       Lcdat 1 , 96 , Miesiac
       Else
       Lcdat 1 , 88 , Miesiac
    End If
    Loop Until Key_1 = 0
    Waitms 50
    
    Gosub Pokaz_czas
    Lcdat 3 , 0 , "                "
    Lcdat 3 , 0 , "ustaw rok"
    Do
    If Key_2 = 0 Then
    Waitms 250
    Incr Rok
    End If
    If Rok > 99 Then Rok = 0
    If Rok < 10 Then
       Lcdat 1 , 112 , "0"
       Lcdat 1 , 120 , Rok
       Else
       Lcdat 1 , 112 , Rok
    End If
    Loop Until Key_1 = 0
    Waitms 50
    
    
       Rok = Makebcd(rok)
       Miesiac = Makebcd(miesiac)
       Dzien = Makebcd(dzien)
       Godzina = Makebcd(godzina)
       Minuta = Makebcd(minuta)
       Sekunda = Makebcd(sekunda)
       I2cstart
       I2cwbyte 208
       I2cwbyte 0
       I2cwbyte Sekunda
       I2cwbyte Minuta
       I2cwbyte Godzina
       I2cwbyte 0
       I2cwbyte Dzien
       I2cwbyte Miesiac
       I2cwbyte Rok
       I2cwbyte &B00010000
       I2cstop
       Waitms 10
    Return
    '-----------------------------------oczytaj poziom paliwa-----------------------
    Odczyt_paliwa:
    
    I2cstart
    I2cwbyte 144
    I2cwbyte 0
    I2cstart
    I2cwbyte 145
    I2crbyte Poziom , Ack
    I2crbyte Poziom , Nack
    I2cstop
    Incr Odczyt
    
    Waitms 10
    
    Return
    
    
    
    
    '-------------------------------------------------------------------------------
                         'logo
    '-------------------------------------------------------------------------------
    Ford_logo:
    $bgf "ford_logo.bgf"
    Lcd_temp_wew:
    $bgf "lcd_temp_wew.bgf"
    Lcd_temp_zew:
    $bgf "lcd_temp_zew.bgf"
    Lcd_poziom_paliwa:
    $bgf "lcd_poziom_paliwa.bgf"
    Lcd_przebyta_droga:
    $bgf "lcd_przebyta_droga.bgf"
    Lcd_zasieg:
    $bgf "lcd_zasieg.bgf"
    Lcd_zuzycie_calkowite:
    $bgf "lcd_zuzycie_calkowite.bgf"
    Lcd_zuzycie_chwilowe:
    $bgf "lcd_zuzycie_chwilowe.bgf"
    Lcd_zuzycie_srednie:
    $bgf "lcd_zuzycie_srednie.bgf"
  • #4 2970827
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    maniio napisał:
    witam!
    mam problem z timerem1 opis problemu ponizej:
    ...
    
    .... 'jakis tamprogram sobie leci po czym sa nastepujace komendy
    Timer1 = 0
    Start Timer1
    Waitus 250
    Do
       If We2 = 1 Then Incr Czas_otwarcia 'caly czas jest 1
    Loop Until Timer1 = 62500
    ...
    


    pytanie mam takie
    dlaczego czasy sa rozne? na moj sposob myslenia powinny byc takie same:/

    Odpowiedź jest "idiotycznie" prosta ;)
    W pętli porównujesz pracujący licznik z wartością 62500 i to że trafisz na taką wartość w momencie odczytywania rejestrów TCNT1 , jest jak podrapanie latającej muchy po brzuszku , przy 1-szej próbie - mało prawdopodobne :D
    Zmień warunek z Timer1=62500 na Timer1=>62500 , lub Timer1>62499.

    Piotrek
  • #5 2970999
    roiman
    Poziom 14  
    Posty: 88
    Pomógł: 7
    Ocena: 2
    Cytat:
    Odpowiedź jest "idiotycznie" prosta
    W pętli porównujesz pracujący licznik z wartością 62500 i to że trafisz na taką wartość w momencie odczytywania rejestrów TCNT1 , jest jak podrapanie latającej muchy po brzuszku , przy 1-szej próbie - mało prawdopodobne
    Zmień warunek z Timer1=62500 na Timer1=>62500 , lub Timer1>62499.

    nie do konca sie zgadzam z kolega zumek dlatego ze timer jest zwiekszany w tym przypadku co 64 takty procesora niesadze aby ta mala pentelka az tyle czasu potrebowala
  • REKLAMA
  • #6 2971056
    max_gg
    Poziom 26  
    Posty: 631
    Pomógł: 83
    Ocena: 26
    Policzmy:
    Procesor pracuje z zegarem 16MHz, to daje 62.5ns na takt.
    62.5ns*64t=4us
    Czyli Timer zwiększany jest co 4us
    Polecenie WAITUS 250 jest o wiele dłuższe od tej wartości, a tylko co któreś porównanie jest równe wielokrotności 4uS i wartości 62500 w liczniku...
    Czyli zumek ma rację...
  • REKLAMA
  • #7 2971951
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    max_gg napisał:
    ...Czyli zumek ma rację...

    Niestety , zumek nie miał racji , bo błędnie założył (patrząc tylko na fragment w 1-szym poście) , że prescale jest równy 1.
    Teraz by sie zrehabilitować , bardziej się przyłożył :D
    Biorąc pod uwagę , że We2 cały czas jest równe 1 , wyliczył że zmienna Czas_otwarcia , zostanie inkrementowana w tej pętelce , 148000 :!: razy .Ponieważ jest tylko Byte , to "przekręci" się mnóstwo razy w pętli DO LOOP UNTIL.Na dokładkę nigdzie nie jest zerowana przed wejściem w pętlę , więc takie cuda mogą się dziać.Jakoś dziwnie mi tu pasuje liczba 204.
    dla zmiennej 3 czas otwarcia wynosi 96+204 MOD 256 = 42
    dla zmiennej 4 czas otwarcia wynosi 42+204 MOD 256 = 246
    dla zmiennej 5 czas otwarcia wynosi 246+204 MOD 256 = 194
    dla zmiennej 6 czas otwarcia wynosi 193
    Coś w tym jest :)

    Piotrek
  • #8 2973193
    maniio
    Poziom 14  
    Posty: 149
    Pomógł: 3
    Ocena: 9
    dzieki panowie, poskutkowalo, wystarczylo dac wieksza zmienna i petle wylaczac warunkiem >=

    dzieki bardzo za pomoc

Podsumowanie tematu

✨ Problem dotyczył różnic w wartościach zmiennej Czas_otwarcia podczas pracy w nieskończonej pętli z wykorzystaniem Timer1 w mikrokontrolerze ATmega32. Zmienna była inkrementowana w pętli, która trwała do momentu osiągnięcia przez Timer1 wartości 62500. Różne czasy otwarcia wynikały z faktu, że licznik Timer1 nie był zerowany ani odpowiednio inicjalizowany przed każdą iteracją, a warunek zakończenia pętli sprawdzał dokładną równość Timer1=62500, co jest mało prawdopodobne ze względu na sposób działania licznika i preskaler. Ponadto zmienna Czas_otwarcia była typu Byte, co powodowało jej przepełnienia i nieoczekiwane wartości. Rozwiązaniem było użycie większego typu zmiennej do przechowywania czasu, zerowanie jej przed pętlą oraz zmiana warunku zakończenia pętli na Timer1 >= 62500, co zapewniło stabilne i spójne odczyty czasów otwarcia. Dyskusja zawierała także fragmenty kodu i konfigurację mikrokontrolera, potwierdzającą ustawienia preskalera i taktowania 16 MHz.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA