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



Teraz jest 31 mar 2026, o 13:59


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
Autor Wiadomość
PostNapisane: 30 sie 2014, o 22:13 
Offline
Nowy

Dołączył(a): 19 mar 2014
Posty: 18
Pomógł: 0

Witam, problem polega na złym odmierzaniu przerwań. Wg ustawień liczba (nazwana jako "setne") powinna zmieniać się w ciągu 0.01 sekundy. Jednak sama zmiana na wyższą o 1 liczbę dokonuje się po ok.17 sekundach. Myślałem, że coś źle policzyłem przy ustawianiu częstotliwości przerwań ale nawet po zmianie prescalera i OCR na inne wartości, "setne" zmienia się tak samo. Co zrobiłem źle?
Posiadam atmege8 ustawioną na 1MHz.

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


Jeszcze mam pytanie - dlaczego potrzebna jest pętla po zezwoleniu na przerwania ( sei(); )?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 sie 2014, o 22:17 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2011
Posty: 401
Lokalizacja: Siedlce
Pomógł: 7

sei(); to Główny włącznik przerwań.
Zmienna "setne" powinna być volatile.
Nigdy nie rób wyświetlania w przerwaniu, że o inicjalizacji wyświetlacza za każdym razem nie wspomnę!

To powinno wyglądać tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Autor postu otrzymał pochwałę

_________________
Czekamy na RedBook'a!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 sie 2014, o 22:32 
Offline
Nowy

Dołączył(a): 19 mar 2014
Posty: 18
Pomógł: 0

Już nic mi nie wyświetla na ekranie :(

Co do sei(), to wiem po co to jest i co to jest, tylko nie wiem dlaczego dalej potrzebna jest pętla.
Edit:
Już wyświetla, zabrakło LCD_DISPLAY, ale cały czas wolno się nalicza.

Edit2:
Zmieniłem uC na inny. Co prawda atmega8L, ale ta sama nota katalogowa i problem cały czas taki sam.
Na 1 szybko się zmienia - zaraz po włączeniu, ale na kolejne liczby trzeba czekać niecałe 17 sekund.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 sie 2014, o 22:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

Witam
matek45 napisał(a):
Już nic mi nie wyświetla na ekranie.....

Może pokaż kod po którym nic Ci się nie wyświetla bo pisząc w ten sposób, można z powodzeniem odpisać że może masz wyłączony zasilacz.
Nie piszę tego złośliwie, ale najpierw strzępek kodu potem tylko opisówka....
Tutaj każdy stara się ratować tonącego, ale za coś trzeba złapać ;)

Pozdr.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 sie 2014, o 22:57 
Offline
Nowy

Dołączył(a): 19 mar 2014
Posty: 18
Pomógł: 0

Kod, po którym nic mi się nie wyświetla wstawił @szopler. Dodałem w 13 linijce tego kodu: LCD_DISPLAY(LCDDISPLAY); i zaczęło "gadać".
Jednak cały czas zmienna wzrasta mi po ok.17 sekundach :(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 sie 2014, o 00:08 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 maja 2013
Posty: 288
Ostrzeżenia: -2
Pomógł: 23

szopler napisał(a):
Kod, po którym nic mi się nie wyświetla wstawił @szopler. Dodałem w 13 linijce tego kodu: LCD_DISPLAY(LCDDISPLAY); i zaczęło "gadać".
Jednak cały czas zmienna wzrasta mi po ok.17 sekundach


Przede wszystkim to kolega szopler dobrze Ci podpowiada.

Po pierwsze przerwanie powinno zajmować jak najkrócej - czyli szybkie instrukcje wewnątrz przerwania.
A co za tym idzie po co wrzuciłeś do przerwanie inicjalizacje wyświetlacza i wyświetlanie na ekranie?
Oglądałeś poradniki o przerwaniach? link: https://www.youtube.com/watch?v=J82_Zop9cjE

Wyświetlacz inicjalizuje się tylko raz.

A wywołanie funkcji do wyświetlania wywołuj w peli głównej programu.
A i kod mógł nie działać od kolegi szoplera bo TY masz pisane funkcje z dużych liter a on zapiasał lcd_init, lcd_int z małych.
Ważne w nazewnictwie jest trzymanie się wielkości liter.

Przede wszystkim powiedz czego używasz do wyświetlania na LCD? na jakim sprzęcie działasz?
Pokaż cały kod i zawsze jak zadajesz pytanie to opisz wszystko dokładnie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 sie 2014, o 00:56 
Offline
Nowy

Dołączył(a): 19 mar 2014
Posty: 18
Pomógł: 0

Kod programu (po poprawkach użytkownika szopler):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.




Plik .h dla wyświetlacza hd44780:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Plik .c dla wyświetlacza:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



uC to atmega8, wyświetlacz hd44780 lcd 2x16 - niebieski, program: eclipse z avrdude i mkAVRcalculator.

Jeśli mam coś więcej powiedzieć to piszcie, bo nie wiem co jeszcze mógłbym dodać.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 sie 2014, o 08:46 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

1. Sprawdź sobie lepiej gdzie jest bit WGM12
2. sprawdź jak obliczyłeś przerwanie dla 1MHz w CTC

3. zajrzyj w tym celu do przykładu do Bluebooka np przy multipleksowaniu wyświetlaczy LED jak obliczać czas przerwania


Autor postu otrzymał pochwałę

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 sie 2014, o 09:20 
Offline
Nowy

Dołączył(a): 19 mar 2014
Posty: 18
Pomógł: 0

1. Dla TCCR1A jest tylko WGM11 i WGM10, TCCR1B posiada WGM12. Nie zauważyłem tego :/
2. Co do ręcznego podziału to w ostatnim poście jest 1 dlatego, że próbowałem dla innych wartości kombinować i zapomniałem ustawić na 39, ale nie miało to znaczenia.
Bardzo dziękuję za pomoc.
Co do obliczeń przerwań to polecam stronę: http://eleccelerator.com/avr-timer-calculator/

Pozdrawiam!



Ostatnio edytowano 31 sie 2014, o 09:25 przez matek45, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 sie 2014, o 09:24 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

matek45 napisał(a):
Co do obliczeń przerwań to polecam stronę: http://eleccelerator.com/avr-timer-calculator/


Cudze panie chwalicie a swego nie znacie - masz to samo w MkAvrCalculator jak nie lepiej

http://atnel.pl/mkavrcalculator.html

a co więcej - bez żadnej takiej strony - łatwo i z głowy można obliczać tylko trzeba poznać prosty sposób - wystarczy zajrzeć do Bluebooka:

http://atnel.pl/mikrokontrolery-avr-jezyk-c.html

;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 sie 2014, o 09:28 
Offline
Nowy

Dołączył(a): 19 mar 2014
Posty: 18
Pomógł: 0

O kurcze. Mam bluebooka i widziałem jak to się liczy, ale za każdym razem klepanie w kalkulator męczy. Co do programu mkAVRCalculator to nie wiedziałem.
ŻAŁUJĘ ZA GRZECHY! PRZEPRASZAM!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 13 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