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



Teraz jest 23 cze 2024, o 20:52


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 23 ] 
Autor Wiadomość
PostNapisane: 27 gru 2012, o 10:08 
Offline
Użytkownik

Dołączył(a): 29 paź 2012
Posty: 45
Pomógł: 0

Witam,
Chcąc zaprogramować procka właśnie jako minutnik czyli od jakiejś liczby zlicza do zera i wtedy wystawia stan niski na nóżkę.
Natknąłem się z problemem że nie pokazuje mi niektórych cyfr mianowicie
zaczynamy od 11:11 następnie powinno pojawić się 11:10 lecz pojawia się 11:09(dlatego dodany delay), potem leci ok i znowu gdy po 11:01 powinno się pojawić 11:00 pojawia się 10:59 i tak co 10 sekund. Czas wyświetlany jest na 7 segmentowym wyświetlaczu.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2012, o 10:16 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 233
Lokalizacja: Gdynia
Pomógł: 15

Pierwsza sprawa

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


'>>' to przesunięcie bitowe a ty chcesz sprawdzić warunek czyli zapisz '>'



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2012, o 10:18 
Offline
Użytkownik

Dołączył(a): 29 paź 2012
Posty: 45
Pomógł: 0

dalej żadnej zmiany



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2012, o 10:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 233
Lokalizacja: Gdynia
Pomógł: 15

Zakładam, że pozmieniałeś we wszystkich miejscach. Trochę utrudniasz sobie życie. Wystarczą ci tylko dwie zmienne min i sek. Wyświetlisz je tak
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


A dalej kombinuj :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2012, o 10:36 
Offline
Użytkownik

Dołączył(a): 29 paź 2012
Posty: 45
Pomógł: 0

nie wiem czy dobrze rozumiem ten zapis
za sekundę wpisuje 11
cy1 = sek/10; - wartość cy1 staje się 1,1?
cy2 = sek%10; - wartość cy2 staje się 1
nie rozumiem do końca tego zapisu, i jak zmienić warunki teraz by to dobrze działało?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2012, o 10:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 233
Lokalizacja: Gdynia
Pomógł: 15

flisy2 napisał(a):
nie wiem czy dobrze rozumiem ten zapis
za sekundę wpisuje 11
cy1 = sek/10; - wartość cy1 staje się 1,1?
cy2 = sek%10; - wartość cy2 staje się 1
nie rozumiem do końca tego zapisu, i jak zmienić warunki teraz by to dobrze działało?


Jak podzielisz sek/10 to otrzymasz 1 dlatego, że zdefiniowałeś/zdefiniujesz zmienną sek jako uint8_t czyli wynik musi być liczbą całkowitą bez wartości po przecinku. Natomiast w wyniku sek%10 otrzymasz resztę z dzielenia tej liczby przez 10 czyli w tym wypadku również 1. Nie wiem czy posiadasz książki Mirka ale warto sobie poczytać o operatorach % i /. Jeśli chodzi o warunki to spróbuj się teraz sam zastanowić jak to można zrobić operując tylko na dwóch zmiennych sek i min.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2012, o 11:00 
Offline
Użytkownik

Dołączył(a): 29 paź 2012
Posty: 45
Pomógł: 0

Książkę mam ale nie spotkałem się z tym zapisem do tej pory i dlatego chciałem się dowiedzieć.
I niestety nie mam pomysłu jak to zrobić dlatego zwracam się z prośbą o pomoc.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2012, o 11:19 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 233
Lokalizacja: Gdynia
Pomógł: 15

Bez podstaw będzie Ci ciężko.

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



Ostatnio edytowano 27 gru 2012, o 11:40 przez nixie, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2012, o 11:25 
Offline
Użytkownik

Dołączył(a): 29 paź 2012
Posty: 45
Pomógł: 0

jeszcze prosił bym o wyjaśnienie mi tego warunku bo tez nie jestem pewien:
if(min || sek)
jeżeli min równa zero i sek większa od zera rób
jeżeli min większa od zera i sek równa zero rób
jeżeli minuta większa zero i sek większa od zera rób
a co jeżeli sek była by ujemna?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2012, o 11:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 233
Lokalizacja: Gdynia
Pomógł: 15

flisy2 napisał(a):
jeszcze prosił bym o wyjaśnienie mi tego warunku bo tez nie jestem pewien:
if(min || sek)
jeżeli min równa zero i sek większa od zera rób
jeżeli min większa od zera i sek równa zero rób
jeżeli minuta większa zero i sek większa od zera rób
a co jeżeli sek była by ujemna?


Warunek ten oznacza, że jeśli sek lub min są wartościami większymi od zera, czyli licznik posiada jakąś wartość to wykonuj warunek. Sekunda nigdy nie będzie ujemna bo zdefiniowałeś zmienną sek jako uint8_t czyli zmienną 8 bitową bez znaku, co najwyżej po odjęciu 1 od 0 przekręci się jakby licznik i będziesz miał 255. Sytuacja taka jednak nie nastąpi bo wewnątrz pętli masz warunek który sprawdza czy sek jest równy 0 a jeśli tak to przypisuje jej wartość 59. Jeszcze raz zachęcam Cię do przeczytania tych początkowych rozdziałów z niebieskiej książki. Bez tego nie dasz rady.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2012, o 11:32 
Offline
Użytkownik

Dołączył(a): 29 paź 2012
Posty: 45
Pomógł: 0

i ten program też nie działa
zamiast odejmować sekundy odejmuje dziesiątki sekund i przy zmniejszeniu minuty zmniejsza jednocześnie sekundę
11:11-11:01-11:90...11:10-01:95-01:85...

------------------------ [ Dodano po: 1 minucie ]

chodziło i o warunek jeżeli pojawi się
if (min||sek)
gdzie min = -1 a sek 0 albo 20



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2012, o 11:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 233
Lokalizacja: Gdynia
Pomógł: 15

To pozamieniaj, piszę z palca to nie pamiętam jak były ustawione cyfry

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


Minuty nigdy nie będą ujemne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2012, o 11:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lis 2011
Posty: 534
Lokalizacja: Mierzyn
Pomógł: 9

rozumiem ze to tez zmieniles : minuta >> 0 ?

_________________
pozdrawiam
Jachu



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2012, o 11:49 
Offline
Użytkownik

Dołączył(a): 29 paź 2012
Posty: 45
Pomógł: 0

ad jachu tak
ad nixie ta zmiana pomogła ale dalej jest źle nie pokazuje czasu 11:00,10:00 itd.
odbiegając od założenia że minuta jest dodatnia.
If(min||sek) gdzie min = -1 a sek a) 0 b) 1 czy ten warunek się wykona??



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2012, o 12:00 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 233
Lokalizacja: Gdynia
Pomógł: 15

Tak, rzeczywiście trochę namieszałem bo sek nigdy nie będzie równa 0. Musisz trochę poczekać bo muszę w tej chwili wybyć.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2012, o 12:15 
Offline
Użytkownik

Dołączył(a): 27 gru 2012
Posty: 159
Pomógł: 3

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


spowoduje że (przynajmniej z tego co zapamiętałem z dawnych czasów gdy uczyłem się C++ na PC):
od sekund zostanie odjęta 1 (predekrementacja czy jakoś tak to się nazywa) a dopiero potem zostanie sprawdzony warunek, wobecz czego przy wartości sek==1 przeskoczy z sek==0 na sek==59
poprawnie napisane powinno być (sek-- == 0) ale nie polecam takiego sposobu pisania, lepiej to rozbić na dwie części.
można więc zrobić tak:

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


albo bardziej elegancko za pomocą operatora wyrażenia warunkowego w postaci:
Kod:
zmienna = (a > 5) ? (a * 7) : (a - 3);

ale o tym to sobie sam doczytasz (np na http://4programmers.net lub http://cplusplus.com)
:)

edit:
W sumie to nie było by bardziej eleganckie bo w jednym warunku zmieniasz 2 wartości :)

_________________
sig off ;(



Ostatnio edytowano 27 gru 2012, o 12:31 przez staneq, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2012, o 12:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 233
Lokalizacja: Gdynia
Pomógł: 15

Na szybko, sprawdź.

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2012, o 12:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lis 2011
Posty: 534
Lokalizacja: Mierzyn
Pomógł: 9

zmienna = (a > 5) ? (a * 7) : (a - 3); - no coz moze przejdziemy do czegos co sie nazywa jak zaciemniac kod :)
Nigdy w zyciu nie pisze takich "cud" w softach . Ale to moje zdanie .

_________________
pozdrawiam
Jachu



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2012, o 13:08 
Offline
Użytkownik

Dołączył(a): 27 gru 2012
Posty: 159
Pomógł: 3

jachu napisał(a):
zmienna = (a > 5) ? (a * 7) : (a - 3); - no coz moze przejdziemy do czegos co sie nazywa jak zaciemniac kod :)
Nigdy w zyciu nie pisze takich "cud" w softach . Ale to moje zdanie .



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

Co zajmuje dużo miejsca i też nie jest za bardzo czytelne

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


A teraz załóżmy że takich warunków mamy nie 1 nie dwa a 30 w cały kodzie objętość kodu gwałtownie wzrasta. Też kiedyś myślałem że to zaciemnia cały kod i trudno się w tym połapać ale później doceniłem zalety tego zapisu:
Dam tylko jedną istotną zalete: taki warunek można bez problemu ukryć w postaci makra
Kod:
#define WARUNEK(a) a = (a==0) ? 100:a--;

Oczywiście to nie musi być samo dodawanie lub odejmowanie ale można także ukryć w takiej makrodefinicji np. algorytm Zellera do obliczania dnia tygodnia (http://pl.wikipedia.org/wiki/Kalendarz_ ... -_9999_n.e.)
Ktoś powie że można do tego użyć funkcji typu "inline" ale wtedy zdajemy się na kompilator, który nie zawsze robi to co my chcemy.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2012, o 13:15 
Offline
Użytkownik

Dołączył(a): 29 paź 2012
Posty: 45
Pomógł: 0

teraz działa i jest Ok, dziękuje serdecznie za pomoc ale skoro wzbudziłem już takie zainteresowanie:D to zwrócę się z kolejną prośbą gdzie dać ten timer by zliczał 1s zamiast delay_ms
Timer0 już użyłem to użyć go na timer2? na 20ms i wykonać to 50 razy?
TCCR2 |= (1<<WGM21);
TCCR2 |= (1<<CS22)|(1<<CS21)|(1<CS20);
OCR = 156; (8MHz)
TIMSK |= (1<<OCIE2)
ISR(TIMER2_COMP_vect)
Czy ustawić to na 16 bitowym?? z góry mówię że nie potrafię prosił bym również o korektę powyższego jeżeli jest potrzeba.
W której części programu trzeba umieścić poszczególne ustawienia timera oraz wywołanie przerwania



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2012, o 13:15 
Offline
Moderator
Avatar użytkownika

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

Oczywiście kolega może stosować techniki programowania jakie mu się żywnie spodobają, używać makr itp .... wszystko jest dla ludzi i programistów ;)

staneq napisał(a):
...
Ktoś powie że można do tego użyć funkcji typu "inline" ale wtedy zdajemy się na kompilator, który nie zawsze robi to co my chcemy.


No ale takich rzeczy to na tym forum pisać nie wypada co najmniej ok? ... Bo jeśli kompilator nie zawsze robi to co chcesz - to może użyj innego ? albo nie wiem cały kod napisz za pomocą dyrektyw preprocesora ;)

Zarówno makra stworzone dyrektywami preprocesora jak i funkcje typu inline mają swoje wady i zalety i warto rzeczywiście rozważać jak i co - oraz kiedy użyć. No ale nie ze względu na takie argumenty ...

------------------------ [ Dodano po: 1 minucie ]

flisy2 napisał(a):
W której części programu trzeba umieścić poszczególne ustawienia timera oraz wywołanie przerwania


czy posiadasz tę książkę ?

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: 27 gru 2012, o 13:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lis 2011
Posty: 534
Lokalizacja: Mierzyn
Pomógł: 9

staneq - ale jak Ci wzrasta ilosc kodu ? Wynikowego po skompilowaniu zapewne nie a w programie masz czytelnosc i jasnosc. Chcesz pisac tak jak to podales pisz ja CI nie zabraniam. Napisalem tylko moje zdanie. Mozesz miec oczywiscie inne. Ale nie udowadniaj mi ze to jest czytelniejsze i lepsze bo dla mnie nie jest. No i jeszcze te makra :) Oczywiscie jak Mirek napisal mozesz uzywac jak chcesz i kiedy chcesz makr twoje kody , ja z nich korzystac nie bede :)

_________________
pozdrawiam
Jachu



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2012, o 13:41 
Offline
Użytkownik

Dołączył(a): 27 gru 2012
Posty: 159
Pomógł: 3

Wiadomo że każdy programista ma swoje przyzwyczajenia i opnie :). Ja osobiście miałem do czynienia z grupami programistów która używała takich wyrażeń i sam stwierdziłem że to jest fajna opcja. No a po drugie takie przyzwyczajenie żeby kody pisać jak najbardziej zwięźle. Nie uważam się też za jakiegoś guru programowania bo takim nie jestem. Jeżeli kogoś uraziłem to przepraszam, ale pisanie że to zaciemnia kod to także przesada :twisted:. To nie jest instrukcja "goto" :)
Co do makr to w sumie niedawno odkryłem jaka w nich moc tkwi i może przejdzie mi to za jakiś czas ale jeżeli są makra w C to czemu z nich nie korzystać.

_________________
sig off ;(



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: 23 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 44 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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO