Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 1 maja 2025, o 10:39


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Ten wątek jest zablokowany. Nie możesz w nim pisać ani edytować postów.  [ Posty: 33 ]  Przejdź na stronę 1, 2  Następna strona
    Autor Wiadomość
    PostNapisane: 9 sty 2017, o 18:28 
    Offline
    Nowy

    Dołączył(a): 09 sty 2017
    Posty: 17
    Pomógł: 0

    Witam, jestem zielony z assemblera oraz mikrokontrolerów avr...

    Muszę napisać na studia program, który za pomocą przerwań zapala diodę dzięki wciśnięciu klawisza i gasi diodę podczas drugiego wciśnięcia - to jest pierwszy program.

    Drugi ma używać timerów i powinien gasić i zapalać diodę co 500ms.

    Czy ktoś może mi to napisać lub wytłumaczy jakby to miało wyglądać?

    P.S. Na studiach używamy ATmega32.



    Góra
     Zobacz profil  
     
    PostNapisane: 9 sty 2017, o 19:05 
    Offline
    Użytkownik

    Dołączył(a): 23 sty 2014
    Posty: 1085
    Pomógł: 73

    W czystym asemblerze chcesz to pisać czy w C i tylko wstawki asemblerowe?



    Góra
     Zobacz profil  
     
    PostNapisane: 9 sty 2017, o 19:06 
    Offline
    Nowy

    Dołączył(a): 09 sty 2017
    Posty: 17
    Pomógł: 0

    Niestety musi być to czysty asembler :/



    Góra
     Zobacz profil  
     
    PostNapisane: 9 sty 2017, o 19:19 
    Offline
    Uzytkownik zasłużony dla forum.atnel.pl
    Avatar użytkownika

    Dołączył(a): 16 lip 2012
    Posty: 2088
    Lokalizacja: Leżajsk / Kraków
    Pomógł: 411

    W kursie Programowanie mikrokontrolerów AVR w języku assembler na tej stronie
    http://www.forbot.pl/forum/articles_list.php?tag=Kurs&start=10
    znajdziesz rozwiązanie

    _________________
    Dragonus Cracovus: Biomagia



    Góra
     Zobacz profil  
     
    PostNapisane: 9 sty 2017, o 19:31 
    Offline
    Nowy

    Dołączył(a): 09 sty 2017
    Posty: 17
    Pomógł: 0

    Czytałem te kursy i niestety nie rozumiem nadal...

    Posiadam początkowy kod z przerwaniami ale nie wiem co mam pisać dalej...



    Góra
     Zobacz profil  
     
    PostNapisane: 9 sty 2017, o 20:06 
    Offline
    Użytkownik

    Dołączył(a): 23 sty 2014
    Posty: 1085
    Pomógł: 73

    http://wydawnictwo.btc.pl/index.php?productID=197738 a w literaturze nic nie znalazłeś?



    Góra
     Zobacz profil  
     
    PostNapisane: 9 sty 2017, o 21:42 
    Offline
    Uzytkownik zasłużony dla forum.atnel.pl
    Avatar użytkownika

    Dołączył(a): 16 lip 2012
    Posty: 2088
    Lokalizacja: Leżajsk / Kraków
    Pomógł: 411

    W części 5 jest prawie wszystko tylko:
    1. Dla zadania 1 bierzemy ćwiczenie 1, ale w main nic nie robisz. W przerwaniu trzeba zmienić stan na przeciwny:
    Składnia: [ Pobierz ] [ Ukryj ]
    język asm
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    2. Dla zadania 2 bierzemy ćwiczenie 2, ale wyrzucamy całkiem EXT_INT0. W przerwaniu od timera zmieniamy stan LED jak pokazano wyżej.


    Autor postu otrzymał pochwałę

    _________________
    Dragonus Cracovus: Biomagia



    Góra
     Zobacz profil  
     
    PostNapisane: 10 sty 2017, o 08:08 
    Offline
    Nowy

    Dołączył(a): 09 sty 2017
    Posty: 17
    Pomógł: 0

    Spróbuje jeszcze raz pokombinować,.
    Dzięki za linki, jeśli będę miał jakieś problemy to napiszę :)



    Góra
     Zobacz profil  
     
    PostNapisane: 10 sty 2017, o 18:34 
    Offline
    Nowy

    Dołączył(a): 09 sty 2017
    Posty: 17
    Pomógł: 0

    Kod:
    main:
    cbi PORTA, 0 //zgaś diodę
    rjmp main

    EXT_INT0: //procedura obsługi przerwania INT0
    sbi PORTA, 0 //zapal diode LED



    Nie rozumiem tego fragmentu...
    Ten main będzie mi się wywoływał zawsze czy tylko wtedy gdy przerwanie nie wystąpi?


    W ćwiczeniu drugim. Nie wiem natomiast na jakiej zasadzie dioda ma migać i jak ustawić jej czas migania...



    Góra
     Zobacz profil  
     
    PostNapisane: 11 sty 2017, o 17:37 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 30 cze 2016
    Posty: 247
    Lokalizacja: Rybnik
    Pomógł: 13

    Fragment
    Składnia: [ Pobierz ] [ Ukryj ]
    język asm
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
    to po prostu nieskończona pętla. Jeżeli dobrze zrozumiałem, to wytłumaczę w dwóch linijkach, co to robi.
    1. Zerowanie bitu PA0 w PORTA(czyli gaszenie diody).
    2. Skok do pkt. 1.(czyli main);


    Po
    Składnia: [ Pobierz ] [ Ukryj ]
    język asm
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
    powinnno być
    Składnia: [ Pobierz ] [ Ukryj ]
    język asm
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
    żeby wrócić tam, skąd się wyskoczyło. Jeżeli nie będzie tego, to program wyskoczy do przerwania i nie wróci, nieskończona pętla będzie skończona. A więc
    Składnia: [ Pobierz ] [ Ukryj ]
    język asm
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Prawda jest taka, że dioda będzie cały czas "wyłączona", bo zanim oko zdąży zarejestrować załączenie diody, po ~3 taktach zegara się ta dioda wyłączy.





    Oki pomyślałem i daję niestety rybę, bo wędka zbyt duża. Powinno działać.
    Obrazek
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język asm
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Autor postu otrzymał pochwałę

    _________________
    Situs != Situs



    Góra
     Zobacz profil  
     
    PostNapisane: 12 sty 2017, o 08:44 
    Offline
    Nowy

    Dołączył(a): 09 sty 2017
    Posty: 17
    Pomógł: 0

    Kod:
    .include "m32def.inc"
    .list
         
    .cseg
    .org 0
       
    jmp start  //pominiecie wektorów
    .org 0x0002   
     
    rjmp EXT_INT0 //Zewnętrzne przerwanie INT0

         
    start: 
         
    ldi r16, (1<<PA0)
    out DDRA, r16 //pin diody (PA0) jako wy
         
    ldi r16, (1<<PD2) | (1<<PD3)
    out PORTD, r16 //ustawianie podciągnięcia na przyciskach
    clr r16 //wpisywanie 0 do rejestru r16
    out DDRD, r16 //i ustawianie całego portu D jako we
         
    ldi r16, (1<<INT0)
    out GICR, r16 //zezwolenie na przerwania zewnętrzne od INT0
         
    ldi r16, (1<<ISC01) //ustawienie przerwania od zbocza op na INT0
    out MCUCR, r16  //czyli uwzględniając podciągnięcia będą to przerwania od kliknięć przycisku
       
    sei //włączenie obłsugi przerwań
         
         
    main: //pętla nieskończona
    rjmp main
         
    EXT_INT0: //przycisk klik
    //W asm tyle roboty, a w c wygląda to tak
    //PORTA ^= (1<<PA0) ;
         
    in r16, PORTA
    andi r16, (1<<PA0) //interesuje nas tylko bit PA0

    cpi r16, (1<<PA0)
    breq ustawione  //jak bit pa0 w porta ustawiony
         
    cpi r16, (1<<PA0)
    brne wyzerowane  //jak bit pa0 w porta ustawiony
         
    powrot:
    reti
         
    ustawione:
    cbi PORTA, PA0 //led off
    rjmp powrot
         
    wyzerowane:
    sbi PORTA, PA0 //led on
    rjmp powrot


    Czyli ten program będzie mi włączał diodę po kliknięciu przycisku, a przy drugim kliknięciu wyłączał, tak?


    Potrzebuje jeszcze programu, który będzie migał diodą co 500ms (a dokładnie wyłączał ją co 500ms i włączał po 500ms). Czytam ten kurs część 5, trochę rozumiem ale jeszcze nie do końca wszystko. Nie wiem jak ten timer0 ustawić...



    Góra
     Zobacz profil  
     
    PostNapisane: 12 sty 2017, o 12:06 
    Offline
    Moderator zasłużony dla forum.atnel.pl
    Avatar użytkownika

    Dołączył(a): 18 lip 2012
    Posty: 3228
    Lokalizacja: Kraków - obok FAB5 ATMEL'a
    Pomógł: 91

    topic7402.html

    _________________
    http://www.jaglarz.info



    Góra
     Zobacz profil  
     
    PostNapisane: 12 sty 2017, o 15:00 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 30 cze 2016
    Posty: 247
    Lokalizacja: Rybnik
    Pomógł: 13

    Tak, ale wektory przerwań muszą być całe. Zamiast
    Składnia: [ Pobierz ] [ Ukryj ]
    język asm
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
    powinno być
    Składnia: [ Pobierz ] [ Ukryj ]
    język asm
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
    Jest to potrzebne, bo jakby wystąpiło jakieś inne przerwanie, to skoczyło by do któregoś polecenia inicjalizacyjnego, czyli konfiguracja rejestrów, przerwania on itp

    Potem editnę posta i napiszę migającą rybę.

    ------------------------ [ Dodano po: 6 minutach ]

    Zeby dobrze skonfigurować rejestry, podaj proszę prędkość taktowania, bo bez niego to jak człowiek bez mózgu.


    Autor postu otrzymał pochwałę

    _________________
    Situs != Situs



    Góra
     Zobacz profil  
     
    PostNapisane: 12 sty 2017, o 17:02 
    Offline
    Nowy

    Dołączył(a): 09 sty 2017
    Posty: 17
    Pomógł: 0

    Kazał nam robić z taktowaniem 1MHz.

    Na laborkach robiliśmy tylko dla przerwania INT0 czyli .org 0x0002, więc reszty nie potrzebuję :)

    Gdybyś mógł napisać jeszcze tylko z tymi timerami i w komentarzach wytłumaczyć co się dzieje po kolei :)



    Góra
     Zobacz profil  
     
    PostNapisane: 12 sty 2017, o 18:41 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 30 cze 2016
    Posty: 247
    Lokalizacja: Rybnik
    Pomógł: 13

    Timer 16 bitowy czy 8 bitowy wykorzystać? Bo inaczej dla jednego program wyglądać będzie a inaczej dla drugiego. A do tego pin, do któego jest led zapięty.

    ------------------------ [ Dodano po: 3 minutach ]

    Jeśliby użyć 16 bitowego "sprzętowego migania" to będzie na PD4 lub PD5.

    _________________
    Situs != Situs



    Góra
     Zobacz profil  
     
    PostNapisane: 12 sty 2017, o 19:14 
    Offline
    Nowy

    Dołączył(a): 09 sty 2017
    Posty: 17
    Pomógł: 0

    Może być PINA0. Podłączenie jest obojętne oby było poprawne :)
    Mieliśmy użyj timera 8-bitowego.



    Góra
     Zobacz profil  
     
    PostNapisane: 12 sty 2017, o 21:12 
    Offline
    Uzytkownik zasłużony dla forum.atnel.pl
    Avatar użytkownika

    Dołączył(a): 16 lip 2012
    Posty: 2088
    Lokalizacja: Leżajsk / Kraków
    Pomógł: 411

    Żeby było dokładnie najlepiej użyć trybu porównania. Częstotliwości przerwań 2 Hz (co 500 ms) nie da się uzyskać dlatego sterowanie timerem wyjścia odpada. 1000 000 Hz / 1024 / 256 = 3,81 Hz :oops:
    Ustawienie timera 0 na 100 Hz w trybie CTC. Trzeba zliczać przerwania i jak będzie 50 to wtedy zmienić stan I/O.
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język asm
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Autor postu otrzymał pochwałę

    _________________
    Dragonus Cracovus: Biomagia



    Góra
     Zobacz profil  
     
    PostNapisane: 12 sty 2017, o 21:25 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 30 cze 2016
    Posty: 247
    Lokalizacja: Rybnik
    Pomógł: 13

    No właśnie żem jakoś tak pomyślał i opiernicz od własnych myśli dostałem. Oki mam kod i schemat
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język asm
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Schemacik:
    Obrazek


    Autor postu otrzymał pochwałę

    _________________
    Situs != Situs



    Góra
     Zobacz profil  
     
    PostNapisane: 13 sty 2017, o 08:12 
    Offline
    Nowy

    Dołączył(a): 09 sty 2017
    Posty: 17
    Pomógł: 0

    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język asm
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



    To mam jeszcze kilka pytań do kodu :p
    1. Czemu wybrałeś akurat TCNTO/CS00/CS02?
    2. Czy pętla wait_250ms mogłaby być pętlą 500ms, czy to po prostu niemożliwe sprzętowo?
    3. Jak wyliczyłeś te wartości timera?
    4. Czemu używasz rcall a nie rjmp/jmp?
    5. Czemu na końcu jest ret, a nie reti? Reti używamy tylko z przerwaniami?
    6. Czy komendy .nolist/.list/.cseg są konieczne do poprawnego funkcjonowania programu?


    .edit
    Kolega sprawdził mi ten program na atmedze32a i mówi, że nie działa... Dioda się zapala i świeci cały czas :/



    Góra
     Zobacz profil  
     
    PostNapisane: 13 sty 2017, o 10:36 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 30 cze 2016
    Posty: 247
    Lokalizacja: Rybnik
    Pomógł: 13

    1. Zgodnie z datasheetem ustawione bity cs00 i cs02 ustawiają preskaler na 1024.
    2. Nie, bo 1 mhz / 1024 / 243 to około 4 hz.
    3. Mkavrcalculator.
    4. Rcall służy do wykonywania procedur zakończonych ret, a rjmp do skoków.
    5. Ret do procedur reti do przerwań.
    6. Tak.

    _________________
    Situs != Situs



    Góra
     Zobacz profil  
     
    PostNapisane: 13 sty 2017, o 13:02 
    Offline
    Nowy

    Dołączył(a): 09 sty 2017
    Posty: 17
    Pomógł: 0

    A czemu ten program nie działa? :p

    Tzn dioda się zapala i nie miga, tylko świeci



    Góra
     Zobacz profil  
     
    PostNapisane: 13 sty 2017, o 16:24 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 30 cze 2016
    Posty: 247
    Lokalizacja: Rybnik
    Pomógł: 13

    Oki, wiem o co kaman. Zapomniałem ustawić wskaźnik stosu na koniec ramu. Poprawione dwa programy:
    Program z przyciskiem
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język asm
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
    Program z diodą i timerem
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język asm
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
    Przepraszam za wprowadzenie w błąd, drugi program testowałem i działa po poprawie.


    Autor postu otrzymał pochwałę

    _________________
    Situs != Situs



    Góra
     Zobacz profil  
     
    PostNapisane: 13 sty 2017, o 17:24 
    Offline
    Nowy

    Dołączył(a): 09 sty 2017
    Posty: 17
    Pomógł: 0

    Dzięki wielkie za pomoc :)

    Mam nadzieję, że wszystko będzie śmigać.



    Góra
     Zobacz profil  
     
    PostNapisane: 15 sty 2017, o 23:09 
    Offline
    Nowy

    Dołączył(a): 09 sty 2017
    Posty: 17
    Pomógł: 0

    Niestety okazało się, że ten program z timerem miał być obsługiwany przez przerwanie timera...

    Situs, czy dałoby radę to zmienić tak by timer wykonywał się za pomocą przerwania od timera?



    Góra
     Zobacz profil  
     
    PostNapisane: 16 sty 2017, o 11:35 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 30 cze 2016
    Posty: 247
    Lokalizacja: Rybnik
    Pomógł: 13

    Tak, tak, zmienię, jak się wyrobię.

    _________________
    Situs != Situs



    Góra
     Zobacz profil  
     
    PostNapisane: 16 sty 2017, o 12:52 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 30 cze 2016
    Posty: 247
    Lokalizacja: Rybnik
    Pomógł: 13

    Oki, mam, schemat taki jaki był
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    _________________
    Situs != Situs



    Ostatnio edytowano 17 sty 2017, o 21:22 przez Situs, łącznie edytowano 1 raz

    Góra
     Zobacz profil  
     
    PostNapisane: 17 sty 2017, o 18:04 
    Offline
    Nowy

    Dołączył(a): 09 sty 2017
    Posty: 17
    Pomógł: 0

    Przy linii "ut r16, OCR0" i "out r16, TIMSK" wyświetla mi błąd...

    error: Invalid numer



    Góra
     Zobacz profil  
     
    PostNapisane: 17 sty 2017, o 21:22 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 30 cze 2016
    Posty: 247
    Lokalizacja: Rybnik
    Pomógł: 13

    Pomyliłem argumenty miejscami, poprawione.

    _________________
    Situs != Situs



    Góra
     Zobacz profil  
     
    PostNapisane: 17 sty 2017, o 22:55 
    Offline
    Nowy

    Dołączył(a): 09 sty 2017
    Posty: 17
    Pomógł: 0

    Ogromne dzięki! Wszystko śmiga :)



    Góra
     Zobacz profil  
     
    PostNapisane: 20 sty 2017, o 08:46 
    Offline
    Nowy

    Dołączył(a): 09 sty 2017
    Posty: 17
    Pomógł: 0

    Na kolejne laborki potrzebuje program, który po naciśnięciu klawisza (np. wiersz-1, kolumna-3) wyświetla za pomocą diod jego położenie, czyli pierwsze 4 diody to kolumny, a kolejne 4 to wiersze. Program ma działać za pomocą przerwań.



    Góra
     Zobacz profil  
     
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Ten wątek jest zablokowany. Nie możesz w nim pisać ani edytować postów.  [ Posty: 33 ]  Przejdź na stronę 1, 2  Następna strona

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


    Nie możesz rozpoczynać nowych wątków
    Nie możesz odpowiadać w wątkach
    Nie możesz edytować swoich postów
    Nie możesz usuwać swoich postów
    Nie możesz dodawać załączników

    Szukaj:
    Skocz do:  
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO