Mikrokontroler - zasilanie


Witam, mam pytanie, czy żeby mikrokontroler działał prawidłowo musi być w nim użyta pętla DO.. LOOP i w niej cały kod?
Drugie pytanie, to czy da się jakoś zrobić przycisk ON/OFF? Np, używając funkcji SLEEP i RESET? Albo jakoś inaczej, żeby było fachowo...

Czy taki kod zadziała tak jak chcę:

$regfile = "m8def.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 = &B00000000
Config Portc = Output                                       'pprt c jako wyjścia
       Portc = &B0000000
 
 
Dim Dzwiek As Bit
Dzwiek = 0
 
 
Do                                                          ' poczatek petli glowne
 
 If Pinb.0 = 1 Then                                         ' wlacza migajaca diode PORTD.0
   Do
    Toggle Portd.0
    Waitms 1000
   Loop
 End If
 
 If Pinb.1 = 1 Then                                         ' wlacza policyjne swiatla diod PORT.D1-3 (po kolei diody się zaświecają (jednocześnie świeci tylko jedna))
   Do
    Portd.1 = 1
    Portd.2 = 0
    Portd.3 = 0
    Waitms 250
    Portd.1 = 0
    Portd.2 = 1
    Portd.3 = 0
    Waitms 250
    Portd.1 = 0
    Portd.2 = 0
    Portd.3 = 1
    Waitms 250
   Loop
 End If
 
 
 
 If Pinb.2 = 1 Then                                         ' wlacza buzzer na PORTD.4 (jakaś melodyjka)
  If Dzwiek = 0 Then
   Dzwiek = 1
   Do
    Sound Portd.4 , 4 , 10
    Waitms 500
    Sound Portd.4 , 4 , 15
    Sound Portd.4 , 1 , 10
    Sound Portd.4 , 1 , 15
    Sound Portd.4 , 1 , 20
    Sound Portd.4 , 1 , 30
    Waitms 600
    Sound Portd.4 , 1 , 30
    Sound Portd.4 , 1 , 20
    Sound Portd.4 , 1 , 10
    Sound Portd.4 , 5 , 5
    Waitms 1000
   Loop
   Dzwiek = 0
  End If
 End If
 
 
Loop                                                        'koniec pętli glownej
 
End

Proszę o odpowiedź...

A i czy można jeszcze jakoś sterować buzzerem, żeby wydawał tony o różnej głośności?




Portret użytkownika gosc

zynzynier

teoretycznie nie wiem czy będzie działał.
korzystasz z języka BASCOM wiec
a) program zawsze zawiera się w pętli nieskończonej DO / LOOP / END
b) warunki dla przycisków można zrobić poprzez odpowiednie np IF / END IF
c) można obsłużyć przerwania / np. zewnętrzne INT1/INT2
d) do głośności i melodii buzerra w BASCOM wykorzystuje się instr.
SOUND pin , il_impulsów , czas_impulsu
np.:

Sound Portb.1 , 10000, 10 'generuj jakiś dźwięk

End

polecam plik help do bascoma

Portret użytkownika mirley

Re; Buzzer

Buzzer musi być bez generatora, sama membrana bo inaczej zagra tylko tym co ma zaszyte w środku

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Chev_Lucas

Podalibyście jakiś przykład

Podalibyście jakiś przykład kodu, którym obsłużyć przycisk ON i OFF?
Da się jakoś regulować napięcie które wychodzi z PINu? taki rodzaj potencjometru?

Portret użytkownika noki

Nie da się wyłączyć softowo

Nie da się wyłączyć softowo procka można go przełączyć w tryb power down i wybudzić przerwaniem (ale bez specjalnych komend się nie da). Za to możesz dać wyłącznik, lub dwa przyciski + dwa tranzystory (lecz takie rozwiązanie nawet gdy układ nie pracuje też pobiera odrobinę prądu)

Odnośnie pętli to nie jest konieczna z tego co pamiętam ale jeżeli jej niema to program dochodzi do końca i już nie będzie reagował.

Mam jeszcze jedną uwagę

If Pinb.1 = 1 Then                                         ' wlacza policyjne swiatla diod PORT.D1-3 (po kolei diody się zaświecają (jednocześnie świeci tylko jedna))
   Do
    Portd.1 = 1
    Portd.2 = 0
    Portd.3 = 0
    Waitms 250
    Portd.1 = 0
    Portd.2 = 1
    Portd.3 = 0
    Waitms 250
    Portd.1 = 0
    Portd.2 = 0
    Portd.3 = 1
    Waitms 250
   Loop
 End If

Aby wyjść z tej pętli musisz odłączyć zasilanie / ew ściągnąć reset do masy na chwilę. Jeżeli chcesz aby programowo można było wyjść z tej pętli dostaw w niej:

If pinx.x = 1 then 'pin przycisku do wyjścia z pętli (zwierający do +5)
   exit do
end if

Kolejna uwaga debonucing przycisków (u ciebie niekonieczne bo 1 przycisk nie jest wykorzystywany już w pętli do której prowadzi) jedna gdybyś chciał zrobić wyjście z pętli tym samym przyciskiem to jest to raczej konieczne, zresztą gdybyś projekt kiedyś rozwinął...
dam ci przykład:

If Pin.0 = 1 then
   waitms 15
   if pin.0 = 1 then
      'akcje które mają być wykonywane po przyciśnięciu przycisku
   end if
end if

na początku programu - jeszcze przed pętlą masz:

Dzwiek = 0

Każda zdeklarowana zmienna na starcie ma wartość 0 więc nie trzeba tego pisać.

kolejna uwaga:

If Pinb.2 = 1 Then                                         ' wlacza buzzer na PORTD.4 (jakaś melodyjka)
  If Dzwiek = 0 Then
   Dzwiek = 1
   Do
    Sound Portd.4 , 4 , 10
    Waitms 500
    Sound Portd.4 , 4 , 15
    Sound Portd.4 , 1 , 10
    Sound Portd.4 , 1 , 15
    Sound Portd.4 , 1 , 20
    Sound Portd.4 , 1 , 30
    Waitms 600
    Sound Portd.4 , 1 , 30
    Sound Portd.4 , 1 , 20
    Sound Portd.4 , 1 , 10
    Sound Portd.4 , 5 , 5
    Waitms 1000
   Loop
   Dzwiek = 0
  End If
 End If

Przy kliknięciu przycisku na Pb.2 zmieniasz wartość zmiennej "Dzwiek" następnie program w chodzi do pętli z której nie może się wydostać, a za pętlą masz:

Dzwiek = 0

więc teoretycznie i w praktyce ta akcja nigdy się nie spełni.

odnośnie wychodzenia z pętli to mam taki trick :)
pokaże to na przykładzie programiku który zmienia stan na końcówce jeden przycisk PB.2 drugi PB.3, ale robi to tylko raz (sprawdza czy switch jest nie przyciśnięty, odczekuje 10ms sprawdza, czy jest przyciśnięty, czeka 10ms znowu sprawdza czy jest przyciśnięty i jeżeli tak to zmienia stan)

do
   If pinb.0 = 0 then
      waitms 10
      If pinb.0 = 1 then
         waitms 10
         if pinb.0 = 1 then
            toggle portb.2
         end if
      end if
   end if
   If pinb.1 = 0 then
      waitms 10
      If pinb.1 = 1 then
         waitms 10
         if pinb.1 = 1 then
            toggle portb.3
         end if
      end if
   end if
loop

powinno działać - ja zawsze używam przycisków ściągających do masy i warunki wciśnięcia są inne(jeśli 1,wait,jeśli 0, wait, jeśli 0, część wywoływana po kliknięciu ), musisz tylko dostosować numery pinów/portów i wstawić to co chcesz w pętli

powiedz jak ma działać program (dokładnie bo nie wiem co mam ci poradzić) bo jest tu jeszcze kilka drobiazgów.

Portret użytkownika Chev_Lucas

Taki pierwszy prosty program

Taki pierwszy prosty program który po naciśnięciu klawisza nr 1 dioda zaczyna mrugać, po ponownym naciśnięciu przestaje.
przycisk nr2 i 3 tak samo tylko inne funkcje (mruganie 3 diód oraz buzzer)

Portret użytkownika noki

tak na szybko, kod nie jest

tak na szybko, kod nie jest doskonały gdyż mój sposób nadaje się do krótkich akcji a miganie diody i te waitms trwają długo, dlatego aby wyjść z "efektu" należy przytrzymać klawisz bo warunek nie jest sprawdzany cały czas. Jeżeli będę miał chwilę czasu to pomyślę jak to rozwiązać.

'### pierwszy program 3 przyciski ###
 
'###### Dyrektywy kompilatora #######
$regfile = "m8def.dat"
$crystal = 1000000
 
'##### polecenia konfiguracyjne #####
Config Portb = Input
       Portb = &B00000000
Config Portd = Output
       Portd = &B00000000
Config Portc = Output
       Portc = &B0000000
 
'############## Stałe ###############
Const Deb = 10                                              ' czas debonucingu przycisków (ms)
 
'########## Program główny ##########
 
 
 
'########### Pętla główna ###########
Do
   If Pinb.0 = 0 Then                                       'pierwszy przycisk
      Waitms Deb
      If Pinb.0 = 1 Then
         Waitms Deb
         If Pinb.0 = 1 Then
            Do
               Portd.1 = 1
               Portd.2 = 0
               Portd.3 = 0
               Waitms 250
               Portd.1 = 0
               Portd.2 = 1
               Portd.3 = 0
               Waitms 250
               Portd.1 = 0
               Portd.2 = 0
               Portd.3 = 1
               Waitms 250
               If Pinb.0 = 1 Then
                  Waitms Deb
                  If Pinb.0 = 1 Then
                     Exit Do
                  End If
               End If
            Loop
         End If
      End If
   End If
 
   If Pinb.1 = 0 Then                                       'drugi przycisk
      Waitms Deb
      If Pinb.1 = 1 Then
         Waitms Deb
         If Pinb.1 = 1 Then
            Do
               Toggle Portd.0
               Waitms 1000
               If Pinb.1 = 1 Then
                  Waitms Deb
                  If Pinb.1 = 1 Then
                     Exit Do
                  End If
               End If
            Loop
         End If
      End If
   End If
 
   If Pinb.2 = 0 Then                                       'trzeci przycisk
      Waitms Deb
      If Pinb.2 = 1 Then
         Waitms Deb
         If Pinb.2 = 1 Then
            Do
               Sound Portd.4 , 4 , 10
               Waitms 500
               Sound Portd.4 , 4 , 15
               Sound Portd.4 , 1 , 10
               Sound Portd.4 , 1 , 15
               Sound Portd.4 , 1 , 20
               Sound Portd.4 , 1 , 30
               Waitms 600
               Sound Portd.4 , 1 , 30
               Sound Portd.4 , 1 , 20
               Sound Portd.4 , 1 , 10
               Sound Portd.4 , 5 , 5
               Waitms 1000
               If Pinb.2 = 1 Then
                  Waitms Deb
                  If Pinb.2 = 1 Then
                     Exit Do
                  End If
               End If
            Loop
         End If
      End If
   End If
 
Loop
 
End

jak już pisałem zawsze używam przycisków ściągających do masy, tu zrobiłem program dla twoich przycisków, niemniej nie testowałem tego rozwiązania, ale teoretycznie powinno być ok.

Nie ręczę za działanie opcji sound, gdyż nigdy jej nie używałem i nie jestem w stanie powiedzieć czy jest dobrze.

Zmienna "deb" odpowiada za czas debonucingu trzeba go dobrać eksperymentalnie dla microswitchy używam 10-20ms dla niektórych przycisków czas ten trzeba wydłużyć, choć w takiej wersji programu nawet jakikolwiek debonucing jest zbędny :)

PS.
mirley
Te "bloki" komentarzy opisujące fragmenty kodu są bardzo użyteczne i od kiedy znalazłem twoją stronę używam je we wszystkich programach.

Portret użytkownika gosc

ok dzieki ;)

ok dzieki ;)

Portret użytkownika Chev_Lucas

Jakiej baterii użyć do

Jakiej baterii użyć do zasilania, jakieś 5-voltowej? Podajcie numer, nie chce łączyć trzech AA, żeby mieć 4,5V.

Portret użytkownika noki

Niema standardowych/tanich

Niema standardowych/tanich baterii 4-5v, można użyć baterii 4,5v (płaskiej), kupić koszyczek na trzy paluszki, bądź kupić baterię o wyższym napięciu i je zbić lub wysabilizować.