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

[Atmega8][Bascom] Zbyt wolne działanie programu.

15 Lut 2010 21:02 1883 12
  • Poziom 12  
    Panowie
    Piszę program w Bascomie do sterowania urządzeniem do cięcia drutu.
    Sam program jest prosty testowałem go w częściach na Attiny2313 i wszystko pieknie działa. Z uwagi na to że wykonuje operacje na liczbach zmiennoprzecinkowych
    potrzebuje więcej pamięci i zastosowałem Atmega8.

    Za żadne skarby nie mogę sobie poradzić z szybkością wykonywania programu...
    Dodam że przeczytałem większość wątków na elektrodzie z Atmega8!
    Mam prawidłowo ustawione fuse bity
    oscylator 8 MHz
    kombinowałem na różne sposoby...
    Stosując polecenie Waitms nie mogę uzyskać czasu opóźnienia mniejszego niz ok 10ms

    Panowie gdzie szukać przyczyny ???
    W Attiny2313 wszystko mi działa idealnie...



    Programuje przez Bascoma programatorem STK200/300



    Poprawiłem tytuł i treść - regulamin p.11.1, 15
    [zumek]
  • Poziom 29  
    Cytat:
    Stosując polecenie Waitms nie moge uzyskać czasu opóźnienia mniejszego niz ok 10ms
    Więc go nie stosuj. Do tego są Timery.
  • Poziom 12  
    Ale dlaczego w Attiny2313 wszystko działa... Zaskoczyło mnie to na maxa...
  • Poziom 29  
    dborycki napisał:
    Ale dlaczego w Attiny2313 wszystko działa...
    A skąd mamy wiedzieć? Nie widać programu.
  • Poziom 43  
    Bo może źle ustawiłeś FuseBity czy coś.
    Zapodaj program.
  • Poziom 12  
    Fuse bity mam przećwiczone i wszystko było ok....
    Program wygląda tak:
    Code:

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

    ' Program do sterowania maszyną do cięcia drutu
    Config Lcd = 20 * 2
    Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5 , E = Portd.1 , Rs = Portd.0

    ' Wyjścia do sterowania silnikiem krokowym

    Config Pinb.0 = Output                                      'Enable
    Config Pinb.1 = Output                                      'Direct
    Config Pinb.2 = Output                                      'Pull

    ' Węjścia przycisków

    Dim Krok As Single                                          'Zmienna określa jedek mikrokrok silnika (maxymalna wartość=400)
    Dim Krok_cal As Word
    Dim L As Word                                               'Długość drutu w [mm]
    Dim X As Word                                               'Ilość sztuk drutu
    Dim X_count As Word                                         'zmienna pomocnicza dla ilości drutu
    Dim I As Word                                               'zmienna pomocnicza dla dlugosci drutu

    Const C1 = 0.2355                                           'Stała (ilość mm na jedek krok silnika)

    Reset Portb.0
    Set Portb.1
    Set Portb.2

    Cls
    Cursor Off

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

    Krok1:
       Do

          Home
          Lcd "Podaj dlugosc drutu"
             Lowerline
          Lcd "L=" ; L ; " [mm] "

          Set Portc.5
          If Pinc.5 = 0 Then

             Waitus 100
             Incr L

          Else : End If



         Set Portc.4
          If Pinc.4 = 0 Then

             Waitus 100
             Decr L

          Else : End If


          Set Portc.3
          If Pinc.3 = 0 Then



             Goto Krok2

          Else : End If
          Toggle Portb.0                                        '
       Loop
    '-------------------------------------------------------------------------------

    Krok2:

          Do

          Home
          Lcd "Podaj ilosc sztuk"
             Lowerline
          Lcd "X=" ; X ; " [szt]"

          Set Portc.5
          If Pinc.5 = 0 Then

             Waitms 100
             Incr X

          Else : End If



          Set Portc.4
          If Pinc.4 = 0 Then

             Waitms 100
            Decr X

          Else : End If


          Set Portc.3
          If Pinc.3 = 0 Then

             Waitms 100

             Goto Posow

          Else : End If
                                       '
       Loop

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

    Posow:

     Cls

    Krok = L \ C1
    Krok_cal = Int(krok)

    I = 0
    X_count = 0

       Do

           Toggle Portb.0
              Waitms 1


           'Portb.0 = 0
             ' Waitms 1

          Incr I

         Home
         Lcd "I   " ; I
         Lowerline
         Lcd "X   " ; Krok


         If Krok_cal = I Then

            Incr X_count
            I = 0

            'utnij drut

                         If X_count = X Then

                            Goto Krok1
                         Else : End If

         Else : End If

         Set Portc.2
         If Pinc.2 = 0 Then
             Goto Krok1
         Else : End If

       Loop

    End

    Dodałem znaczniki [code] - proszę ich używać w przyszłości.
    [zumek]
  • Poziom 43  
    No to skoro wszystko było ok to po prostu wróć do poprzedniej wersji.
  • Poziom 12  
    Chodziło mi o to że Fuse Bity sa dobrze ustawione
    a procesor i tak działa bardzo wolno.
    Czy Atmega8 ma jakis wewnętrzny dzielnik sygnału zegarowego
    ustawiany jakimś fuse bitem?
  • Poziom 26  
    dborycki napisał:
    Czy Atmega8 ma jakis wewnętrzny dzielnik sygnału zegarowego
    ustawiany jakimś fuse bitem?


    Nie ma takiego fuse bitu.
  • Poziom 43  
    Ciężko mi uwierzyć że na ATMega8 działa to wolniej. Powinno działać szybciej bo ATMega8 ma kilka dodatkowych rozkazów w stosunku to ATTiny2313 (mul, muls itd.) które na pewno przyspieszyły by niektóre obliczenia.
    Na pewno dokładnie ten sam program wrzucasz na ATTiny2313 i na ATMega8 (oczywiście po zmianie portów i przekompilowaniu programu)?
  • Poziom 21  
    Napisz ten pogram w C, i zobacz jak się będzie zachowywał.
  • Poziom 43  
    A co to da? Nic. Nic jeżeli program będzie napisany tak jak teraz, czyli bez użycia przerwań a za to z użyciem waitusów.
    Co do szybkości działania to ja osobiście ie wierzę że na ATTiny2313 ten sam program działał szybciej. Na ATTiny2313 na pewno był sprawdzany inny program (bez LCD albo bez operacji na liczbach typu Single na przykład).
  • Poziom 12  
    Problem rozwiązałem dużo wcześniej ... a teraz znalazłem czas żeby wyjaśnić.
    Oczywiście problem tkwił w programie. W etykiecie "posow" w pętli za każdym razem wyświetlam zmienne "I" oraz "X" - zmiana stanu portu B.0 ograniczona była czasem wyświetlania zmiennych na LCD.