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

Obroty silnika Atmega8 - błąd w programie czy ustawienia fus

18 Lip 2010 15:30 1649 5
  • Poziom 20  
    Uruchomiłem wszystko zgodnie z tym ale nie wskazuje wyniku

    gdzie jest błąd

    Sygnał z generatora na razie podaje na pin D7

    Code:
    $regfile = "m8def.dat"
    
    $crystal = 8000000

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

    Dim Wynik As Long
    Config Timer1 = Counter , Edge = Rising                     'konfiguracja Timera do zliczania impulsów

    Cursor Off
    Cls

    Set Portd.7

    ' Miernik prędkości obrotowej
    'licznikiem 0...65535 jest Timer1

    Do
    Timer1 = 0
    Start Timer1
    Wait 1
    Stop Timer1

    Wynik = Timer1 / 1

    Cls
    Lcd "  Obrotomierz"
    Lowerline

    Lcd "P: " ; Wynik ; " obr/min"
    Cursor Off
    Loop
    End


    proszę o pomoc

    program zaciągnięty z sieci
  • Poziom 16  
    Witam.
    Skoro impulsy ma liczyć Timer1 to powinieneś je podać na PD5 a nie PD7. Pin PD7 to jedno z wejść komparatora analogowego.
  • Poziom 29  
    Code:
    Wynik = Timer1 / 1
    
    Po co to dzielenie?

    Czemu Wynik jest Long, skoro Timer1 mieści się w Word?
  • Poziom 17  
    Po uwagach kolegów kod wygląda tak
    Code:

    $regfile = "m8def.dat"
    $crystal = 8000000

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

    Dim Wynik As Word
    Config Timer1 = Counter , Edge = Rising                     'konfiguracja Timera do zliczania impulsów

    Cursor Off
    Cls

    Ddrd = &B11011111                                           'pin pd5 jako wejscie reszta jako wyjscie
    Portd = &B00100000                                          'pull-up do pd5 ale chyba to nie jest istotne

    ' Miernik prędkości obrotowej
    'licznikiem 0...65535 jest Timer1

    Do

    Timer1 = 0
    Start Timer1
    Wait 1
    Stop Timer1

    Wynik = Timer1
    Wynik = Wynik * 60  ' wynik mnożymy przez 60 poniewaz wynik ma być w obr/min a nie w obr/s
    Cls
    Lcd "  Obrotomierz"
    Lowerline

    Lcd "P: " ; Wynik ; " obr/min"
    Cursor Off
    Loop
    End


    Wejście zliczające to portd.5 oraz została dodana konfiguracja portu i dodam ,że program działa w symulatorze.

    Edit: Teraz wszystko się zgadza a jeżeli chodzi o konfiguracje portu to noga timera portd.5 jako wejście a podciągnięcie nie jest konieczne. Jeżeli mogę coś zasugerować to chyba lepiej mierzyć czas jednego obrotu.
  • Poziom 12  
    Po co konfigurujesz wejście timera1 (T1) jako wyjście?? Nie rób nic z T1.
  • Poziom 20  
    Ja raczej skłaniał bym się do takiego rozwiązania które wykorzystuje timer do odmierzenia jednostki czasu i jakiegoś pinu do wywołania przerwania bądź sprawdzenia czy jest = 0
    Code:

    Dim Wynik As Integer
    Dim Count As Integer , B As Word

    Config Timer1 = Timer , Prescale = 8
    Start Timer1
    'Timer określa jednostkę czasu (zależy od niego dokładność)


    Config Pind.3 = Input
    Set Pind.3

    On Int1 Licznik

    Enable Int1
    Config Int1 = Falling
    Enable Interrupts
    Cursor Off
    Cls

    Do
    B = Timer1

    If B > 65000 Then
       Wynik = Count * 10                                       ' * 60
    'trzeba dokładnie określić ten parametr gdyż wynik
    'wyświetlany na wyświetlaczu zależy od promioenia
    'na jakim został założony czujnik
          Timer1 = 0
          Count = 0
    End If

    Locate 1 , 4
    Lcd "Obrotomierz"
    Locate 2 , 1
    Lcd "P: " ; Wynik ; " obr/min"

    Loop
    End

    Licznik:
    Count = Count + 1
    Return