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

[Atmega16] [Bascom] if..then..else i odmierzanie czasu

mardar 07 Kwi 2010 10:45 2555 11
  • #1 7930227
    mardar
    Poziom 21  
    Witam, mam taki głupi problem, potrzebuję zrobić pewną instrukcje warunkową. Działać miało by to w następujący sposób:
    jeżeli na pinb.0 pojawi się 0 to
    podprogram odlicza czas(np około 30s), w tym czasie jeśli na pind.2 pojawi się 0 to program przejdzie do podprogramu sys_off. Jeśli jednak w tym czasie nie poda sie 0 na pind.2 to uruchomi się podprogram alarm.

    Czyli coś takiego:
    if pinb.0 = 0 then
    ------tu ma się włączyć odliczanie czasu-----
    if pind.2 = 0 then
    goto sys_off
    else alarm
    end if
    end if.

    Jak zrealizować coś takiego?

    Proszę poprawić temat.
    Robak
  • #3 7930372
    mardar
    Poziom 21  
    W tym sęk że w bascoma tak głębiej to się nie zapuszczałem, jedynie bawiłem się wait'em... Wiem że powinno się "dawać wędkę, a nie gotową rybę" ale prosiłbym w tym przypadku o podanie przysłowiowej ryby. Chodzi o to że prawdopodobnie sporo nerwów i czasu bym stracił przy takim kombinowaniu...
  • #4 7935052
    arktik1
    Poziom 27  
    Chyba prościej się nie da:
    
    Do
    If Pinb.0 = 0 And Pind.2 = 1 Then
    Incr Tim
    Else
    Tim = 0
    End If
    
    If Tim = 1001 Then Tim = 0
    
    If Pind.2 = 1 And Tim = 1000 Then
    Goto Alarm
    End If
    
    If Pind.2 = 0 Then
    Goto Sys_off
    End If
    
    Loop
    End
    

    Tylko musisz dopasować Tim=? żebyś miał odpowiedni czas.
    Ustawienie $crystal wpływa na odliczanie Tim.
  • #5 7938482
    mardar
    Poziom 21  
    Dzięki,
    W tej chwili po dostosowaniu kodu wywala kilka błędów:
    [Atmega16] [Bascom] if..then..else i odmierzanie czasu
    Poniżej zamieszczam kod żeby łatwiej było zrozumieć jak to jest zrobione:
    
    $regfile = "m16def.dat"
    $crystal = 8000000
    
    'konfiguracja portów
    Config Porta = Output
    Config Portb = Input
    Config Portc = Input
    Config Portd = Input
    
    Set Porta.3
    Set Porta.4
    Set Porta.5
    Reset Porta.0
    Reset Porta.1
    Reset Porta.2
    
    
    
    Pwr_on:
    
    Do
    If Pind.2 = 0 Then                                          'aktywacja systemu
    Goto Scan
    Wait 1
    End If
    If Pind.3 = 0 Then                                          'kanał 2
    Toggle Porta.5
    Toggle Porta.2
    End If
    Loop
    End
    
    
    
    Scan:
    Do                                                          'skanowanie wejsc
    Reset Porta.3
    If Pind.2 = 0 Then                                          'wyłączenie systemu
     Goto Pwr_off
     Wait 1
    End If
    
    
    
    If Pinb.0 = 0 Then                                          'wejscie zwloczne
    Goto Pir1
    End If
    
    If Pinb.1 = 0 Or Pinb.2 = 0 Or Pinb.3 = 0 Or Pinb.4 = 0 Or Pinb.5 = 0 Or Pinb.6 = 0 Or Pinb.7 = 0 Then
     Goto Alarm_on                                              'wejscia natychmiastowe
    End If
    
    If Pind.3 = 0 Then                                          'kanał 2
    Toggle Porta.5
    Toggle Porta.2
    Wait 1
    End If
    
    Loop
    
    Alarm_on:                                                   'alarm
    Do                                                          'reczne wyłaczenie
    If Pind.2 = 0 Then
    Goto Pwr_off
    Wait 1
    End If
    If Pind.3 = 0 Then                                          'obsługa kanalu 2
    Toggle Porta.5
    Toggle Porta.2
    End If
    Reset Porta.4                                               'glowna sygnalizacja alarmu
    Set Porta.1
    Loop
    
    Pwr_off:                                                    'wylaczanie alarmu
    Set Porta.4
    Reset Porta.1
    Set Porta.3
    Goto Pwr_on
    
    Pir1:                                                       'obsluga wejscia zwłoczneg
    Do                                                          'sygnalizacja naruszenia strefy zwłocznej
    Reset Porta.4
    Set Porta.1
    Waitms 1500
    Set Porta.4
    Reset Porta.1
    
    If Pinb.0 = 0 And Pind.2 = 1 Then                           'odliczanie i ewentualne uruchomienie alarmu
    Incr Tim
    Else
    Tim = 0
    End If
    If Tim = 1001 Then Tim = 0
    If Pind.2 = 1 And Tim = 1000 Then
    Goto Alarm_on
    End If
    If Pind.2 = 0 Then
    Goto Sys_off
    End If
    Loop
  • #6 7938992
    wader_669
    Poziom 28  
    ? nie wiem co to za koslawy kod.
    Po 1, nie uzywa sie goto.
    2, Ja na twoim miejscu bym uzyl timera 2 w trybie asynchronicznym, z zegarkowym oscylatorem. Ustawil przerwanie z timera na 1 sekunde. Pozniej w przerwaniu dodal bym zliczanie do 30 sekund. Gdy nie ma 30 Sekund osiagnietych flaga=0, gdy jest powyzej 30 flaga=1. Przycisk 1 by startowal odliczanie timera2. W glownej petli spawdzanie flagi gdy jest rowna 1 to alaram, do tego w petli by bylo sprawdzanie przycisku 1 gdy jest wcisniety start alarm i przycisku 2 gdy zostanie nacisniety stop timer2.
  • #7 7939018
    mardar
    Poziom 21  
    Heh, wiem że ten kod jest "koślawy", nie jestem programistą także kombinuję jak się da i nie bijcie mnie za to:] Jeśli chodzi o te uwagi to poczytam, może coś wykombinuję.

    W dalszym ciągu proszę poprawić temat!
    Robak
  • #8 7939328
    arktik1
    Poziom 27  
    "W tej chwili po dostosowaniu kodu wywala kilka błędów:"
    Jak myślisz, dla czego?
  • #9 7939390
    mardar
    Poziom 21  
    arktik1 napisał:
    "W tej chwili po dostosowaniu kodu wywala kilka błędów:"
    Jak myślisz, dla czego?


    powodów jest kilka:
    1. bo za chudy w portkach jestem:D
    2. nie jestem programistą
    3. bo kod jest "koślawy"

    Jeśli chodzi o błędy to jeśli się usunie fragment o który się tutaj pytam to program w miarę poprawnie działa czyli aż tak "koślawy" to on nie jest...
  • #10 7940861
    Konto nie istnieje
    Poziom 1  
  • #11 7949064
    wader_669
    Poziom 28  
    
    $regfile = "m16def.dat"
    $crystal = 8000000
    
    Config Pinb.0 = Input
    Config Pinb.2 = Input
    
    P1 Alias Pinb.0
    P2 Alias Pinb.2
    
    Set Portb.0
    Set Portb.2
    
    Config Timer1 = Timer , Prescale = 256
    On Timer1 1_sekunda
    
    Enable Timer1
    Enable Interrupts
    
    Counter1 = 34286
    
    Declare Sub Alarm
    Declare Sub Sys_off
    Dim Sekundy As Byte
    Dim Flaga1 As Bit
    Dim Flaga2 As Bit
    
    Stop Timer1
    
    Do
    
    If P1 = 0 Then                                              ' gdy przycisk 1 wtedy..
    Waitms 45
    If P1 = 0 Then
    Start Timer1                                                ' ..zacznij odliczac
    
       Do                                                       '.. wejdz do petli
    
       If P2 = 0 Then                                           ' gdy przycisk 2 wtedy..
       Waitms 45
       If P2 = 0 Then
       Call Sys_off                                             ' idz do sys_off
       End If
       End If
    
       If Flaga1 = 1 Then                                       ' jednak gdy flaga=1 to
       Call Alarm                                               ' idz do alarm
       End If
    
       Loop Until Flaga2 = 1                                    ' rob petle tak dlugo az flaga2=1
    
    End If
    End If
    
    Loop
    End
    
    Sub Sys_off                                                 ' sys_off
    Flaga2 = 1                                                  ' ustaw flage do wyjscia z petli
    Stop Timer1                                                 ' zatrzymaj timer1
    ' dalsze instrukcje
    End Sub
    
    Sub Alarm
    ' dalsze instrukcje
    End Sub
    
    1_sekunda:                                                  'przerwanie od timer1 co sekunde
    Counter1 = Counter1 + 34286
    Incr Sekundy                                                ' zwieksz zmienna sekundy
    
    If Sekundy = 30 Then                                        ' gdy zliczyl sekund 30 to..
    Flaga1 = 1                                                  ' to ustaw flage ktora wywoluje alarm
    End If
    
    Return
    


    Tu masz program powinien dzialac, wiadomo drobne bledy mogly sie wkrasc.
    Zrobilem to troche inaczej niz napisalem w poscie wczesniej. Nie jest na timerze2 w trybie asynchronicznym. Teraz nie musisz zmieniac schematu.
    Wazne jedynie, zebys ustawil fusebity (prosze nie pytaj co to jest i jak to sie ustawia. Masz dosyc postow na ten temat)
  • #12 8129481
    mardar
    Poziom 21  
    Drobne problemy były, ale sobie z nimi jakoś jednak poradziłem. przy okazji podam rozwiązanie jakie zastosowałem, na początku deklaruje stałą: czas czyli po jakim czasie coś ma się zrobić, a potem:
    
    Do
    Waitms 25
    If Pind.2 = 0 Then                   
    Waitms 700
    Goto Pwr_off
    End If
    If Porta.3 = 0 Then
    Incr Liczniczek
    If Liczniczek = 40 Then
    Toggle Porta.4
    Liczniczek = 0
    Incr Liczbasekund
    If Liczbasekund = Czas Then
    Goto Alarm_on
    End If
    End If
    End If
    Loop
    

    Tym oto sposobem jeżeli nie zostanie podany sygnał na pind.2 to po ustalonym czasie jest wykonywana zawartość podporgramu Alarm_on, dodatkowym bajerem jest dioda led podpięta pod PortA.4 sygnalizująca swoimi błyskami odmierzanie czasu. Czyli problem rozwiązany. Temat zamykam

    Dodano po 1 [minuty]:

    Dzięki wszystkim za pomoc:]
REKLAMA