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



Teraz jest 16 lis 2024, o 00:39


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 
Autor Wiadomość
PostNapisane: 10 lis 2013, o 02:30 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

Witajcie.
Nie mogę się uporać z problemem napisania programu, który co okreslony czas zliczałby mi Moc.
Napisałem coś takiego
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Program co 1 sekundę powinien zwiększać zmienną Moc o 100W. A tutaj raz, że nie działa to jeszcze nie wiem jak poradzić sobie z tym ustawieniem 1 sekundy. Na pewno będę musiał dobrać kwarc bo widzę, że na tym prescalerze i f procesora niewiele da się ustawić, ale może są jakieś inne pomysły.
Ponieważ to jest tylkoczęść programu dlatego nie skorzystanie z Timera i zastosowanie delaya np na 100ms i odliczanie zmiennej Timer2 od 10 do 0 nie wchodzi w rachubę.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lis 2013, o 08:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 lut 2013
Posty: 376
Lokalizacja: Kłopoty-Stanisławy
Pomógł: 33

iwi napisał(a):
 if (Timer2 = 0){


tu masz zamiast warunku przypisanie wartości do Timer2

powinno być :

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


------------------------ [ Dodano po: 11 minutach ]

A jeśli chodzi o kwarc i Timer2 i za jego pomocą chcesz "bardzo dokładnie" (znacz teoretycznie dokładniej niż 0,16%) to musisz zastosować jakiś kwarc "przyjazny" dla UART np. 11059200 , 14 745 600 , 18 432 000, it. i wtedy z obliczeń wyjdzie Ci "dokładnie" 1 sek.


PS. Cz któryś z kolegów posiadających częstotliwościomierz mógłby zrobić taki mały test kwarców jak Mirek zrobił przy DS3231 ...
Bardzo chętnie sam bym się dowiedział jak bardzo można liczyć na pomiar czasu za pomocą tych urządzeń.

_________________
50 znaków Atnela ....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lis 2013, o 08:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 lip 2013
Posty: 420
Lokalizacja: Kraków
Pomógł: 17

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


Powinno działać :)

Widzę że kolega mnie już wyprzedził

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

i napisałem kod od początku... :D

_________________
GreenBook i BlueBook



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lis 2013, o 17:31 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

Widzialem podobny kod co Mirek napisał. Ale nie bardzo go zrozumialem dlatego zamiast !Timer2 dalem warunek kiedy Timer równy 0. Ale zastanawiam sie po co zmienna Timer1 bo nigdzie nie jest użyta. Teraz widzę że to jest równoważny zapis



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lis 2013, o 19:50 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 lip 2013
Posty: 420
Lokalizacja: Kraków
Pomógł: 17

iwi napisał(a):
Ale zastanawiam sie po co zmienna Timer1 bo nigdzie nie jest użyta.


Zawsze jak piszę sobie program z użyciem Timera to tworze sobie od razu 2 Timery gdybym później w kodzie go potrzebował... Ale spokojnie możesz sobie usunąć z pierwszej lini: Timer1, i na końcu jeszcze jest taki fragment:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


on też jest nie potrzebny jeśli nie używasz Timera1

Cytuj:
Ale nie bardzo go zrozumialem dlatego zamiast !Timer2


To jest bardzo proste :)
w języku C można stworzyć taki warunek:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

w tym przypadku instrukcje wykonają się jeśli zmienna będzie większa od 0

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

instrukcje wykonają się gdy zmienna ma wartość 0

Rozumiesz???? ;)

_________________
GreenBook i BlueBook



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lis 2013, o 23:08 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

Ale jeszcze dla wyjaśnienia Timera. Te zmienne odpowiadają timerowi 1 i 2 z kontrolera czy to są zupełnie inne zmienne i możemy ich tworzyć do woli ale pamiętając że działają z jednakową częstotliwością i prescalerem.
Czyli możemy ustawić Timer1=50 Timer2=100 (jak w naszym przypadku), Timer3 = 1000 itd. i ewentualnie powołać pierwszy timer sprzetowy 16bitowy z tak samo dowolną ilością zmiennych.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lis 2013, o 08:52 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 lut 2013
Posty: 376
Lokalizacja: Kłopoty-Stanisławy
Pomógł: 33

To są zmienne programowe. Nazywają się tylko Timer1 i Timer2. Równie dobrze mogą się nazwać APSIK1 i HAU2 :)
Te nazwy (timer1 i 2 ) łatwiej zapamiętać i łatwiej posługiwać się nimi w kodzie, bo od razu wiadomo czym są.

_________________
50 znaków Atnela ....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lis 2013, o 10:57 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

Witajcie.
Zliczanie działa już ładnie. Ale występują 2 problemy.
Po dołączeniu tego kodu do zliczania Watosekund do całego programu pojawił się problem, że jak tutaj miałem już wyskalowane w sekundach (zostawiłem kwarc 10MHz na razie) to w nowym programie operacje wykonują się co 3sekundy.
ZNalazłem jeden delay_ms ustawiony na 1s i go usunałem i potem jeszcze raz wyskalowałem układ.
Pytanie teraz - jeśli będę dopisywał jakieś linijki kody to od nowa będę musiał skalować układ?

I drugie pytanie - jak przenieść zmienne do nieulotnej pamięci. zeby po resecie nie traciło się wyniku.
takie coś spłodziłem, ale coś nie działa. W RAMie działa prawidłowo, ale w EEPROmie nie bardzo.

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 12 lis 2013, o 13:54 przez iwi, łącznie edytowano 3 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lis 2013, o 13:08 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 paź 2013
Posty: 57
Pomógł: 0

Tak na szybko to co widać w kodzie.
masz:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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



ja zapisuje i odczytuje tak np:

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



Może to nie jest najlepszy sposób.
Ale ja również dopiero się uczę.

_________________
Chomikujemy



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lis 2013, o 13:52 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

Przy przepisywanie popełniłem więcej błędów, ale już źródłowy kod jest poprawiony.
Tam oczywiście miałem uint16_t - kompilator by nie przeszedł.

to może zapis działa prawidłowo tylko odczyt nie do końca.

Odczyt zrobiłem tak.

kWh_stan1 = EEPROM_read(uiAddress);
i potem sprawdzam sobie na RS232 czy wyświetla prawidłowo - i niestety nie.

i potem przez RS232 wyświetlam co jest pod wartością zmiennej kWh_stan1 - i jest 0.

i mam jeszcze pytanie o uiAddress.
Pamięć wEEPROM Atmedze8 jest 512 bajtów. W każdym bajcie jest 8 bitów. Czyli mam razem do zapisania 4096 bitów.
Jeżeli zmienna jest 16 bitowa to zapisana jest w 2 bajtach pamięci.
Jak się odwołujemy do konkretnego bajta w przypadku zmiennych 8 bitowych a jak do 16 bitowych i większych.
Ten przykład z datasheetu określa uiAddress na EEAR - a jaki jeszcze może być?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lis 2013, o 14:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 paź 2013
Posty: 57
Pomógł: 0

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


Zapisujesz coś pod kWh_stan, odzytujesz &kWh_stan

_________________
Chomikujemy



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lis 2013, o 01:10 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

Nie da się - nic nie działa.

Ale są wbudowane funkcje i nie trzeba ich pisać
eeprom_write_byte (lub eeprom_write_float)
eeprom_read_byte (lub eeprom_read_float)

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

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

i to wszystko jest przed pętlą główną i się kompiluje.

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


a komunikat pojawia się taki: error: incompatible type for argument 1 of '__eewr_float_m8'
.... note: expected 'float *' but argument is of type 'float'

próbowałem dać uint8_t ale to nie ma znaczenia - tak czy siak nie działa

a nawet zamieniając funkcje na read_byte zamiast read_float to w ogóle nie kompiluje się ani zapis ani odczyt, a na flot przynajmniej odczyt działa.

Oczywiście nie jest mi potrzebna zmienna float - uint16_t wystarczy bo to jest 65000kWh



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lis 2013, o 10:27 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

Chyba znalazłem błąd - muszę jeszcze potestować
deklaracja zmiennej uiAddress powinna być z gwiazdką

uint16_t * uiAddress = 0x000;
oraz trzeba zmienić w pliku eeprom.h przy tych 2 funkcjach uint8_t na uint16_t

ale pytanie - czym różni się funkcja
eeprom_write_byte
od
eeprom_update_byte



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lis 2013, o 11:14 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 paź 2013
Posty: 57
Pomógł: 0

ja bym to 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.

_________________
Chomikujemy



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lis 2013, o 21:27 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

Niestety nie działa Twój sposób.
Ponieważ to jest w zasadzie osobny temat dlatego pozwoliłem sobie założyć nowy temat, a ten będzie o Timerach.



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

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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO