Kontroler na Atmega8 - kod Bascom


Witam :)
Po wielu godzinach szukania schematów w Internecie doszedłem do wniosku, że sam od podstaw zbuduję owe urządzenie. Mówiąc w skrócie jest do kontroler, który za pomocą przycisków monostabilnych ma wykonywać dane czynności. Przejrzałem swój inny temat na tym forum i różne tutoriale dostępne w Internecie i sam spróbowałem napisać kod żeby nie iść na łatwiznę a przy okazji mieć frajdę, że sam coś zrobiłem :)

Oto kod:

$regfile = "m8def.dat"
$crystal = 1000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portc = &B1111111 : Portc = &B1111111
Config Portd = &B00000000 : Portd = &B11111111
 
Do
 
 If Pind.1 = 1 Then Portc.3 = 1                             'Wyjście 1'
 If Pind.1 = 1 Then Portc.2 = 0
 If Pind.1 = 1 Then Portc.1 = 0
 If Pind.1 = 1 Then Portc.0 = 0
 
 If Pind.2 = 1 Then Portc.3 = 0                             'Wyjście 2'
 If Pind.2 = 1 Then Portc.2 = 1
 If Pind.2 = 1 Then Portc.1 = 0
 If Pind.2 = 1 Then Portc.0 = 0
 
 If Pind.3 = 1 Then Portc.3 = 0                             'Wyjście 3'
 If Pind.3 = 1 Then Portc.2 = 0
 If Pind.3 = 1 Then Portc.1 = 1
 If Pind.3 = 1 Then Portc.0 = 0
 
 If Pind.4 = 1 Then Portc.3 = 0                             'Wyjście 4'
 If Pind.4 = 1 Then Portc.2 = 0
 If Pind.4 = 1 Then Portc.1 = 0
 If Pind.4 = 1 Then Portc.0 = 1
 
 If Pind.5 = 1 Then Portb.5 = 1                             'Poziom A/B'
 If Pind.5 = 0 Then Portb.4 = 1
 
 If Pind.6 = 1 Then                                         'Włącz/ Wyłącz'
 Toggle Portb.3
 
 End If
 
Loop
End

Nie wiem czy z technicznego punktu widzenia kod jest prawidłowo napisany i będzie działał tak jak powinien, ale plus jest taki, że Bascom nie wykrył żadnych błędów.
Wyjścia 1-4 mają działać na zasadzie wyboru. Tutaj jest to zobrazowane - L I N K

Poziom A/B - jeden włącznik monostabilny na PD5, który po każdym wciśnięciu włącza stan wysoki raz na PB4 a raz na PB5 - Tutaj kod jest bardziej pod przełącznik stabilny, nie wiem jak to zmienić aby było prawidłowo.
Włącz/ Wyłącz - To jest według mnie jedyna poprawna funkcja w całym kodzie :D zmiana stanu na PB3 za pomocą przełącznika na PD6.

Wyjścia 1-4 oraz Poziom A/B na wyjściach będą miały diody Led oraz przekaźniki.
Bardzo ważne jest, żeby podczas wykonywania danej funkcji nie było żadnych przerw czasowych pomiędzy.

Chwilowo nie mam jak sprawdzić kodu, muszę kupić Atmegę bo zamieniłem przez przypadek "+" z "-" i prawdopodobnie ją spaliłem bo programator ma problem z komunikacją (USBasp) - tiny2313 wykrywa bez problemu.

Jeśli zewnętrzny kwarc pomógłby przy płynniejszej pracy układu (a tym bardziej nie zacinaniu się) to o jakiej częstotliwości dać?

Jakby ktoś mógł zerknąć na kod i podrzucić jakieś wskazówki to byłoby super :)




Portret użytkownika kretman4

Przerobiłem kod pod

Przerobiłem trochę kod i testuję go na Attiny2313 żeby sprawdzić czy wszystko będzie chodzić tak jak to wymyśliłem :)

Wersja I

Do
 Select Case Licznik
   Case 0 : Portd = &B11011111
   Case 1 : Portd = &B11101111
   Case 2 : Portd = &B11110111
   Case 3 : Portd = &B11111011
 End Select
 
 If Pinb.0 = 0 Then Licznik = 0                             'Wyjście 1
 If Pinb.1 = 0 Then Licznik = 1                             'Wyjście 2
 If Pinb.2 = 0 Then Licznik = 2                             'Wyjście 3
 If Pinb.3 = 0 Then Licznik = 3                             'Wyjście 4
 
Loop

Wersja II

Do
 
 If Pinb.0 = 0 Then Portd = &B11111110                      'Wyjście 1
 If Pinb.1 = 0 Then Portd = &B11111101                      'Wyjście 2
 If Pinb.2 = 0 Then Portd = &B11111011                      'Wyjście 3
 If Pinb.3 = 0 Then Portd = &B11110111                      'Wyjście 4
 
Loop

W obydwu przypadkach chodzi niemalże identycznie, chociaż działanie wersji z Select Case bardziej mi odpowiada, bo po włączeniu zasilania włączone jest wyjście 1 i nie można jednocześnie włączyć np 2ki i 4ki.
Nie wiem czy można tak to zrobić ale działa.

Portret użytkownika kaktus

;-D Można, powinieneś jeszcze

;-D
Można, powinieneś jeszcze zastanowić się nad wyeliminowaniem drgania styków. Co będzie sterowane?

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika kretman4

Jeśli drganiem styków

Jeśli drganiem styków nazywane jest to że nie działa włącz/wyłącz tylko wariuje za każdym razem inaczej to nie mam z tym żadnego problemu.

Sterowane będą przekaźniki które dalej będą swoje robić:)

Jedyna rzecz którą bym chciał zmienić a nie wiem jak to fakt że po podłączeniu zasilania wszystkie wyjścia się włączają na jakieś mikrosekundy - na wszystkich diodach mam szybki błysk, ale bardzo słaby dioda ledwo świeci), i chciałbym się tego pozbyć.

Siedziałem dzisiaj cały dzień i w końcu udało mi się zrobić cały układ tak jak miał działać. Nie wiem czy kod jest poprawnie napisany, ale skoro wszystko pięknie chodzi to chyba jest, chociaż pewnie dałoby się go odchudzić :)

Problem mam teraz inny bo potrzebuję do tego całego układu dorobić drugi układ z menu w którym wybierałbym ustawienia i zatwierdzał, i zastanawiam się czy zrobić wszystko na jednym wielkim mikrokontrolerze czy z wyjść z jednego i wejść na drugi (co chyba jest trochę bez sensu)

Portret użytkownika kretman4

Wszystko sobie rozrysowałem i

Wszystko sobie rozrysowałem i wychodzi na to że łącznie będę wykorzystywał 31-32 porty I/O. Myślałem nad Atmega32 ale to wyjdzie w praniu.

Podstawowe sterowanie mam już zrobione i działa ale ciąg dalszy jak dla mnie to koszmar :D

Aktualnie staram się cokolwiek zrozumieć z działu "Menu wielopoziomowe". Muszę zrobić takie menu:

wejście poprzez przycisk SET,
potem do wyboru 4 opcje (Wyjścia 1-4) - można wybrać tylko jedną, po wciśnięciu danego przycisku miga dioda odpowiedzialna za wybraną opcję, zatwierdzenie wyboru przyciskiem ENTER
do wyboru 4 opcje (Wyjścia A-D) - można wybrać kilka jednocześnie, miga dioda odpowiedzialna za wybraną opcję, zatwierdzenie wyboru przyciskiem ENTER

Fajnie by było jakby w pierwszym poziomie (Opcje 1-4) dało się wykorzystać diody przypisane juz do do Wyjść 1-4.

Ważne też jest to, że jeśli włączone wyjście powiedzmy 2, na którym aktywne jest wyjście np. C i D, a w tym momencie wchodzimy w opcje i przypisujemy cokolwiek do czegokolwiek to nei wpływa to na działanie do momentu zatwierdzenia ostatniego wyboru ENTERem

Może już ktoś się spotkał z takim menu i chciałby pomóc to byłoby super :)

Portret użytkownika kaktus

((-;

Quote:
Wszystko sobie rozrysowałem i wychodzi na to że łącznie będę wykorzystywał 31-32 porty I/O. Myślałem nad Atmega32 ale to wyjdzie w praniu.

jeżeli te porty potrzebujesz tylko do przekaźników i/lub przycisków zastanów się nad expanderem IO (PCF8574, PCF8575 itd), nawet z rozbudowanym menu ten Mega8 powinien wystarczyć.
Bardzo ambitne założenia sobie przyjąłeś, do komunikacji z użyszkodnikiem mrygający LED ładnie, lecz pewno warto by tu przerwania już wykorzystać, albo jakiś bardzo wolny PWM może by się dało nastroić teoretyzuję. Jeśli to Twój pierwszy samodzielny projekt z ?C to powolutku sobie zadania dodawaj, bo łatwo się mówi ;-))

Dasz radę sam "to" zrobić tylko żeby zaparcia nie brakło.

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika kretman4

"TO" ma być kontrolerem do

"TO" ma być kontrolerem do wzmacniacza gitarowego i kontrolerem Pętli efektów w jednym (z malym dodatkiem 2 innych funkcji) :) Jeśli chodzi o dostępne urządzenia/ sprzęty to ciężko mnie zadowolić więc doszedłem do wniosku że jeśli sam zrobię całość według moich wizji to wtedy będę zadowolony :D

To co już zrobiłem jest już tym kontrolerem wzmacniacza, a to nad czym walczę (menu o którym wyżej wspomniałem) to właśnie ta część z kontrolerem pętli efektów. Po prostu zamiast robić jeden kontroler do tego a drugi do tamtego, wcisnę wszystko w jedną obudowę i zamiast wciskać 2 przyciski jednocześnie zrobię to samo jednym :)

Będzie 13 przycisków i 12 wyjść (Ledy) i 5 wyjść na przekaźniki (w kontrolerze - we wzmacniaczu będzie ciąg dalszy).

Wszystko robię w Bascomie bo od tego zacząłem (moje pierwsze kroki zaczęły się na tym forum - tutaj podziękowania dla Mirley'a za pomoc!). Szczerze mówiąc nie mam pojęcia o programowaniu, jedynie rozumiem większość komend bo są z angielskiego, ale nie zawsze wiem kiedy, co i gdzie użyć :)

To udało mi się wykrzesać i działa idealnie - L I N K.
To muszę dokleić to powyższego kodu - L I N K. Tylko zmienić jedną rzecz ale nie mam pojęcia jak :D

A do tych dwóch powyższych dopisać kod z tym menu :)

Jak na zupełnie pierwszy własny projekt to zaszalałem. Ale jeśli i tak miałbym to kiedyś zrobić to czemu nie zacząć teraz :)

Portret użytkownika kretman4

A no i jeszcze... o

A no i jeszcze... o Expanderach nie mam zielonego pojęcia, tak samo jak o PWM.

robię migającą diodę po wciśnięciu przycisku i przy wykorzystaniu WAITMS spowalnia mi to cały program (w końcu tak polecenie WAIT działa), w jaki sposób mogę zrobić odstępy czasowe w SELECT CASE tak żeby dotyczyły one tylko SELECT CASE a nie całego programu? Wydaje mi się że opcją TIMER, ale niebardzo potrafię z niej skorzystać.

Portret użytkownika kaktus

Quote:robię migającą diodę po

Quote:
robię migającą diodę po wciśnięciu przycisku i przy wykorzystaniu WAITMS spowalnia mi to cały program (w końcu tak polecenie WAIT działa)

jak sam słusznie zauważyłeś nie możesz się posługiwać tą instrukcją.
Niektórzy do nieprecyzyjnego odmierzania "nieokreślonych" odcinków czasu wykorzystują zmienną inkrementowaną przy każdym wykonaniu pętli głównej, w twoim przypadku gdy dojdzie do obsługi menu, taki sposób zawiedzie.
Więc musisz się wgryźć w obsługę przerwań - nie taki AVR straszny jak go malują. Wierz mi, w dodatku mirley w swoich kodach wszystko ładnie obtłumaczył tak że z powodzeniem dasz sobie radę. Poszperaj poczytaj dla przykładu -> http://mirley.firlej.org/kuchenny_timer

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika kretman4

Dzięki! Już trochę to

Dzięki! Już trochę to przejrzałem, ale efektów zobaczyć nie mogę bo nie mam mikrokontrolera jeszcze, a co chwile zmieniać program na 2313 to bez sensu. Aktualnie czekam na Atmega32 i jak dojdzie to będę walczył dalej.

Zastanawiam się jakie napięcie zastosować. Pierwotnie wzmacniacz, którym się sugerowałem pracuje na napięciu 24V (sterowanie, wzmacniacz na wyższe bo to lampa) z tym że tam nie ma żadnego mikrokontrolera, jedynie LM324 i jakiś HCxx. Ja na początku przyjąłem 12V dla sterowania (w sumie tylko przekaźniki) i dodatkowy stabilizator 5V dla mikrokontrolera. Budowanie tego na napięciu 24V a nie 12V byłoby lepszym rozwiązaniem?

Jeśli Atmege zasilę 5V i na pinie wychodzącym dam LEDa z rezystorem to muszę ją podłączać pod to samo zasilanie co Atmege? Czy mogę dać większy rezystor i podłączyć pod te 12 lub 24V?

Portret użytkownika kaktus

(-;

Postaraj się zawsze odizolować ?C od "wysokiego" napięcia. To dobra praktyka. Jeśli chcesz sterować LED-em z napięcia 12-24V DC proponuję po drodze jakiś tranzystorek dla świętego spokoju.
Praktykuj z "małymi" ?C te duże są za duże na pierwszy strzał, jak zdobędziesz praktykę to będziesz "większe" męczył. Mały kosztuje mniej, w razie przypadkowego zniszczenia można powiedzieć że mniejsza szkoda.

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika kretman4

Jednak muszę napisać program

Jednak muszę napisać program na AT89S52. Ale tak mnie trafia że się zastanawiam czy nie lepiej dla obsługi 2 przycisków dać jednego Tiny13, na trzeci przycisk drugiego Tiny13, a na resztę jakąś Atmege8 lub wieksza...

Najchetniej bym ten program napisal w języku C, ale niestety jako że zacząłem całą przygodę od Bascoma to jego troche ogarniam a C musiałbym się uczyć od podstaw, a w dodatku większość napisanego już programu 'tłumaczyć' na język C.

W związku z tym mam pytanie co do '51. Szukałem jakiś książek, tutoriali itp.. ale konkretnej odpowiedzi nie znalazłem. '51 od tych nowszych różnią się jedynie zapisem nazwy portu?

np P.1 - PortB ...

Portret użytkownika kaktus

dwie książki gratis

Proszę bardzo tutaj wszystko wyczytasz:
AVR
8051

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika gosc

Dziękuję! Trochę poczytałem,

Dziękuję!
Trochę poczytałem, może uda mi się coś zrobić na tym AT89 :)

Mam pytanie o przerobienie tego kodu. Znalazłem go w internecie, przerobiłem pod tiny13, nie wiem czy jest poprawnie napisany, ale mi działa bez zarzutu, poza jedną rzeczą którą właśnie chciałbym zmienić.
Na chwilę obecną jest tak że po wciśnięciu przycisku za pierwszym razem rozpoczyna się odliczanie (i Led jest wyłączony), a przy wciśnięciu za drugim razem zliczanie czasu pomiędzy wciśnięciami się kończy i od tego momentu Led błyska z taką częstotliwością jaka jest między pierwszym a drugim wciśnięciem. Potrzebowałbym zmienić ten kod tak żeby podczas pierwszego wciśnięcia Led też błysnął.

$regfile = "attiny13a.dat"
$crystal = 4000000
 
Config Pinb.0 = Output
Config Pinb.4 = Input
Pinb.4 = 1
 
 
Config Debounce = 1
 
Config Int0 = Falling
Config Timer0 = Timer , Prescale = 64
On Timer0 Przerwanie_co_1ms
On Int0 Zeruj
 
Led Alias Portb.0
Portb.0 = 1
 
Dim Granica As Word
Dim Licznik As Word
Dim Odlicz As Word
Dim Tik As Bit
 
Granica = 1000
Odlicz = 0
Licznik = 0
Tik = 0
 
Enable Interrupts
Enable Timer0
Enable Int0
Timer0 = 6
Start Timer0
 
'-------------------------------------------
Glowna:
Do
   Debounce Pinb.4 , 0 , Zacznij , Sub
      If Tik = 1 Then
      Gosub Petla
   End If
Loop
 
'-------------------------------------------
Petla:
 
If Odlicz = Granica Then
Reset Portb.0
   Odlicz = 0
End If
 
If Odlicz >= 2 Then
Set Portb.0
End If
 
Incr Odlicz
 
Reset Tik
 
Return
 
'-------------------------------------------  start licznika
Zacznij:
 
Licznik = 0
 
Do
   Debounce Pinb.4 , 0 , Zakoncz , Sub
Loop
 
'-------------------------------------------  2 klik - zakończ przechwytywanie
Zakoncz:
Stop Timer0
Gosub Przepisz
Start Timer0
Gosub Glowna
 
'-------------------------------------------  przepisanie zmiennej
Przepisz:
Granica = Licznik
Odlicz = 0
Return
 
'------------------------------------------- +131 dla uzyskania 1mS
Przerwanie_co_1ms:
 
Counter0 = Counter0 + 131
 
Incr Licznik
 
Set Tik
 
Return
'-------------------------------------------
Zeruj:
Odlicz = Granica
Counter0 = Counter0 + 131
Return
 
End

Portret użytkownika kretman4

Problem rozwiązany :)

Problem rozwiązany :)