Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Attiny 2313 | Problem z kolejnością instrukcji

Royd1 16 Kwi 2012 17:05 1119 12
  • #1 16 Kwi 2012 17:05
    Royd1
    Poziom 7  

    Szukałem odpowiedzi a na pewno jest dosyć prosta, ale nie mogę znaleźć.
    Chodzi o to że gdy piszę instrukcje i mam dwie pęntlę i program czasami zaczyna od tej drugiej nie wiedzieć czemu nie idzie według kolejności czy mogłby mi ktoś wytłumaczyć i dać odpowiedź?

    Code:
    $regfile = "attiny2313.dat"                                 'najpierw określamy typ proca
    
     $crystal = 1000000                                         'definiujemy z jakim taktowaniem będzie pracował


     Config Portb = Input                                       'port b  jako wejścia
            Portb = &B00000000                                  'wszędzie stan spoczynkowy-0
     Config Portd = Output                                      'pprt d jako wyjścia
            Portd = &B0000000                                   'wszędzie stan spoczynkowy-0




      Do                                                        'pętla nieskończona

        If Pinb.0 = 1 Then                                      'jeżeli przycisk 1 wciśnięty
        Waitms 30
        Portd.0 = 1                                             'zaświeć diodę 3  razy
        Waitms 400                                              '
        Portd.0 = 0
        Waitms 400
        Portd.0 = 1
        Waitms 400
        Portd.0 = 0
        Waitms 400
        Portd.0 = 1
         Waitms 400
         Portd.0 = 0
         Waitms 400                                             '
         End If

        Do                                                      'jesli przycisk trzymany swieć do uwolnienia przycisku
        If Pinb.0 = 1 Then

        Portd.0 = 1
        Waitms 400
        Portd.0 = 0
        Waitms 400
        End If
        Loop Until Pinb.0 = 0
       Loop                                                     'uwolnienie przycisku
                                                        'koniec pętli
     End                     

    0 12
  • #2 16 Kwi 2012 17:22
    stanleysts
    Poziom 27  

    If Pinb.0 = 1 Then // Loop Until Pinb.0 = 0 a nie powinno byc czasem
    If Pinb.0 == 1 Then // Loop Until Pinb.0 == 0 ?

    0
  • #3 16 Kwi 2012 17:25
    Royd1
    Poziom 7  

    Invalid comparison operator Linia 31 i 38

    0
  • #4 16 Kwi 2012 17:46
    phoszek
    Poziom 15  

    stanleysts napisał:
    If Pinb.0 == 1 Then // Loop Until Pinb.0 == 0 ?
    @stanleysts, Bascom, to nie C. ;) Tu wystarczy jeden znak "=".

    @Royd1, spróbuj zmienić ze sobą miejscami:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #5 16 Kwi 2012 17:51
    Royd1
    Poziom 7  

    Zmieniłem nic to nie dało, to samo cały czas. Dlaczego Procesor nie wykonuje tych instrukcji po kolei? :cry: jak to by życie ułatwiło.

    zmieniłem tak:

    Code:
    $regfile = "attiny2313.dat"                                 'najpierw określamy typ proca
    
     $crystal = 1000000                                         'definiujemy z jakim taktowaniem będzie pracował


     Config Portb = Input                                       'port b  jako wejścia
            Portb = &B00000000                                  'wszędzie stan spoczynkowy-0
     Config Portd = Output                                      'pprt d jako wyjścia
            Portd = &B0000000                                   'wszędzie stan spoczynkowy-0




      Do                                                        'pętla nieskończona

        If Pinb.0 = 1 Then                                      'jeżeli przycisk 1 wciśnięty
        Portd.0 = 1                                             'zaświeć diodę 3  razy
        Waitms 400                                              '
        Portd.0 = 0
        Waitms 400
        Portd.0 = 1
        Waitms 400
        Portd.0 = 0
        Waitms 400
        Portd.0 = 1
         Waitms 400
         Portd.0 = 0
         Waitms 400                                             '
         End If

        If Pinb.0 = 1 Then
        Do                                                      'jesli przycisk trzymany swieć do uwolnienia przycisku
        Portd.0 = 1
        Waitms 400
        Portd.0 = 0
        Waitms 400
        End If
        Loop Until Pinb.0 = 0
       Loop                                                     'uwolnienie przycisku
                                                        'koniec pętli
     End     

    0
  • #6 16 Kwi 2012 23:09
    xury
    Poziom 38  

    Ano tak się dzieje, jak się korzysta z opóźnień typu waitms.
    Ten program nigdy nie będzie działać wg zamierzeń autora, dopóki on nie zastosuje timerów zamiast opóźnień typu waitms.
    Niby jakim cudem miałby trafić z przyciskiem na czas wykonywania pierwszego warunku ?
    Proponuję "wczuć" się przez chwilę w taki procesor, który wykonuje te porównania kilkaset tysięcy razy w ciągu sekundy i jak wtedy utrafić z przyciśnięciem przycisku (pomijając nawet drganie styków) przed pierwszym porównaniem ?

    0
  • #7 17 Kwi 2012 13:15
    Royd1
    Poziom 7  

    To czy mógłby mi ktoś pomóc napisać taki program? Morduje sie z tym i nie daje rady

    0
  • #8 17 Kwi 2012 14:26
    starob
    Poziom 25  

    Na samym początku poczekaj na wciśnięcie
    Loop Until Pinb.0 = 1;

    Ze względu na obecność Waitms nie powinien się sypać z powodu drgań styków.

    0
  • #9 17 Kwi 2012 18:05
    Royd1
    Poziom 7  

    Tak ale on sie nie sypie z powodu drgań styków tylko sprawdzania przez procesor dwóch IFów:). Czyli : zaznaczyłem (***) Wtedy gdy kręci pętle .
    Na pewno da sie to jakoś (zapriorytetowac) aby najpierw sprawdzał pierwszego IFa. Tylko nie wiem jak.

    Bo to ma wygladać tak że jak kliknę raz to dioda miga 3 razy, a jeżeli będe nadal trzymał przycisk to ma migać dotąd aż nie zwolnie przycisku

    Code:

    $regfile = "attiny2313.dat"                                 'najpierw określamy typ proca
     $crystal = 1000000                                         'definiujemy z jakim taktowaniem będzie pracował


     Config Portb = Input                                       'port b  jako wejścia
            Portb = &B00000000                                  'wszędzie stan spoczynkowy-0
     Config Portd = Output                                      'pprt d jako wyjścia
            Portd = &B0000000                                   'wszędzie stan spoczynkowy-0




      Do                                                        'pętla nieskończona
      ' Niech ta pętla ma wyższy priorytet
       *** If Pinb.0 = 1 Then                                      'jeżeli przycisk 1 wciśnięty
        Portd.0 = 1                                             'zaświeć diodę 3  razy
        Waitms 400                                              '
        Portd.0 = 0
        Waitms 400
        Portd.0 = 1
        Waitms 400
        Portd.0 = 0
        Waitms 400
        Portd.0 = 1
         Waitms 400
         Portd.0 = 0
         Waitms 400                                             '
         End If
     ' Ta niech ma niższy priorytet
       *** If Pinb.0 = 1 Then
        Do                                                      'jesli przycisk trzymany swieć do uwolnienia przycisku
        Portd.0 = 1
        Waitms 400
        Portd.0 = 0
        Waitms 400
        End If
        Loop Until Pinb.0 = 0
       Loop                                                     'uwolnienie przycisku
                                                        'koniec pętli
     End     

    0
  • Pomocny post
    #10 18 Kwi 2012 00:15
    starob
    Poziom 25  

    Royd1 napisał:
    Tak ale on sie nie sypie z powodu drgań styków tylko sprawdzania przez procesor dwóch IFów:). Czyli : zaznaczyłem (***) Wtedy gdy kręci pętle .
    Na pewno da sie to jakoś (zapriorytetowac) aby najpierw sprawdzał pierwszego IFa. Tylko nie wiem jak.

    Bo to ma wygladać tak że jak kliknę raz to dioda miga 3 razy, a jeżeli będe nadal trzymał przycisk to ma migać dotąd aż nie zwolnie przycisku

    Code:

    $regfile = "attiny2313.dat"                                 'najpierw określamy typ proca
     $crystal = 1000000                                         'definiujemy z jakim taktowaniem będzie pracował


     Config Portb = Input                                       'port b  jako wejścia
            Portb = &B00000000                                  'wszędzie stan spoczynkowy-0
     Config Portd = Output                                      'pprt d jako wyjścia
            Portd = &B0000000                                   'wszędzie stan spoczynkowy-0




      Do                                                        'pętla nieskończon

    '****************************
       Do
       Loop Until Pinb.0 = 1                              'czekaj na przycisk 1 wciśnięty
    '*****************************

      ' Niech ta pętla ma wyższy priorytet
       *** If Pinb.0 = 1 Then                                      'jeżeli przycisk 1 wciśnięty
        Portd.0 = 1                                             'zaświeć diodę 3  razy
        Waitms 400                                              '
        Portd.0 = 0
        Waitms 400
        Portd.0 = 1
        Waitms 400
        Portd.0 = 0
        Waitms 400
        Portd.0 = 1
         Waitms 400
         Portd.0 = 0
         Waitms 400                                             '
         End If
     ' Ta niech ma niższy priorytet
       *** If Pinb.0 = 1 Then
        Do                                                      'jesli przycisk trzymany swieć do uwolnienia przycisku
        Portd.0 = 1
        Waitms 400
        Portd.0 = 0
        Waitms 400
        End If
        Loop Until Pinb.0 = 0
       Loop                                                     'uwolnienie przycisku
                                                        'koniec pętli
     End     


    Wykonuje zawsze najpierw pierwszego IF-a tylko ty naciskasz przycisk w nieodpowiednim momencie ;D

    0
  • #11 18 Kwi 2012 16:43
    Royd1
    Poziom 7  

    @starob Jezus Maria działa:) nie wiem jak to zrobiłeś zaraz przeanalizuje ten kod sobie :) ale dziekuje Ci :) Pomogłeś.

    0
  • #12 18 Kwi 2012 17:28
    starob
    Poziom 25  

    .. a za pokutę napisz to samo tylko w 10 linijka ...jak Ci się uda to zwrócę otrzymane punkty :)

    0
  • #13 18 Kwi 2012 20:40
    Royd1
    Poziom 7  

    Nie chce zwrotów punktów :) wszystki sie udało wszystko gra temat uważam za zamkniety i pozdrawiam wszystkich serdecznie

    0