Skocz do zawartości

[Bascom] Jak połączyć ze sobą dwa kody


aixI

Pomocna odpowiedź

Cześć, jestem w trakcie budowy robota wielozadaniowego i napisałem już dwa kody - pierwszy to sterowanie za pomocą pilota (RC5), a drugi to tryb autonomiczny, robot jedzie dopóki nie wykryje przeszkody, a jak wykryje to skręca (omija ją) i jedzie dalej. Oba kody działają. I mam pytanie do was: jak połączyć te dwa kody razem? Tak żeby przyciskiem na płycie głównej robota wybierać sobie tryb, np. jak robot już jest włączony to jak się kliknie switch to zmieni się program (powiedzmy ze sterowania pilotem na autonomiczny i z autonomicznego line follower). Z takim czymś mam pierwszy raz do czynienia, więc proszę o wytłumaczenie.

AixI.

Link do komentarza
Share on other sites

np tak

dim tryb as bit

do
 debounce przycisk, stan, zmiana_trybu, sub
 if tryb=1 then
    twój program1
 else
    twój program2
 end if
loop

zmiana_trybu:
 tryb=not tryb
return

można też inaczej ale to musiałbyś dokładnie opisać jakiego działania się spodziewasz

Link do komentarza
Share on other sites

No przecież napisałem ci.

A jak pytasz o coś innego no to zaznaczasz swój i naciskasz Ctrl+C stajesz w nowym pliku tam gdzie chcesz i dajesz Ctrl+V.

To podstawy edycji.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

No to zrobiłem tak jak mówisz. Pewnie jest coś źle ale to moje początki z łączeniem programów.

Dim Tryb As Bit

Do
  Debounce Pind.0 , Stan , Zmiana_trybu , Sub
  If Tryb = 1 Then

'1 program
$regfile "attiny2313.dat"
$crystal = 1000000

Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Config Portb = Output
Config Pind.2 = Input
Config Portd.1 = Output

Silnik_lewy_a Alias Portb.1
Silnik_lewy_b Alias Portb.0
Silnik_prawy_a Alias Portb.5
Silnik_prawy_b Alias Portb.6

Pwm1a = 255
Pwm1b = 255

Do

If Pind.2 = 1 Then

Set Silnik_lewy_a
Reset Silnik_lewy_b
Set Silnik_prawy_a
Reset Silnik_prawy_b

Debounce Pind.2 , 0 , Skrec , Sub                           'skręć, gdy czujnik wykryje przeszkode

End If

Loop
End



Skrec:
Portd.1 = 0
Waitms 80
Portd.1 = 1
Waitms 80
Portd.1 = 0
Waitms 80
Portd.1 = 1
Waitms 80
Portd.1 = 0

'stop
Reset Silnik_prawy_a
Reset Silnik_prawy_b
Reset Silnik_lewy_a
Reset Silnik_lewy_b
Waitms 500

'wstecz
Reset Silnik_lewy_a
Set Silnik_lewy_b
Reset Silnik_prawy_a
Set Silnik_prawy_b
Waitms 500

'skręć (w prawo)
Set Silnik_lewy_a
Reset Silnik_lewy_b
Reset Silnik_prawy_a
Set Silnik_prawy_b
Waitms 500

Return


  Else

'2 program
$regfile "attiny2313.dat"
$crystal = 1000000
$lib "mcsbyte.lbx"


Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Config Rc5 = Pind.5
Config Portb = Output


Silnik_lewy_a Alias Portb.1
Silnik_lewy_b Alias Portb.0
Silnik_prawy_a Alias Portb.5
Silnik_prawy_b Alias Portb.6


Pwm1a = 255
Pwm1b = 255


Dim Address As Byte , Command As Byte


Enable Interrupts




Do

  Getrc5(address , Command)

  Command = Command And &B01111111

If Command = 2 Then                                         'przód
     Set Silnik_lewy_a
     Reset Silnik_lewy_b
     Set Silnik_prawy_a
     Reset Silnik_prawy_b

     Else

     Reset Silnik_prawy_a
     Reset Silnik_prawy_b
     Reset Silnik_lewy_a
     Reset Silnik_lewy_b



If Command = 9 Then                                         'tył
     Reset Silnik_lewy_a
     Set Silnik_lewy_b
     Reset Silnik_prawy_a
     Set Silnik_prawy_b

     Else

     Reset Silnik_prawy_a
     Reset Silnik_prawy_b
     Reset Silnik_lewy_a
     Reset Silnik_lewy_b



If Command = 5 Then                                         'lewo
     Reset Silnik_lewy_a
     Set Silnik_lewy_b
     Set Silnik_prawy_a
     Reset Silnik_prawy_b

     Else

     Reset Silnik_prawy_a
     Reset Silnik_prawy_b
     Reset Silnik_lewy_a
     Reset Silnik_lewy_b



If Command = 7 Then                                         'prawo
     Set Silnik_lewy_a
     Reset Silnik_lewy_b
     Reset Silnik_prawy_a
     Set Silnik_prawy_b

     Else

     Reset Silnik_prawy_a
     Reset Silnik_prawy_b
     Reset Silnik_lewy_a
     Reset Silnik_lewy_b

End If
End If
End If
End If


Loop
End


End If
Loop

Zmiana_trybu:
Tryb = Not Tryb
Return
Link do komentarza
Share on other sites

Nie znam bascoma, ale chyba przekopiowałeś to za bardzo na pałę, w twoim programie masz w środku kodu definicje procesora i kwarcu. Wydaje się to dziwne. Ogólnie pasowałoby zrobić jeden blok inicjalizacji peryferiów, a potem jak masz uC przygotowany to dochodzisz do bloku w którym wybierasz tryb pracy. Następnie if który wybiera podprogram.

Link do komentarza
Share on other sites

Poza tym, że wszystko jest niedobrze to nie jest źle;)

Źle zrozumiałeś "łączenie programów".

Pierwsze co mi się rzuciło w oczy to:

$regfile "attiny2313.dat"
$crystal = 1000000

nie może występować w kodzie więcej niż raz.

Poza tym te "IFy" są "jeden w drugim":

Do 

  Getrc5(address , Command) 

  Command = Command And &B01111111 

If Command = 2 Then                                         'przód 
     Set Silnik_lewy_a 
     Reset Silnik_lewy_b 
     Set Silnik_prawy_a 
     Reset Silnik_prawy_b 

     Else 

     Reset Silnik_prawy_a 
     Reset Silnik_prawy_b 
     Reset Silnik_lewy_a 
     Reset Silnik_lewy_b 



If Command = 9 Then                                         'tył 
     Reset Silnik_lewy_a 
     Set Silnik_lewy_b 
     Reset Silnik_prawy_a 
     Set Silnik_prawy_b 

     Else 

     Reset Silnik_prawy_a 
     Reset Silnik_prawy_b 
     Reset Silnik_lewy_a 
     Reset Silnik_lewy_b 



If Command = 5 Then                                         'lewo 
     Reset Silnik_lewy_a 
     Set Silnik_lewy_b 
     Set Silnik_prawy_a 
     Reset Silnik_prawy_b 

     Else 

     Reset Silnik_prawy_a 
     Reset Silnik_prawy_b 
     Reset Silnik_lewy_a 
     Reset Silnik_lewy_b 



If Command = 7 Then                                         'prawo 
     Set Silnik_lewy_a 
     Reset Silnik_lewy_b 
     Reset Silnik_prawy_a 
     Set Silnik_prawy_b 

     Else 

     Reset Silnik_prawy_a 
     Reset Silnik_prawy_b 
     Reset Silnik_lewy_a 
     Reset Silnik_lewy_b 

End If 
End If 
End If 
End If 


Loop 

To na pewno działa? Ja bym to zrobił tak:

Do
  Getrc5(address , Command)
  Command = Command And &B01111111
  If Command = 2 Then                                      'przód
     Set Silnik_lewy_a
     Reset Silnik_lewy_b
     Set Silnik_prawy_a
     Reset Silnik_prawy_b
  Else
     Reset Silnik_prawy_a
     Reset Silnik_prawy_b
     Reset Silnik_lewy_a
     Reset Silnik_lewy_b
  End If
  If Command = 9 Then                                      'tył
     Reset Silnik_lewy_a
     Set Silnik_lewy_b
     Reset Silnik_prawy_a
     Set Silnik_prawy_b
     Else
     Reset Silnik_prawy_a
     Reset Silnik_prawy_b
     Reset Silnik_lewy_a
     Reset Silnik_lewy_b
  End If
  If Command = 5 Then                                      'lewo
     Reset Silnik_lewy_a
     Set Silnik_lewy_b
     Set Silnik_prawy_a
     Reset Silnik_prawy_b
  Else
     Reset Silnik_prawy_a
     Reset Silnik_prawy_b
     Reset Silnik_lewy_a
     Reset Silnik_lewy_b
  End If
  If Command = 7 Then                                      'prawo
     Set Silnik_lewy_a
     Reset Silnik_lewy_b
     Reset Silnik_prawy_a
     Set Silnik_prawy_b
  Else
     Reset Silnik_prawy_a
     Reset Silnik_prawy_b
     Reset Silnik_lewy_a
     Reset Silnik_lewy_b
  End If
Loop

To tak żebyś zrozumiał o co chodzi mniej więcej a nie wkleił gotowca i dalej nie wiedział jak to się robi.

A gotowca też Ci dam. Może coś jeszcze przeoczyłem ale powinno być ok.

$regfile "attiny2313.dat"
$crystal = 1000000
$lib "mcsbyte.lbx"

Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Config Rc5 = Pind.5
Config Portb = Output
Config Pind.2 = Input
Config Portd.1 = Output

Silnik_lewy_a Alias Portb.1
Silnik_lewy_b Alias Portb.0
Silnik_prawy_a Alias Portb.5
Silnik_prawy_b Alias Portb.6

Pwm1a = 255
Pwm1b = 255

Dim Address As Byte , Command As Byte
Dim Tryb As Bit

Enable Interrupts


Do
  Debounce Pind.0 , 0 , Zmiana_trybu , Sub
  If Tryb = 1 Then
'1 program
     If Pind.2 = 1 Then
        Set Silnik_lewy_a
        Reset Silnik_lewy_b
        Set Silnik_prawy_a
        Reset Silnik_prawy_b
        Debounce Pind.2 , 0 , Skrec , Sub                  'skręć, gdy czujnik wykryje przeszkode
     End If
  Else
'2 program
  Getrc5(address , Command)
  Command = Command And &B01111111
  If Command = 2 Then                                      'przód
     Set Silnik_lewy_a
     Reset Silnik_lewy_b
     Set Silnik_prawy_a
     Reset Silnik_prawy_b
  Else
     Reset Silnik_prawy_a
     Reset Silnik_prawy_b
     Reset Silnik_lewy_a
     Reset Silnik_lewy_b
  End If
  If Command = 9 Then                                      'tył
     Reset Silnik_lewy_a
     Set Silnik_lewy_b
     Reset Silnik_prawy_a
     Set Silnik_prawy_b
  Else
     Reset Silnik_prawy_a
     Reset Silnik_prawy_b
     Reset Silnik_lewy_a
     Reset Silnik_lewy_b
  End If
  If Command = 5 Then                                      'lewo
     Reset Silnik_lewy_a
     Set Silnik_lewy_b
     Set Silnik_prawy_a
     Reset Silnik_prawy_b
  Else
     Reset Silnik_prawy_a
     Reset Silnik_prawy_b
     Reset Silnik_lewy_a
     Reset Silnik_lewy_b
  End If
  If Command = 7 Then                                      'prawo
     Set Silnik_lewy_a
     Reset Silnik_lewy_b
     Reset Silnik_prawy_a
     Set Silnik_prawy_b
  Else
     Reset Silnik_prawy_a
     Reset Silnik_prawy_b
     Reset Silnik_lewy_a
     Reset Silnik_lewy_b
  End If
End If
Loop

Zmiana_trybu:
Tryb = Not Tryb
Return

Skrec:
Portd.1 = 0
Waitms 80
Portd.1 = 1
Waitms 80
Portd.1 = 0
Waitms 80
Portd.1 = 1
Waitms 80
Portd.1 = 0

'stop
Reset Silnik_prawy_a
Reset Silnik_prawy_b
Reset Silnik_lewy_a
Reset Silnik_lewy_b
Waitms 500

'wstecz
Reset Silnik_lewy_a
Set Silnik_lewy_b
Reset Silnik_prawy_a
Set Silnik_prawy_b
Waitms 500

'skręć (w prawo)
Set Silnik_lewy_a
Reset Silnik_lewy_b
Reset Silnik_prawy_a
Set Silnik_prawy_b
Waitms 500

Return
  • Pomogłeś! 1
Link do komentarza
Share on other sites

😃 Te if'y są "jeden w drugim", bo inaczej nie chciało działać 😋 (czyli tak jak Ty napisałem, że

"if .. else.. end if") - tak więc testowałem to. Musiałem tylko zdefiniować PIND.0 jako Input, do którego jest podłączony switch.

EDIT: Tylko mam pytanie: jak raz przycisnę przycisk to włączy mi się 1 program, a jak drugi raz przycisnę przycisk to przełączy na 2 program??

EDIT2: Wszystko działa w takiej konfiguracji - wielkie dzięki za pomoc. 🙂

$regfile "attiny2313.dat"
$crystal = 1000000
$lib "mcsbyte.lbx"

Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Config Rc5 = Pind.5
Config Portb = Output
Config Pind.2 = Input
Config Portd.1 = Output
Config Pind.0 = Input

Silnik_lewy_a Alias Portb.1
Silnik_lewy_b Alias Portb.0
Silnik_prawy_a Alias Portb.5
Silnik_prawy_b Alias Portb.6

Pwm1a = 255
Pwm1b = 255

Dim Address As Byte , Command As Byte
Dim Tryb As Bit

Enable Interrupts


Do
  Debounce Pind.0 , 0 , Zmiana_trybu , Sub
  If Tryb = 1 Then

'1 program
     If Pind.2 = 1 Then
        Set Silnik_lewy_a
        Reset Silnik_lewy_b
        Set Silnik_prawy_a
        Reset Silnik_prawy_b
        Debounce Pind.2 , 0 , Skrec , Sub                  'skręć, gdy czujnik wykryje przeszkode
     End If

  Else

'2 program
  Getrc5(address , Command)

  Command = Command And &B01111111

  If Command = 2 Then                                      'przód
     Set Silnik_lewy_a
     Reset Silnik_lewy_b
     Set Silnik_prawy_a
     Reset Silnik_prawy_b
  Else
     Reset Silnik_prawy_a
     Reset Silnik_prawy_b
     Reset Silnik_lewy_a
     Reset Silnik_lewy_b


  If Command = 9 Then                                      'tył
     Reset Silnik_lewy_a
     Set Silnik_lewy_b
     Reset Silnik_prawy_a
     Set Silnik_prawy_b
  Else
     Reset Silnik_prawy_a
     Reset Silnik_prawy_b
     Reset Silnik_lewy_a
     Reset Silnik_lewy_b


  If Command = 5 Then                                      'lewo
     Reset Silnik_lewy_a
     Set Silnik_lewy_b
     Set Silnik_prawy_a
     Reset Silnik_prawy_b
  Else
     Reset Silnik_prawy_a
     Reset Silnik_prawy_b
     Reset Silnik_lewy_a
     Reset Silnik_lewy_b


  If Command = 7 Then                                      'prawo
     Set Silnik_lewy_a
     Reset Silnik_lewy_b
     Reset Silnik_prawy_a
     Set Silnik_prawy_b
  Else
     Reset Silnik_prawy_a
     Reset Silnik_prawy_b
     Reset Silnik_lewy_a
     Reset Silnik_lewy_b
  End If
  End If
  End If
  End If
End If
Loop

Zmiana_trybu:
Tryb = Not Tryb
Return

Skrec:
Portd.1 = 0
Waitms 80
Portd.1 = 1
Waitms 80
Portd.1 = 0
Waitms 80
Portd.1 = 1
Waitms 80
Portd.1 = 0

'stop
Reset Silnik_prawy_a
Reset Silnik_prawy_b
Reset Silnik_lewy_a
Reset Silnik_lewy_b
Waitms 500

'wstecz
Reset Silnik_lewy_a
Set Silnik_lewy_b
Reset Silnik_prawy_a
Set Silnik_prawy_b
Waitms 500

'skręć (w prawo)
Set Silnik_lewy_a
Reset Silnik_lewy_b
Reset Silnik_prawy_a
Set Silnik_prawy_b
Waitms 500
Return
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.