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

Efekt świetlny (nieustraszony) bascom attiny2313 błąd w kodz

miszczo997 29 Maj 2010 17:05 2470 5
REKLAMA
  • #1 8130560
    miszczo997
    Poziom 28  
    Witam
    Zaczynam naukę programowania w języku bascom
    Napisałem swój pierwszy kod ale program bascomavr widzi w nim błąd w ostatniej linii. Proszę o waszą pomoc
    $regfile "attiny2313.dat"
    $crystal = 1000
    
    Config Portb = Output                                       'wszystkie porty b jako wyjścia'
    Portb = &B00000000                                          'wszystkie porty b w stanie niskim
    Config Portd = Output                                       'wszystkie porty d jako wyjscia
    Portd = &B0000000                                           'wszystkie porty d w stani eniskim
    
    Do                                                          'zrob   (poczatek petli
    Portb.7 = 1
    Waitms 300                                                  'czekaj 0,3s
    Toggle Portb.7                                             'zmien wartosc portu b7
    Portb.6 = 1                                                 'ustaw port b6 na 1
    Waitms 300                                                  ''czekaj 0,3s
    Toggle Portb.6                                              'zmien wartosc portu b6
    Portb.5 = 1                                                 'Ustaw       port b5 na 1
    Waitms 300                                                  'czekaj 0,3s
    Toggle Portb.5
    Portb.4 = 1
    Waitms 300
    Toggle Portb.4
    Portb.3 = 1
    Waitms 300
    Toggle Portb.3
    Portb.2 = 1
    Waitms 300
    Toggle Portb.2
    Portb.1 = 1
    Waitms 300
    Toggle Portb.1
    Portb.0 = 1
    Waitms 300
    Toggle Portb.0
    Portb.1 = 1
    Waitms 300
    Toggle Portb.1
    Portb.2 = 1
    Waitms 300
    Toggle Portb.2
    Portb.3 = 1
    Waitms 300
    Toggle Portb.3
    Portb.4 = 1
    Waitms 300
    Toggle Portb.4
    Portb.5 = 1
    Waitms 300
    Toggle Portb.5
    Portb.6 = 1
    Waitms 300
    Toggle Portb.6
    Portb.7 = 1
    Waitms 300
    Toggle Portb.7
    
    
    
    
    
    Loop
    
    End


    Program ma robić efekt świetlny w którym diody tak jakby odbijają się od krawędzi

    =>błąd to
    error 70 line 58 BAUD rate not possible [-1]
  • REKLAMA
  • Pomocny post
    #2 8130590
    Przemo1268
    Poziom 20  
    jeżeli używasz kwarcu 1MHz to powinno być $crystal = 1000000 zamiast 1000 (częstotliwość podajemy w Hz, nie w kHz)
  • REKLAMA
  • #3 8130656
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • Pomocny post
    #4 8130767
    Przemo1268
    Poziom 20  
    Tu masz troszkę prościej, z użyciem operacji przesunięcia bitowego (krótszy kod, łatwiejsza zmiana prędkości linijki led)

    
    Dim Led As Byte
    Dim Kier As Bit
    
    Config Portb = Output                                       'wszystkie porty b jako wyjścia'
    Portb = &B00000000                                          'wszystkie porty b w stanie niskim
    Config Portd = Output                                       'wszystkie porty d jako wyjscia
    Portd = &B0000000                                           'wszystkie porty d w stani eniskim
    
    
    Led = 128                                                   'wartosc poczastkowa
    
    Do                                                          'zrob   (poczatek petli
    
    Portb = Led
    
    Waitms 300                                                  'czekaj 0,3s
    
    'Wybór kierunku
    If Led = 128 Then                                           'jezeli ostatnia dioda po lewej to przesuwamy w prawo
    Kier = 1
    Elseif Led = 1 Then                                         'jezeli ostatnia dioda po prawej to przesuwamy w lewo
    Kier = 0
    End If
    
    'przesunięcie bitowe
    If Kier = 1 Then
    Rotate Led , Right , 1                                      'jezeli kier = 1 to przesuwamy w prawo
    Else
    Rotate Led , Left , 1                                       'jezeli kier = 0 to przesuwamy w lewo
    End If
    
    Loop
    
    End
    
  • REKLAMA
  • #6 8158474
    Przemo1268
    Poziom 20  
    Drobiazg miszczo997 :D
    Odnośnie Twojego zapytania - musiał byś zastosować dla każdej z diod sterowanie PWM (modulacja szerokości impulsów). Ten procesor nie posiada aż 8 kanałów PWM, dlatego będziesz musiał zaimplementować to programowo. Ogólnie działa to na tej zasadzie, że masz stałą częstotliwość przebiegu prostokątnego a zmieniasz tylko czas trwania poziomu wysokiego (przy zachowaniu stałego okresu). Wtedy już nie sterujesz pinem na zasadzie set/reset, tylko musiał byś pod każdy z pinów zadeklarować zmienną np typu Byte i przypisać jej proporcjonalną do poziomu świecenia wartość (np 0 - led wyłączone, 255 led załączone na stałe). Za pomocą timera co jakiś tam czas zliczasz impulsy do zmiennej np licznik (typu Byte), liczysz do 255 i zaczynasz ponownie od 0. I teraz w każdym przerwaniu sprawdzasz, czy zmienna danego kanału jest większa od wartości licznika - jeżeli tak jest to pin odpowiadający danemu kanałowi ustawiasz w stan wysoki (set). W przeciwnym radzie go kasujesz (reset). W danym przerwaniu musisz w ten sposób przyrównać wszystkie kanały PWM. Po przyrównaniu zwiększasz licznik o jeden. Jeżeli aktualnie masz 255 to przypisujesz mu 0.
    W ten sposób zrobiłeś programowego PWMa. Teraz jeszcze tylko odpowiednie sterowanie jasnością i gotowe :)

    ----EDIT---
    Tutaj masz tajniki budowy oryginalnego skanera :)
REKLAMA