Skocz do zawartości
maly661

Attiny13A - BASCOM jak to zmodifikować

Pomocna odpowiedź

Witam.

Jestem początkującym użytkownikiem mikrokontrolerów i staram sie ogarnąć programowanie w BASCOM. Napisałem coś takiego bardzo prostego i w sumie spełniałoby to założenie ale mam pytanie czy można w jednym czasie uaktywnić dwa porty w tym przypadku PORTB.3 i PORTB.4. Oba porty musiałyby byś aktywne przez inny okres czasu /np. P3 - 1sek, P4 - 3sek/. Kolejne pytanie to czy można zdefiniować taką funkcje jeżeli na PORTB.0 pojawia sie napięcie to wykonywana jest jakaś funkcja np. podanie prądu na PORTB.3. Byłbym wdzięczny za podpowiedź ewentualnie podanie sposobu rozwiązania. Wiem ze całość napisana jest mało kulturalnie i zajmuje prawie całą pamięć kontrolera ale proszę o wyrozumiałość dopiero zaczynam.

Pozdrawiam

' Atmel ATtiny13
$regfile = "attiny13.dat"

' 1 MHz internal clock
$crystal = 1200000

' PortB is Output
Config Portb = Output

$hwstack = 8
$swstack = 8
$framesize = 8

' Start motor
Do

   Portb.3 = 1                                              'lights
   Waitms 10
   Portb.3 = 0                                              'lights
   Waitms 1
   Portb.4 = 1                                              'lights4
   Waitms 10
   Portb.4 = 0                                              'lights4
   Waitms 1
   Portb.0 = 1
   Waitms 5
   Portb.0 = 0
   Waitms 800
   Portb.3 = 1                                              'lights
   Waitms 8
   Portb.3 = 0                                              'lights
   Waitms 1
   Portb.4 = 1                                              'lights4
   Waitms 10
   Portb.4 = 0                                              'lights4
   Waitms 1
   Portb.0 = 1
   Waitms 5
   Portb.0 = 0
   Waitms 900

   Portb.3 = 1                                              'lights
   Waitms 8
   Portb.3 = 0                                              'lights
   Waitms 1
   Portb.4 = 1                                              'lights4
   Waitms 10
   Portb.4 = 0                                              'lights4
   Waitms 1
   Portb.0 = 1
   Waitms 10
   Portb.0 = 0
   Waitms 700
   Portb.3 = 1                                              'lights
   Waitms 10
   Portb.3 = 0                                              'lights
   Waitms 1
   Portb.4 = 1                                              'lights4
   Waitms 10
   Portb.4 = 0                                              'lights4
   Waitms 1
   Portb.0 = 1
   Waitms 7
   Portb.0 = 0
   Waitms 700

   Portb.3 = 1                                              'lights
   Waitms 8
   Portb.3 = 0                                              'lights
   Waitms 1
   Portb.4 = 1                                              'lights4
   Waitms 10
   Portb.4 = 0                                              'lights4
   Waitms 1
   Portb.0 = 1
   Waitms 8
   Portb.0 = 0
   Waitms 500
   Portb.3 = 1                                              'lights
   Waitms 9
   Portb.3 = 0                                              'lights
   Waitms 1
   Portb.4 = 1                                              'lights4
   Waitms 10
   Portb.4 = 0                                              'lights4
   Waitms 1
   Portb.0 = 1
   Waitms 10
   Portb.0 = 0
   Waitms 700

   Portb.3 = 1                                              'lights
   Waitms 7
   Portb.3 = 0                                              'lights
   Waitms 1
   Portb.0 = 1
   Waitms 9
   Portb.0 = 0
   Waitms 600
   Portb.3 = 1                                              'lights
   Waitms 7
   Portb.3 = 0                                              'lights
   Waitms 1
   Portb.4 = 1                                              'lights4
   Waitms 10
   Portb.4 = 0                                              'lights4
   Waitms 1
   Portb.0 = 1
   Waitms 15
   Portb.0 = 0
   Waitms 700

   Portb.3 = 1                                              'lights
   Waitms 5
   Portb.3 = 0                                              'lights
   Waitms 1
   Portb.4 = 1                                              'lights4
   Waitms 10
   Portb.4 = 0                                              'lights4
   Waitms 1
   Portb.0 = 1
   Waitms 15
   Portb.0 = 0
   Waitms 500
   Portb.3 = 1                                              'lights
   Waitms 8
   Portb.3 = 0                                              'lights
   Waitms 1
   Portb.0 = 1
   Waitms 20
   Portb.0 = 0
   Waitms 500

   Portb.3 = 1                                              'lights
   Waitms 10
   Portb.3 = 0                                              'lights
   Waitms 1
   Portb.4 = 1                                              'lights4
   Waitms 10
   Portb.4 = 0                                              'lights4
   Waitms 1
   Portb.0 = 1
   Waitms 24
   Portb.0 = 0
   Waitms 400
   Portb.3 = 1                                              'lights
   Waitms 6
   Portb.3 = 0                                              'lights
   Waitms 1
   Portb.4 = 1                                              'lights4
   Waitms 10
   Portb.4 = 0                                              'lights4
   Waitms 1
   Portb.0 = 1
   Waitms 30
   Portb.0 = 0
   Waitms 400

   Portb.3 = 1                                              'lights
   Waitms 10
   Portb.3 = 0                                              'lights
   Waitms 1
   Portb.4 = 1                                              'lights4
   Waitms 10
   Portb.4 = 0                                              'lights4
   Waitms 1
   Portb.0 = 1
   Waitms 5
   Portb.0 = 0
   Waitms 700
   Portb.3 = 1                                              'lights
   Waitms 11
   Portb.3 = 0                                              'lights
   Waitms 1
   Portb.4 = 1                                              'lights4
   Waitms 10
   Portb.4 = 0                                              'lights4
   Waitms 1
   Portb.0 = 1
   Waitms 5
   Portb.0 = 0
   Waitms 400


   Portb.3 = 1                                              'lights
   Waitms 11
   Portb.3 = 0                                              'lights
   Waitms 1
   Portb.4 = 1                                              'lights4
   Waitms 10
   Portb.4 = 0                                              'lights4
   Waitms 1
   Portb.0 = 1
   Waitms 24
   Portb.0 = 0
   Waitms 400
   Portb.3 = 1                                              'lights
   Waitms 11
   Portb.3 = 0                                              'lights
   Waitms 1
   Portb.4 = 1                                              'lights4
   Waitms 10
   Portb.4 = 0                                              'lights4
   Waitms 1
   Portb.0 = 1
   Waitms 50
   Portb.0 = 0
   Waitms 300

   Portb.0 = 1
   Waitms 90
   Portb.0 = 0
   Waitms 300
   Portb.0 = 1
   Waitms 120
   Portb.0 = 0
   Waitms 200

   Portb.0 = 1
   Waitms 500
   Portb.0 = 0
   Waitms 100
   Portb.0 = 1
   Waitms 400
   Portb.0 = 0
   Waitms 90

   Portb.0 = 1
   Waitms 800
   Portb.0 = 0
   Waitms 60
   Portb.0 = 1
   Waitms 1000
   Portb.0 = 0
   Waitms 400


Loop

 

Udostępnij ten post


Link to post
Share on other sites

Wszystko się da 😄 , ale masz kilka rzeczy w kodzie do poprawy. Po pierwsze definiujesz cały port B jako wyjście, przez co nie możesz użyć jednego pinu z tego portu jako wejście. Zdefiniuj pojedyncze piny jako wyjścia i wejścia. Zamień też te ciągi włączania tych świateł na pętle bo to się powtarza. Czy dobrze widzę, że to jakiś stroboskop na 2 światełka?

Możesz zdefiniować przerwania PCINT na każdym pinie tego mikrokontrolera, choć prawdę mówiąc nie pamiętam jak się to robi w Bascomie 😄 a nie siedzę teraz na PCie gdzie mam Bascoma zainstalowanego. Wtedy gdy zdefiniujesz przerwanie to ono przerwie wykonywanie kodu bieżącego i przejdzie do obsługi przerwania. A w nim możesz zrobić co chcesz i będzie to miało wyższy priorytet niż kod poza przerwaniem.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Nie do końca stroboskop. Wyjścia z opisem LIGHTS obsługują ledy a wyjścia  bez opisu silnik. Ledy mają imitować iskrzenie silnika. Porty generalnie wszystkie są wyjściami. Silnik działa bez zarzutów ale z ledami jest problem. O ile przy krótkich impulsach na silnik ułomność oka nie wychwyci że błysk następuje po albo przed obrotem to przy długim obrocie niestety diody w trakcie obrotu nie działają. I tu własnie to pytanie czy można podczas obrotu podać impuls na inne wyjście. Z pętlą niebardzo jeszcze wiem jak to zrobić ale myślałem już o tym. Nie moge tylko znaleźć jakigoś objaśnienia które bym ogarnął 🙂 albo jakiegoś mało skomplikowanego przykładu.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Jeżeli dobrze zrozumiałem to pod PB.0 masz silnik a ledy są pod PB.3 i PB.4 jeśli tak to masz źle napisany program.

Powinno to wyglądać tak, że najpierw włączasz silnik np. przed pętlą a potem w pętli migasz sobie diodami na PB.3 i PB.4. Wyglądałoby to mniej więcej tak:
 

Set Pinb.0

for zmienna = 1 to 10

set Pinb.3

set Pinb.4

waitms 10

reset Pinb.3

reset Pinb.4

waitms 10

next

Reset Pinb.0
waitms 100

Musisz zdefiniować zmienna jako Byte na początku po konfiguracji portów.

Program zadziała w ten sposób, że silnik będzie uruchomiony na czas wykonywania pętli a potem będzie przerwa 100ms. W międzyczasie diody będą migały razem co 10ms po 10ms i będzie 10 takich błysków. Myślę, że powinieneś sobie poradzić już z resztą programu.

PS. Mogłem pokręcić definicje set i reset bo nie pamiętam tak z głowy czy pisze się Pinb.0 czy Portb.0, bo to nie to samo, ale w helpie to jest wyjaśnione przy poleceniach set i reset.

A jeśli chciałbyś dodać jakiś przycisk na najlepiej byłoby go podłączyć pod PB1 na jego przerwanie zewnętrzne, wtedy program przerywałby działanie i robił to co ma w przerwaniu.

 

Edytowano przez Sabre
  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites

Spróbowałem zastosować to co podałeś. Przy podłaczeniu układu silnik zasówa pełnymi obrotami a miga słabo jedna dioda ale po około 30 sekundach dioda przestaje ale za to silnik dostaje "dławik" porusza sie krótkimi sekwencjami po czym rusza pełną parą i znów sie dławi. Efekt silnika bardzo mi sie podoba 😄 tylko żeby jeszcze LED migały. Podejżewam że coś nie tak zrobiłem ale przypadkiem silnik wyszedł lepiej niz mój.

' Atmel ATtiny13
$regfile = "attiny13.dat"

' 1 MHz internal clock
$crystal = 1200000

' PortB is Output
Config Portb = Output

' zmienna
Dim F2 As Byte

$hwstack = 8
$swstack = 8
$framesize = 8

Set Portb.0

For F2 = 1 To 10

Set Portb.3

Set Portb.4

Waitms 50

Reset Portb.3

Reset Portb.4

Waitms 100

Next

Reset Pinb.0
Waitms 100

 

Udostępnij ten post


Link to post
Share on other sites

Zróbmy to z głową bo nigdy się nie dogadamy. Napisz, na którym pinie portu B jest silnik, na których pinach są ledy, co jest na pozostałych pinach, albo nawet daj schemat tego czegoś. Domyślam się, że skoro coś się zmienia po około 30 sekundach tzn. masz albo źle ustawione fusebity do zegara, albo włączony jest dzielnik zegara, albo masz inny rezonator niż zdefiniowałeś w kodzie.

  • Lubię! 1

Udostępnij ten post


Link to post
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!

Gość
Napisz odpowiedź...

×   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...