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

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

dborycki 15 Lut 2010 21:02 2048 12
REKLAMA
  • #1 7699841
    dborycki
    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]
  • REKLAMA
  • #2 7700036
    landy13
    Poziom 31  
    Cytat:
    Stosując polecenie Waitms nie moge uzyskać czasu opóźnienia mniejszego niz ok 10ms
    Więc go nie stosuj. Do tego są Timery.
  • #3 7700168
    dborycki
    Poziom 12  
    Ale dlaczego w Attiny2313 wszystko działa... Zaskoczyło mnie to na maxa...
  • REKLAMA
  • #4 7700237
    landy13
    Poziom 31  
    dborycki napisał:
    Ale dlaczego w Attiny2313 wszystko działa...
    A skąd mamy wiedzieć? Nie widać programu.
  • #5 7700241
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #6 7700482
    dborycki
    Poziom 12  
    Fuse bity mam przećwiczone i wszystko było ok....
    Program wygląda tak:
    
    $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]
  • #7 7700520
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #8 7700580
    dborycki
    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?
  • #9 7700613
    polprzewodnikowy
    Poziom 26  
    dborycki napisał:
    Czy Atmega8 ma jakis wewnętrzny dzielnik sygnału zegarowego
    ustawiany jakimś fuse bitem?


    Nie ma takiego fuse bitu.
  • #10 7701061
    Konto nie istnieje
    Poziom 1  
  • #11 7701336
    august_a
    Poziom 21  
    Napisz ten pogram w C, i zobacz jak się będzie zachowywał.
  • #12 7702391
    Konto nie istnieje
    Poziom 1  
  • #13 8948880
    dborycki
    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.
REKLAMA