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 sterownik migomatu

bartkam 21 Sie 2009 18:13 3431 9
REKLAMA
  • #1 6917990
    bartkam
    Poziom 15  
    Prubuje napisać program do obsługi migomatu na atmega8 w BASCOMIE. Mam takie cos:
    $regfile = "m8def.dat"
    $crystal = 1000000
    
    
    Config Portd = &B11111101
            Portd = &B00000000
    
    
      Do
    
    
    
       If Pind.1 = 1 Then                                       'jeżeli uchwyt wciśnięty
    
       Waitms 30                                                'drganie styków
       Portd.0 = 1                                              'zapal diode spawania
       Portd.5 = 1                                              'włącz gaz
       Waitms 250                                               'czekaj Xms
       Portd.6 = 1                                              'włącz prąd
       Portd.7 = 1                                              'włącz podajnik
    
         Do
    
       If Pind.1 = 0 Then                                       'jeżeli uchwyt puszczony
       Portd.0 = 0                                              'zgaś diode spawania
       Portd.7 = 0                                              'wyłącz drut
       Waitms 300                                               'czekaj Xms
       Portd.6 = 0                                              'wyłącz prąd
       Waitms 500                                               'czekaj Xms
       Portd.7 = 0                                              'wyłącz gaz
       End If
       Loop Until Pind.1 = 0
    
        End If
    
     Loop
    
    
    End


    Program nie działa jak należy tzn. dioda szaleje i przekaźniki też włączają się i wyłączają bez włączenia przycisku (PD1). Mógłby ktoś sprawdzić co jest nie tak.
  • REKLAMA
  • #2 6918093
    Krauser
    Poziom 26  
    Najprawdopodobniej to kwestia przycisku dołączonego do PD.1. Konfigurujesz PD.1 jako wejście pływające, bo DDRD.1=0, a PORTD.1=0. Jeśli klawisz tylko podaje +VDD lub rozłącza obwód to gdy nie jest wciśnięty na wejściu pływającym pojawiają się śmieci, bo działa ono jak antena(stan zmienia się przypadkowo). Możesz dodać rezystor 10kohm, który ustali stabilny stan niski, albo niech przycisk zwiera wejście do masy co wymaga zmiany ustawienia na PORTD.1=1 ( wtedy wykorzystasz wbudowany w uP układ podciągający) i odwrotnego sprawdzania stanu wejścia.
  • REKLAMA
  • #3 6918757
    bartkam
    Poziom 15  
    Teraz zwieram wejście do masy, napisałem takie coś:
    $regfile = "m8def.dat"
    $crystal = 1000000
    
    
    Config Pind.0 = Output
    Config Pind.1 = Input                                      
    Config Pind.2 = Output                                    
    Config Pind.3 = Output                                      
    Config Pind.4 = Output                                     
    Config Pind.5 = Output                                      
    Config Pind.6 = Output                                        
    Config Pind.7 = Output                                     
    
    Portd.0 = 0                                                 
    Portd.1 = 1                                                 
    Portd.2 = 0                                                 
    Portd.3 = 0                                                 
    Portd.4 = 0                                                 
    Portd.5 = 0                                                 
    Portd.6 = 0                                                 
    Portd.7 = 0
    
    
      Do
    
    
    
       If Pind.1 = 0 Then                                       'jeżeli uchwyt wciśnięty
    
       Waitms 30                                                'drganie styków
       Portd.0 = 1                                              'zapal diode spawania
       Portd.5 = 1                                              'włącz gaz
       Waitms 250                                               'czekaj Xms
       Portd.6 = 1                                              'włącz prąd
       Portd.7 = 1                                              'włącz podajnik
    
         Do
    
       If Pind.1 = 1 Then                                       'jeżeli uchwyt puszczony
       Portd.0 = 0                                              'zgaś diode spawania
       Portd.7 = 0                                              'wyłącz drut
       Waitms 300                                               'czekaj Xms
       Portd.6 = 0                                              'wyłącz prąd
       Waitms 500                                               'czekaj Xms
       Portd.7 = 0                                              'wyłącz gaz
       End If
       Loop Until Pind.1 = 1
    
        End If
    
     Loop
    
    
    End


    Działa ale nie zawsze da się wyłączyć. Gdy szybko włączę i wyłączę to tak jakby się zawieszało, a gdy odczekam około 2 s pomiędzy zmianą stanu przycisku to jest ok. Jak to rozwiązać? Może jakieś przerwania albo coś.
  • #4 6919323
    PawelecXX
    Poziom 11  
    Dokładnie, zastosuj przerwanie np. SIG_INTERRUPT0
    Jeżeli dopuszczasz możliwość włączania i wyłączania dwoma oddzielnymi przyciskami to nie będziesz musiał martwić się drganiem styków. Wystarczyłoby zastosować dwa przerwania (Mega8 ma dwa piny, które obsługują przerwania). Domyślam się jednak, że nie będzie to tobie pasowało. W takim wypadku przerwanie ma być powodowane zmianą stanu na pinie.

    Więcej szczegółów w dokumentacji.
  • REKLAMA
  • #5 6920534
    sp3ots
    Poziom 38  
    Witam !
    Po bawiłem się Twoim programem i zauważyłem że w pierwszej części programu operujesz portami (wyjściami) :
    Portd.0 = 1 'zapal diode spawania
    Portd.5 = 1 'włącz gaz
    Portd.6 = 1 'włącz prąd
    Portd.7 = 1 'włącz podajnik
    a w drugiej części:
    Portd.0 = 0 'zgaś diode spawania
    Portd.7 = 0 'wyłącz drut
    Portd.6 = 0 'wyłącz prąd
    Portd.7 = 0 'wyłącz gaz

    Brak Portu 5 w drugiej części ?
    Chyba wyłącz gaz ma być port 5 ?
    Przydał by się słowny opis działania tego programu !
    np.
    gdy pind.0 =0 to włącz prąd czekaj 30ms zapal diodę spawania i
    włącz gaz, zaczekaj 250ms włącz prąd i podajnik.
    to jest dla mnie jasne ale co dalej po zmianie pinu d.0 na 1 ?
    Myślę że wszystkie działania powinny się wykonać w odwrotnej kolejności , może się mylę ?
    Pozdrawiam. Stefan GG6293398

    W międzyczasie pobawiłem się trochę i oto co mi wyszło ?

    
    $regfile = "m8def.dat"
    $crystal = 1000000
    
    
    Config Pind.0 = Output
    Config Pind.1 = Input
    Config Pind.2 = Output
    Config Pind.3 = Output
    Config Pind.4 = Output
    Config Pind.5 = Output
    Config Pind.6 = Output
    Config Pind.7 = Output
    Dim Temp As Byte
    
    Portd.0 = 1
    Portd.1 = 1       '1
    Portd.2 = 1
    Portd.3 = 1
    Portd.4 = 1
    Portd.5 = 1
    Portd.6 = 1
    Portd.7 = 1
    
    Do
    Portd.1 = 1
    If Pind.1 = 0 Then
    'Waitms 30
    Gosub Praca
    Else
    Portd.0 = 1       'zgaś diode spawania
    Portd.7 = 1       'wyłącz drut
    Waitms 300       'czekaj Xms
    Portd.6 = 1       'wyłącz prąd
    Waitms 500       'czekaj Xms
    Portd.5 = 1       'wyłącz gaz
    End If
    
    Loop
    End
    Praca:
    If Pind.1 = 0 Then
    Portd.0 = 0       'zapal diode spawania
    Portd.5 = 0       'włącz gaz
    For Temp = 0 To 250
    If Pind.1 = 1 Then Return
    Waitms 1       'temp = 250 x 1ms czekaj 250 ms
    Next A
    Portd.6 = 0       'włącz prąd
    Portd.7 = 0       'włącz podajnik
    End If
    Return
    


    Pozamieniałem zera na jedynki i jedynki na zera, dla mojej wygody. ( sprawdzałem na LEDach)
    Z powrotem po zamieniaj zera na jedynki, i jedynki na zera.
    Powodzenia życzę. Stefan
    ps. Tem program pasuje do ATtiny13 !
  • REKLAMA
  • #6 6922267
    bartkam
    Poziom 15  
    Ten twój program nie działa. Próbowałem zrobić na przerwaniach ale dioda w PD.0 tylko miga i przekaźniki się nie załączają (bez włączania prycisku)
    $regfile = "m8def.dat"
    $crystal = 1000000
    
    
    Config Pind.0 = Output
    Config Pind.1 = Input
    Config Pind.2 = Output
    Config Pind.3 = Output
    Config Pind.4 = Output
    Config Pind.5 = Output
    Config Pind.6 = Output
    Config Pind.7 = Output
    
    
    Portd.0 = 0
    Portd.1 = 1
    Portd.2 = 0
    Portd.3 = 0
    Portd.4 = 0
    Portd.5 = 0
    Portd.6 = 0
    Portd.7 = 0
    
    On Int0 Wlacz Nosave
    Enable Int0
     Enable Interrupts
    
    
    
    Do
    
    Loop
    
    
    
    Wylacz:
    Do
    If Pind.1 = 1 Then
    Waitms 30                                                   'drganie styków
       Portd.0 = 0                                              'zgaś diode spawania
     Portd.7 = 1                                                'wyłącz podajnik
         Waitms 300                                              'czekaj Xms
       Portd.6 = 1                                              'wyłącz prąd
        Waitms 500                                              'czekaj Xms
       Portd.5 = 1                                              'wyłącz gaz                                                'włącz podajnik
    End If
    Loop Until Pind.1 = 1
    Return
    
    Wlacz:
    Disable Interrupts
    Waitms 30                                                   'drganie styków
       Portd.0 = 1                                              'zapal diode spawania
       Portd.5 = 1                                              'włącz gaz
       Waitms 250                                               'czekaj Xms
       Portd.6 = 1                                              'włącz prąd
       Portd.7 = 1                                              'włącz podajnik
        Gosub Wylacz
    Enable Interrupts
    Return
    
    End


    A słownie to program ma robić: Gdy nacisnę przycisk PD1( do masy) ma włączyć dioda pd0 i gaz pd5 poczekać 250ms włączyć prąd pd6 i podajnik pd7. Gdy puszczę przycisk ma wyłączyć diodę i drut poczekać 300ms wyłączyć prąd poczekać 500ms i wyłączyć gaz. Dodam że raz coś zmieniłem w tych przerwaniach tak że działało dobrze ale się czasami przywieszało (nie wyłączało się) ale już nie pamietam co, a tamtego kodu nie zapisałem :-(
  • #7 6922600
    sp3ots
    Poziom 38  
    Witam !
    Napisany prze zemnie program działa na diodach LED podłączonych do plusa zasilania przez rezystory. Nie mam możliwości podłączenia
    kluczy tranzystorowych. Aby działał poprawnie musisz pozamieniać stany portów wyjściowych, tak jak opisałem w poprzednim poście.
    Pozdrawiam. Stefan
    ps. program działa tak jak opisałeś.
  • #8 6923468
    bartkam
    Poziom 15  
    Zrobiłem tak jak mówiłeś:
    $regfile = "m8def.dat"
    $crystal = 1000000
    
    
    Config Pind.0 = Output
    Config Pind.1 = Input
    Config Pind.2 = Output
    Config Pind.3 = Output
    Config Pind.4 = Output
    Config Pind.5 = Output
    Config Pind.6 = Output
    Config Pind.7 = Output
    Dim Temp As Byte
    
    Portd.0 = 0
    Portd.1 = 1       '1
    Portd.2 = 0
    Portd.3 = 0
    Portd.4 = 0
    Portd.5 = 0
    Portd.6 = 0
    Portd.7 = 0
    
    Do
    Portd.1 = 1
    If Pind.1 = 1 Then
    'Waitms 30
    Gosub Praca
    Else
    Portd.0 = 0                                                 'zgaś diode spawania
    Portd.7 = 0                                                 'wyłącz drut
    Waitms 300       'czekaj Xms
    Portd.6 = 0                                                 'wyłącz prąd
    Waitms 500       'czekaj Xms
    Portd.5 = 0                                                 'wyłącz gaz
    End If
    
    Loop
    End
    Praca:
    If Pind.1 = 0 Then
    Portd.0 = 1                                                 'zapal diode spawania
    Portd.5 = 1                                                 'włącz gaz
    For Temp = 0 To 250
    If Pind.1 = 0 Then Return
    Waitms 1       'temp = 250 x 1ms czekaj 250 ms
    Next A
    Portd.6 = 1                                                 'włącz prąd
    Portd.7 = 1                                                 'włącz podajnik
    End If
    Return
    
    

    Po wgraniu programu nic się nie dzieje, nie reaguje też na przycisk.
  • #9 6923507
    sp3ots
    Poziom 38  
    Witam !
    Miałeś zmienić stany portów wyjściowych na przeciwny a nie
    wejściowych !
    Tu jest kod poprawiony dla Twoich potrzeb.
    
    $regfile = "m8def.dat"
    $crystal = 1000000
    
    Config Pind.0 = Output
    Config Pind.1 = Input
    Config Pind.2 = Output
    Config Pind.3 = Output
    Config Pind.4 = Output
    Config Pind.5 = Output
    Config Pind.6 = Output
    Config Pind.7 = Output
    Dim Temp As Byte
    
    Portd.0 = 0
    Portd.1 = 1       
    Portd.2 = 0
    Portd.3 = 0
    Portd.4 = 0
    Portd.5 = 0
    Portd.6 = 0
    Portd.7 = 0
    
    Do
    Portd.1 = 1
    If Pind.1 = 0 Then
    'Waitms 30
    Gosub Praca
    Else
    Portd.0 = 0       'zgaś diode spawania
    Portd.7 = 0       'wyłącz drut
    Waitms 300       'czekaj Xms
    Portd.6 = 0       'wyłącz prąd
    Waitms 500       'czekaj Xms
    Portd.5 = 0       'wyłącz gaz
    End If
    Loop
    End
    
    Praca:
    If Pind.1 = 0 Then
    Portd.0 = 1       'zapal diode spawania
    Portd.5 = 1       'włącz gaz
    For Temp = 0 To 250
    If Pind.1 = 1 Then Return
    Waitms 1       'temp = 250 x 1ms czekaj 250 ms
    Next A
    Portd.6 = 1       'włącz prąd
    Portd.7 = 1       'włącz podajnik
    End If
    Return
    

    Pozdrawiam. Stefan
  • #10 6923568
    bartkam
    Poziom 15  
    Ok, program działa. Wczesniej mi nie działało bo zapomniałem że dla przerwań zmieniłem przycisk z PD1 na PD2(INT0). Z przerwaniami też mi działało, ale ten twój jest troche lepszy bo nie zawiesza się i troche szybcjej reaguje na wyłączenie przycisku.
    dzieki za pomoc
REKLAMA