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



Teraz jest 24 lis 2024, o 08:08


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: 1081
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: 1081
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 ]
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: 3206
Lokalizacja: Kraków - obok FAB5 ATMEL'a
Pomógł: 90

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 ]
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 ]
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 ]
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 ]
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 ]
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 ]
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 0 gości


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