Skocz do zawartości

[Bascom] Początki nauki programowania


agrala

Pomocna odpowiedź

Witam

Jestem tu nowy i mam na imię Artur.

Chciałem zbudować swojego pierwszego robota ale chciałem żeby to był tylko i wyłącznie mój projekt.

Chciałem zacząć od nauki Bascoma ale napotkałem na problemy.

Napisałem program gdzie diody miały się zapalać po naciśnięciu przycisku.

Diody nie reagują na przyciski.

Diody sa podłączone z jednej strony do plusa a z drugiej strony przez rezystory 470Ohm do portóww B, switche podpiete sa do minusa a z drugiej strony do portów D uC.

uC to AT90S8535

Bardzo proszę o wyjaśnienie czemu program nie działa, program przepisany z ksiązki ale dołożyłem po 3 przyciski i diody

$regfile = "8535def.dat"
$crystal = 400000


Config Portb = Output
Config Portd = Input


Led1 Alias Portb.0
Led2 Alias Portb.1
Led3 Alias Portb.2
Led4 Alias Portb.3
Led5 Alias Portb.4

S1 Alias Portd.0
S2 Alias Portd.1
S3 Alias Portd.2
S4 Alias Portd.3
S5 Alias Portd.4

Set Portb.0
Set Portb.1
Set Portb.2
Set Portb.3


Set Portd.0
Set Portd.1
Set Portd.2
Set Portd.3
Set Portd.4

Do
 If S1 = 0 Then
   Waitms 25
 If S1 = 0 Then
   Toggle Led1
   Bitwait S1 , Set
 End If
End If
If S2 = 0 Then
   Waitms 25
 If S2 = 0 Then
   Toggle Led2
   Bitwait S2 , Set
 End If
End If
If S3 = 0 Then
   Waitms 25
 If S3 = 0 Then
   Toggle Led3
   Bitwait S3 , Set
 End If
End If
If S4 = 0 Then
   Waitms 25
 If S4 = 0 Then
   Toggle Led4
   Bitwait S1 , Set
 End If
End If
If S5 = 0 Then
   Waitms 25
 If S5 = 0 Then
   Toggle Led5
   Bitwait S5 , Set
 End If
End If
  Loop
End

Próbowałem też użyc polecenia debounce ale też to nic nie dawało

__________

Komentarz dodany przez: Sabre

Dodałem znaczniki kodu. Popraw proszę pozostałe błędy.

Link do komentarza
Share on other sites

Diody sa podłączone z jednej strony do plusa a z drugiej strony przez rezystory 470Ohm do portóww B, switche podpiete sa do minusa a z drugiej strony do portów D uC.

Nie jestem pewien ale wydaje mi się że diody mają być z jednej strony podłączone do minusa, a nie plusa, a z drugiej do uC. Switche też odwrotnie.

Poczekaj jeszcze na inne odpowiedzi bo od nie dawna zajmuje się robotyką i nie jestem pewien 😉

Edit:

Np. tu dioda jest podłączona do minusa:

Schemat

A te switche chyba masz jednak dobrze.

Link do komentarza
Share on other sites

W AVRach switche podłącza się jednym wyprowadzeniem do pinu, drugim do masy (GND), można też dać zewnętrznę pull-up'y do pinu w postaci rezystora 10k i więcej do plusa zasilania. Diody led w zasadzie wszystko jedno jak będą podłączone. Spróbuj przenieść polecenia set do pętli głównej programu. Ja w moim kodzie zawsze włączam wewnętrzny pull-up przed sprawdzeniem pinu. I nie wiem po co włączasz pull-up'y na wyjściu, przez to podejrzewam wyjście jest cały czas w 1

Set Portb.0

Set Portb.1

Set Portb.2

Set Portb.3

$regfile = "8535def.dat"
$crystal = 400000


Config Portb = Output
Config Portd = Input


Led1 Alias Portb.0
Led2 Alias Portb.1
Led3 Alias Portb.2
Led4 Alias Portb.3
Led5 Alias Portb.4

S1 Alias Portd.0
S2 Alias Portd.1
S3 Alias Portd.2
S4 Alias Portd.3
S5 Alias Portd.4


Do

Set Portd.0
Set Portd.1
Set Portd.2
Set Portd.3
Set Portd.4

 If S1 = 0 Then
   Waitms 25
 If S1 = 0 Then
   Toggle Led1
   Bitwait S1 , Set
 End If
End If
If S2 = 0 Then
   Waitms 25
 If S2 = 0 Then
   Toggle Led2
   Bitwait S2 , Set
 End If
End If
If S3 = 0 Then
   Waitms 25
 If S3 = 0 Then
   Toggle Led3
   Bitwait S3 , Set
 End If
End If
If S4 = 0 Then
   Waitms 25
 If S4 = 0 Then
   Toggle Led4
   Bitwait S1 , Set
 End If
End If
If S5 = 0 Then
   Waitms 25
 If S5 = 0 Then
   Toggle Led5
   Bitwait S5 , Set
 End If
End If
  Loop
End 
Link do komentarza
Share on other sites

Sabre wklepałem Twój program i dalej lipa.

Teraz diody sie świecą ciągle, dalej brak reakcji na switche.

Podaje bezpośrednio minusa a porty d i dalej nic.

Próbowałem drugi uC i dalej to samo.

Co robie źle?

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

Sorki za ślepotę, ale nikt nie liczy zer, w kodzie przy definicji częstotliwości masz 400 000, a nie 4000 000. Poza tym nie masz żadnego opóźnienia w kodzie jako całości, więc pętla główna wykonuje się dość szybko. Dopisz przed loop Waitms 500.

  • Lubię! 1
Link do komentarza
Share on other sites

Witam, również jestem początkujący, na razie zbieram informacje o elektronice i programowaniu. Nie wiem kiedy stosować określenie PIN, a kiedy PORT przy pisaniu programu, na forum znalazłem tylko wzmiankę w poradniku BASCOM, lecz nie rozumiem, Google również nie pomaga.

PS: Jeśli robię off-top, lub odpowiedź jest na forum, najmocniej przepraszam, lecz wyszukiwarka nic nie znalazła.

Link do komentarza
Share on other sites

Pysiek, już ci piszę:

definicja wejść/wyjść używasz zawsze odwołania przez Pin:

Config Pind.4 = Input

Config Pinb.0 = Output

jak chcesz wymusić stan na wyjściu/wejściu to przez Port:

Set Portd.4 / włącze na wejściu wewnętrzny pull-up do plusa zasilania, przez co switch zwiera do masy

Reset Portb.0

jak sprawdzasz stan na wejściu odwołujesz się przez Pin:

If Pinb.0 = 0 Then

  • Lubię! 1
Link do komentarza
Share on other sites

Na moje oko to ten kod jest zbyt przekombinowany. Jeśli w ogóle Ci nie działają te przyciski to spróbuj tego:

$regfile = "8535def.dat"
$crystal = 4000000

Config Portb = Output
Config Portd = Input

Led1 Alias Portb.0
Led2 Alias Portb.1
Led3 Alias Portb.2
Led4 Alias Portb.3
Led5 Alias Portb.4

S1 Alias Pind.0
S2 Alias Pind.1
S3 Alias Pind.2
S4 Alias Pind.3
S5 Alias Pind.4

Set Portd.0
Set Portd.1
Set Portd.2
Set Portd.3
Set Portd.4

Do
 If S1 = 0 Then Toggle Led1
 If S2 = 0 Then Toggle Led2
 If S3 = 0 Then Toggle Led3
 If S4 = 0 Then Toggle Led4
 If S5 = 0 Then Toggle Led5
 Waitms 500
  Loop
End 
Link do komentarza
Share on other sites

problem nie rozwiazany

zmieniłem częstotliwść z 0,4 na 4MHz i dopisałem waitms 500 przed loop - nic nie pomogło

Wgrałem program kolegi mskojon i dalej nic.

W poprzednim programie diody sie nie paliły po podaniu napięcia a w nowym palą sie po podani zasilania, niestety uC dalej nie reaguje na switche, przy podawaniu bezposrednio minusa na porty d też nie ma reakcji.

Switche sprawdzone, podawałem przez nie minusa na diody.

Czy może być to związane z fusebitami?

uC sa z odzysku, oba sprawne, zmieniany jest tylko wsad, w fusebitach nic nie grzebałem bo nie wiem co tam sie zmienia nie chce zablokować uC

Pysiek PIN stosujesz kiedy odwołujesz się do konkretnego pinu, PORT kiedy do danej grupy pinów

np. portb to piny b0 do b7

Link do komentarza
Share on other sites

Czy może być to związane z fusebitami?

uC sa z odzysku, oba sprawne, zmieniany jest tylko wsad, w fusebitach nic nie grzebałem bo nie wiem co tam sie zmienia nie chce zablokować uC

Widzę, że nie masz pojęcia za bardzo o tym co robisz. Czy masz w ogóle podłączony jakiś rezonator do mikrokontrolera? Oczywiście, że fusebity mają znaczenie, jest to konfiguracja mikrokontrolera pod kątem zastosowanego rezonatora chociażby. Prawdopodobnie u ciebie działają one na wewnętrznych rezonatorach. Bez zdjęcia lub schematu twojego układu nie jesteśmy w stanie ci pomóc. Print screen z odczytanymi fusebitami też by bardzo pomógł.

Link do komentarza
Share on other sites

Pysiek, już ci piszę:

definicja wejść/wyjść używasz zawsze odwołania przez Pin:

Config Pind.4 = Input

Config Pinb.0 = Output

jak chcesz wymusić stan na wyjściu/wejściu to przez Port:

Set Portd.4 / włącze na wejściu wewnętrzny pull-up do plusa zasilania, przez co switch zwiera do masy

Reset Portb.0

jak sprawdzasz stan na wejściu odwołujesz się przez Pin:

If Pinb.0 = 0 Then

Prawdę mówiąc, żeby zdefiniować czy port jest we/wy to używamy DDRX (bascom zamienia przy konfiguracji PORTX/PINX na DDRX), potem PINX jest do odczytu, a PORTX do zapisu danych do portu. Jeśli do DDRX wpisane jest 1 to port jest wyjściowy, jeśli 0 - wejściowy, przy wejściowym wppisując do PORTX wartość 1 włączamy wew. pull-upy (jeśli port ustawiony jest jako wyjście, to wtedy PORTX wpisujemy do niego wartość - 1/0). A jeszcze jedno - w bascomie set bit ustawia bit, a reset bit zeruje bit.

Pysiek PIN stosujesz kiedy odwołujesz się do konkretnego pinu, PORT kiedy do danej grupy pinów

np. portb to piny b0 do b7

A to jest nieprawda, są to zupełnie różne rejestry 🙂

Wydaje mi się, że troszkę to pogmatwałem, jeśli jest niezrozumiałe, to sorry.

Link do komentarza
Share on other sites

Nie moge zrobić screena więc przepisuje to co jest w tabelce

Na komputerze którego używam do programowania nie mam Painta więc pozstaje tylko przepisać

Chip

Name AT90S8535

Calibration 0

Lockbits

Lockbit 1 1: Memory lock disabled

Lockbit 2 1: Further programming of the flash and EEPROM is disabled

Fusebits

Fusebit S 0: Serial programming and data downloading enabled

Fusebit F 0: Short start up 1.1 mS

Jeżeli będe uzywał ADC to pod 30 daje +5V bezpośrednio?

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.