Witam,
Jestem w trakcie budowy komputera pokładowego na procesorze AtMega8 oraz na wyświetlaczu LCD LS020. Program który tworzę ma zrealizować podstawowe funkcję komputera pokładowego, takie rzeczy jak menu i możliwość nastawienia parametrów odpuszczam a jedynie chcę prawidłowo obsłużyć wejścia i pomiary sygnałów. W trakcie pisania programu natknąłem się na dwa problemy które uniemożliwiają mi dalszy postęp. Obsługa LCD bazuje na przykładowym kodzie Christiana Kranza z dodanymi przeze mnie małymi funkcjami.
Problem 1:
Program mimo iż się poprawnie kompiluje czasami nie chce się wgrać do procesora. Pozornie nie istotna zmiana w kodzie powoduje problemy z wgraniem pliku .hex. Przykładowo czyszczenie tablicy char w pętli powodowała problemy. Wpisanie po kolei pustych wartości już działało poprawnie. Próba wyświetlenie dokładnie tego samego w innym miejscu na wyświetlaczu też czasami powodowała problemy. Przy kompilacji co prawda czasami pojawią się jeden error (make:***[main.o] Error 1) ale gdy go usunę to się nie pojawia od razu. Prosiłbym o zerknięcie na kod co może być nie tak.
Problem 2:
Jednym z głównych zadań komputerka będzie pomiar spalania. W tym celu muszę zmierzyć czas wtrysku czyli stanu niskiego. Realizuję to Timerem 1 w trybie Input Capture. Atmega pracuje na wewnętrznym oscylatorze 8 MHz. Timer 2 ustawiony jest tak aby odliczał czas 1 sekundy. Pomiar czasu wtrysku działa w miarę poprawnie, lecz gdy sumuję czas poszczególnych impulsów w czasie 1 sekundy to wynik potrafi przekroczyć 1000ms. Oba Timery mają ustawiony preskaler na 256. Przerwanie Timera 2 zlicza 122 przepełnienia co faktycznie daje czas bliski sekundy (rozbieżność 2 sekund w czasie 10minut). Obliczenia czasów wyglądają nastepująco:
8000000Hz/256=31250Hz
Dla Timera 2:
31250Hz/256=122,07
Dla Timera 1:
sekundy=wartość_timera/31250
milisekundy=wartość_timera/31,25
Docelowo będzie mniejszy preskaler, ale taki ułatwia sprawdzenie działania. Coś pominąłem w ustawieniu Timera czy problem leży gdzie indziej? Oba timery są taktowane tym samym zegarem, więc dokładność oscylatora nie ma znaczenia.
Plik main:
Plik Lcd.c
Plik Lcd.h
Jestem w trakcie budowy komputera pokładowego na procesorze AtMega8 oraz na wyświetlaczu LCD LS020. Program który tworzę ma zrealizować podstawowe funkcję komputera pokładowego, takie rzeczy jak menu i możliwość nastawienia parametrów odpuszczam a jedynie chcę prawidłowo obsłużyć wejścia i pomiary sygnałów. W trakcie pisania programu natknąłem się na dwa problemy które uniemożliwiają mi dalszy postęp. Obsługa LCD bazuje na przykładowym kodzie Christiana Kranza z dodanymi przeze mnie małymi funkcjami.
Problem 1:
Program mimo iż się poprawnie kompiluje czasami nie chce się wgrać do procesora. Pozornie nie istotna zmiana w kodzie powoduje problemy z wgraniem pliku .hex. Przykładowo czyszczenie tablicy char w pętli powodowała problemy. Wpisanie po kolei pustych wartości już działało poprawnie. Próba wyświetlenie dokładnie tego samego w innym miejscu na wyświetlaczu też czasami powodowała problemy. Przy kompilacji co prawda czasami pojawią się jeden error (make:***[main.o] Error 1) ale gdy go usunę to się nie pojawia od razu. Prosiłbym o zerknięcie na kod co może być nie tak.
Problem 2:
Jednym z głównych zadań komputerka będzie pomiar spalania. W tym celu muszę zmierzyć czas wtrysku czyli stanu niskiego. Realizuję to Timerem 1 w trybie Input Capture. Atmega pracuje na wewnętrznym oscylatorze 8 MHz. Timer 2 ustawiony jest tak aby odliczał czas 1 sekundy. Pomiar czasu wtrysku działa w miarę poprawnie, lecz gdy sumuję czas poszczególnych impulsów w czasie 1 sekundy to wynik potrafi przekroczyć 1000ms. Oba Timery mają ustawiony preskaler na 256. Przerwanie Timera 2 zlicza 122 przepełnienia co faktycznie daje czas bliski sekundy (rozbieżność 2 sekund w czasie 10minut). Obliczenia czasów wyglądają nastepująco:
8000000Hz/256=31250Hz
Dla Timera 2:
31250Hz/256=122,07
Dla Timera 1:
sekundy=wartość_timera/31250
milisekundy=wartość_timera/31,25
Docelowo będzie mniejszy preskaler, ale taki ułatwia sprawdzenie działania. Coś pominąłem w ustawieniu Timera czy problem leży gdzie indziej? Oba timery są taktowane tym samym zegarem, więc dokładność oscylatora nie ma znaczenia.
Plik main:
Kod: C / C++
Plik Lcd.c
Kod: C / C++
Plik Lcd.h
Kod: C / C++
