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

[bascom][atmega8] Sterowanie dwoma silnikami + przerwania

pi1er 27 Lut 2010 21:35 1767 3
REKLAMA
  • #1 7760595
    pi1er
    Poziom 9  
    Steruje dwoma silnikami, jednak chciałbym aby jeden z nich się zatrzymał i zaczął cofać przez kilka sekund w momencie załączenia krańcówki. Podpięcie pinów opisane w kodzie. Krańcówka pod INT0 i pod INT1 i z drugiej strony do masy. Wąs = krańcówka.

    $regfile = "m8def.dat" 
    $crystal = 1000000 
    
    Config Portb.0 = Output                                     'dioda 
    Config Portd.7 = Output                                     'silnik lewy 1 
    Config Portd.6 = Output                                     'silnik lewy 2 
    Config Portb.5 = Output                                     'silnik prawy 2 
    Config Portb.4 = Output                                     'silnik prawy 1 
    
    Config Int0 = Falling                                       'do ziemi 
    Config Int1 = Falling                                       'do ziemi 
    
    Enable Interrupts                                           'zezwolenie na obsługę przerwań 
    Enable Int0 
    Enable Int1 
    
    On Int0 Lewo Nosave                                         ' obsługa przerwania INT0 - podprogram Zwieksz 
    On Int1 Prawo Nosave                                        ' obsługa przerwania INT1 - podprogram Zmniejsz 
    
    
    
    Portb.0 = 1 
    Wait 2 
    Portb.0 = 0 
    Portc.4 = 0 
    Portd.7 = 0 
    Portd.6 = 0 
    Portb.5 = 0 
    Portb.4 = 0 
    
    
    Wait 5 
    
    Do 
    
    Portd.7 = 1 
    Portb.4 = 1 
    Portd.6 = 0 
    Portb.5 = 0 
    
    Portb.0 = 0 
    
    
    Loop 
    
    Lewo:                                                     'podprogram lewo 
    Disable Interrupts                                          'zablokowanie przerwań 
    
    Portd.7 = 0 
    Portb.4 = 0 
    Portd.6 = 0 
    Portb.5 = 1 
    
    Portb.0 = 1 
    
    Wait 2 
    
    Portd.7 = 0 
    Portb.4 = 0 
    Portd.6 = 0 
    Portb.5 = 0 
    
    Portb.0 = 0 
    
    Enable Interrupts                                           'odblokowanie przerwaniń 
    
    Return                                                      'koniec podprogramu - powrót do programu głównego 
    
    
    
    Prawo:                                                      'podprogram prawo 
    Disable Interrupts                                          'zablokowanie przerwań 
    
    Portd.7 = 0 
    Portb.4 = 0 
    Portd.6 = 1 
    Portb.5 = 0 
    
    Portb.0 = 1 
    
    Wait 2 
    
    Portd.7 = 0 
    Portb.4 = 0 
    Portd.6 = 0 
    Portb.5 = 0 
    
    Portb.0 = 0 
    
    Enable Interrupts                                           'odblokowanie przerwaniń 
    
    Return                                                      'koniec podprogramu - powrót do programu głównego 
    
    End




    Przy takim kodzie kreci się na starcie jedno koło a gdy załączę którąś z krańcówek to nic, jak dwie na raz oba koła się kręcą? Co jest źle?
  • REKLAMA
  • #2 7761420
    leon1313
    Poziom 15  
    A nie lepiej ci badać stan krańcówki np co 10ms ?
    Wykorzystanie przerwań to nie jest dobry pomysł w tym przypadku.
  • REKLAMA
  • #3 7762167
    pi1er
    Poziom 9  
    Taki kod też mi nie działa:
    Tzn. Robot jedzie do przodu ale załączenie krańcówki nic nie powoduje.

    $regfile = "m8def.dat"
    $crystal = 8000000
    
    Config Portb.0 = Output                                     'dioda
    Config Portd.7 = Output                                     'silnik lewy 1
    Config Portd.6 = Output                                     'silnik lewy 2
    Config Portb.5 = Output                                     'silnik prawy 2
    Config Portb.4 = Output                                     'silnik prawy 1
    
    Enable Interrupts                                           'zezwolenie na obsługę przerwań
    Enable Int0
    Enable Int1
    
    Config Int0 = Falling                                       'do ziemi
    Config Int1 = Falling                                       'do ziemi
    
    On Int0 Lewo                                                ' obsługa przerwania INT0 - podprogram Zwieksz
    On Int1 Prawo                                               ' obsługa przerwania INT1 - podprogram Zmniejsz
    
    
    Dim Lewo As Byte
    Dim Prawo As Byte
    
    Lewo = 0
    Prawo = 0
    
    
    Portb.0 = 1
    Wait 2
    Portb.0 = 0
    Portc.4 = 0
    Portd.7 = 0
    Portd.6 = 0
    Portb.5 = 0
    Portb.4 = 0
    
    
    Wait 5
    
    Do
    
    Portd.7 = 1
    Portb.4 = 1
    Portd.6 = 0
    Portb.5 = 0
    
    Portb.0 = 0
    
    If Lewo = 1 Then
    
    Portb.0 = 1
    
    Lewo = 0
    
    End If
    
    If Prawo = 1 Then
    Portb.0 = 1
    Prawo = 0
    
    End If
    
    
    Loop
    
    Lewo:                                                       'podprogram lewo
    Disable Interrupts                                          'zablokowanie przerwań
    
    Lewo = 1
    
    Enable Interrupts                                           'odblokowanie przerwaniń
    
    Return                                                      'koniec podprogramu - powrót do programu głównego
    
    
    
    Prawo:                                                      'podprogram prawo
    Disable Interrupts                                          'zablokowanie przerwań
    
    Prawo = 1
    
    Enable Interrupts                                           'odblokowanie przerwaniń
    
    Return                                                      'koniec podprogramu - powrót do programu głównego
    
    End
  • #4 7762419
    janbernat
    Poziom 38  
    1. Jak w głównej pętli co przebieg ustawiasz:
    Portd.7 = 1
    Portb.4 = 1
    Portd.6 = 0
    Portb.5 = 0

    Portb.0 = 0
    To masz na stałe (z wyjątkiem kilku us) ustawione 0.
    2. Po co stale ustawiasz w pętli resztę portów?
    Raz ustawione przed pętlą na stałe będą się zachowywać tak samo.
    3.Naucz się stosować wcięcia.
    4.W przerwaniach nie trzeba blokować i zezwalać na inne przerwania- są zablokowane samoczynnie.
REKLAMA