Bo zmieniłeś bibliotekę na liquidcrystal a to biblioteka typowo dla arudino, dlatego też musisz przerobić kod pod tą bibliotekę lub poszukać tamtej biblioteki. Każdy pisząc bibliotekę robi to po swojemu, nazwy funkcji się różnią mimo że robią to samo.
Dobra zmieniłem z powrotem z liquidcrystal na "<LCD_16x2_H_file.h> ale znowu jest taki sam błąd jak na obrazku z pierwszego mojego postu. Biblioteki mam ale do liquidcrystal ale podejrzewam że są to do arduino a za nic w świecie nie mogę nigdzie znaleźć biblioteki do LCD 16x2. Jeśli chodzi o zmianę kodu to nie za bardzo umiem to zrobić.
Program ten został napisany w taki sposób, że nie korzysta z Arduino Core. Można go skompilować np. w Microchip Studio (dawniej Atmel Studio). W programie nie ma obsługi funkcji setup() ani loop(), co jest "standardem" dla programów arduinowych. Można ten kod oczywiście "przerobić" - wtedy trzeba dograć pliki, o których wspomniałem w poprzednim poście do swojego projektu.
Tak na prawdę tu nie ma czego przerabiać na arduino, kod jest banalny a w arduino będzie wyglądać jeszcze prościej. Jeśli posiadasz płytkę arduino, wyświetlacz 16x2 i tu też nie ma znaczenia jaki interfejs bo wystaczy dostosować kod a są gotowe biblioteki dla i2c oraz standardowego podłączenia do pinów procesora. ADC ogarniesz funkcją AnalogRead(); i już kod staje się prostszy, wyświetlacz ogarniasz biblioteką liquidcrystal. Na początek zrób sobie tak byś ogarniał sam wyświetlacz, są tutoriale więc nie ma sensu o tym pisać. Oczywiście odpowiemy na pytania a potem pobaw się AnalogRead i zrozumiesz że to co robisz jest bajecznie proste. Gdy poznasz jak to działa i będziesz miał kontrolę nad tym wszystkim to taki termometr możesz rozbudować według uznania.
W Arduino też możesz skompilować i będzie normalnie działać, ale w tym samym katalogu mają być biblioteki LCD_16x2_H_file.h i to samo.c I trzeba je dodać jako extern C, bo napisane są w C, a Arduino w C++.
Plik jest zrobiony dla uC pracującego z zegarem 8MHz i konkretnie dla Atmega16 lub Atmega32, musisz wybrać taką płytkę z takim zegarem i do takiej płytki wgrać. Są takie płytki w core MightyCore, czyli nie jest to standardowa zawartość Arduino, to bardzo customowe dodatki.
Jak masz zwykłą płytkę Arduino i jesteś zielony w temacie to lepiej zrobić to na standardowych przykładach Arduino z bibliotekami napisanymi w C++ dla Arduino.
ale w tym samym katalogu mają być biblioteki LCD_16x2_H_file.h i to samo.c I trzeba je dodać jako extern C, bo napisane są w C, a Arduino w C++.
Plik jest zrobiony dla uC pracującego z zegarem 8MHz i konkretnie dla Atmega16 lub Atmega32, musisz wybrać taką płytkę z takim zegarem i do takiej płytki wgrać
Zrobiłem tak jak napisałeś, potem wybrałem płytkę atmega16 i zegar 8Mhz external i tym razem wywala mi błąd kompilacji dla płytki atmega16 sprawdzałem również dla zegara 8mhz internal i jest to samo więc co może być nie tak?
Dodano po 23 [minuty]:
Ok. Już wszystko działa i już wszystko rozumiem po prostu jeszcze zapomniałem dodać tych dwóch plików tzn. LCD_16x2_H_file.h i LCD_16x2_C_file do katalogu tam gdzie mam zapisany ten kod.
Dziękuje bardzo za pomoc
No i super, tak poza tym to trzeba pamiętać o wgraniu bootloadera, nawet jeśli się korzysta z opcji "bez bootloadera", to ustawia odpowiednie opcje fuse bite, by uC działał zgodnie z wybranymi opcjami w Arduino, np. kwarc może być zewnętrzny 8Mhz (to już sam pilnujesz co podłączasz), albo wewnętrzny oscylator (ten może być ustawiony w szerokim zakresie, fabrycznie jest 1MHz, no i fabrycznie to on ma w nosie czy podłączasz zewnętrzny, i tak działa na 1MHz z wewnętrznym).
Jak się ustawiło fuse bity prawidłowo z palca i Avrdude to też dobrze i wgrywać już nie trzeba.
Witam ponownie.
Dzisiaj chciałem wreszcie wgrać ten kod z arduino ale utworzył się nowy problem Wszystko ładnie się kompiluje ale gdy chcę wgrać kod na atmege16 to znowu wywala mi jakiś błąd:
A tu mam tak wszystko ustawione:
używam takiego programatora: https://sklep.avt.pl/media/products/bb099515f...es/thumbnail/large_AVTPROG4.jpg?lm=1637073810 Sterowniki do programatora zainstalowane mam. Sprawdzałem również przejścia miernikiem pomiędzy programatorem a mikrokontrolerem i wszystko jest ok. Sprawdzałem też łączność pomiędzy programatorem a komputerem i też jest wszystko ok. oraz na paru kablach i wejściach usb komputera i nadal wywala mi ten błąd. Czy ktoś wie co może być nie tak??
Częściowo masz odpowiedź w poście uprzedzającym to pytanie.
Fabryczny uC Atmega jest ustawiony na 1Mhz, zobacz czy masz opcję programatora "slow", i zacznij o wgrania bootloadera, jak się nie uda trzeba to zrobić poza środowiskiem Arduino.
A jak się uda to znowu trzeba pamiętać by wybrać ten programator bez opcji "slow".
Po prostu inaczej się wgrywa do uC który jest <4Mhz, a inaczej powyżej=>4Mhz, no i programator musi obsługiwać zmianę prędkości, do chińskiej podróby USBASP od razu bym radził wgrać nowy firmware, ale jak masz z AVT, to jest szansa na prawidłowe działanie.
Mam opcję low w programatorze i na taką przełączyłem ale i tak bootloadera nie udało mi się wgrać, pisało "błąd przy wgrywaniu bootloadera ustawiłem też w arduino tą opcję: usbasp slow i niestety nic tego...
Sprawdź programator z inną płytką, by mieć pewność, że on działa OK w ogóle.
Może na programatorze jest zworka do przełączenia prędkości NORMAL/SLOW, w starych USBASP tak było, nowy firmware rozwiązywał ten problem. Drugim powodem może być wersja AVRDUDE, spróbuj przestawić bit CKdiv8, który obniża częstotliwość 8x programem AVR LAB++, jest o pobrania tu na forum. Trzecia opcja to podmiana sterowników, ściągnij program Zadig, podmień sterowniki USBASP, nie powiem które będą działać lepiej u Ciebie, ale z trzech jedne działały OK w Arduino, drugie w programie MKalkulator, a trzecie w obu. Z AVR LAB++ działały wszystkie OK, on ma swoją wersję AVR DUDE.
https://www.elektroda.pl/rtvforum/topic3438601.html
Jak masz stalowe nerwy i układ z którym programator współpracuje, ale ma ustawiony zegar >4MHz np. z zewnętrznego kwarcu, albo z wewnętrznego oscylatora, to możesz mu przestawić zegar na wewnętrzny 1MHz by się przekonać, czy dalej będzie działał. Jeśli przestanie to zmień sterowniki albo kup sobie inny programator. Jak będzie działał OK to masz problem z połączeniem do Atmega16, nie zasilasz jej prawidłowo, albo uC jest uszkodzony.
Edit: działał w sensie dalej się programował i zmieniał ustawienia z programatora.
Mam opcję low w programatorze i na taką przełączyłem ale i tak bootloadera nie udało mi się wgrać, pisało "błąd przy wgrywaniu bootloadera ustawiłem też w arduino tą opcję: usbasp slow i niestety nic tego...
(Czy) możesz uzasadnić po co ci w ogóle potrzebny bootloader??!
W twoim przypadku, jeżeli programujesz przez USBasp to bootloader jest absolutnie zbyteczny, a nawet przy błędnie wskazanych parametrach może w skrajnym przypadku doprowadzić do zablokowania processora.
Koncentruj sie na uzyskaniu pełnej kommunikacji z processorem, nie ważne w jakim środowisku pracujesz.
Z wcześniejszych postów wynika że używałeś ten programmer w BASCOM.
Jeżeli potrafisz go odczytać w tym środowisku, to tam również możesz wpisać kompilcję programu sporządzoną w Arduino.
Tam programuje dobrze, bo połączenie programatora z płytką jest typu ‘idiot-proof’, czyli nie ma nawet możliwości błędnego podłączenia. Wtyczka i gniazdo z zamkiem lokującym orientację połączenia.
W tym konkretnym układzie prawdopodobnie(?) programujesz procesor na innej płytce (b-b) i połączenie programatora z procesorem jest prowizoryczne, które nie gwarantuje poprawności pinów ani też pewności styków.
Należałoby dokładnie zweryfikować i określić funkcjonalność tych tylko 6-pinów: wymaganych do podłączenia linii programujących w tej metodzie (SPI) MISO,MOSI,SCK, RST, oraz zasilanie VCC i GND.
Przy identyfikacji pinów należy zwrócić uwagę czy z rysunku (pinout) ‘czytasz’ gniazdo czy wtyczkę.
elektronik.b wrote:
Na programatorze mam przełącznik low/fast na obu opcjach sprawdzałem i jest to samo.
A w tym programie AVR LAB++ nie może mi odczytać procesora:
AVR LAB pozwala na komunikację USBasp z processorem taktowanym f= 1 MHz…./;
Co sumarycznie wskazywałoby na błędy w podłączeniu.
Tutaj też możesz wpisać (upload) gotową kompilację tworzoną w Arduino IDE
Wystarczy wyexportować kompilację finalnej wersji programu, którą odnajdziesz w tymsamym folderze co znajduje się plik programu : '*.ino'.
Będzie to plik z adnotacją standard ; w formacie HEX.
@emarcus, wgranie bootloadera ustawia również fuse bity, a jeśli się wybierze opcję "no bootloader", to robi w szczególności tylko ustawienie fuse bitów, to najprostszy sposób ich ustawienia bez konieczności analizowania, który bit jest do czego i jaką wartość wpisać w komplecie, po prostu wybiera się opcje z menu Arduino:
klika "burn bootloader".
Każde dotknięcie uC stanowi ryzyko i może go uszkodzić, nawet odczyt, jest to ryzyko bliskie ZERU ale zawsze od ZERA większe, wgranie bootloadera nie stanowi w tym zakresie żadnego istotnego ryzyka, tak samo jak programowanie przez UART.
Jak tego nie wgra to jeszcze za chwilę będziesz tłumaczył dlaczego niektóre piny nie działają w Atmega16/32/64.
No i płytki AVT nie mają gniazd ograniczających zmianę orientacji, trzeba to jednak robić z uwagą.
Chyba znalazłem rozwiązanie problemu ale nie do końca bo tak:
programator i atmegę mam na pewno sprawną ponieważ poprzednimi razy łączyłem programator i procesor przewodami do płytek stykowych i umieszczałem go na właśnie płytce stykowej i wgrywałem różne plik hex takim programem extreme burner avr i nie szło a teraz kupiłem sobie taką oto płytkę do wpinania różnych procesorów
https://botland.com.pl/programatory/1357-pods...MI-auwzrfQ-gIVgdOyCh2AcQDREAQYASABEgJBpfD_BwE i teraz pliki hex (każde inne) wchodzą do różnych uC.
I teraz ten program avr lab++ wykrywa mi atmege16 i różne inne.
Dodano po 10 [minuty]:
Ale w arduino wywala mi ten sam błąd cały czas.
Przestawiłem w arduino na internal 8mhz i pisze: błąd przy wgrywaniu szkicu.
No to mam wgrywać ten bootloarder czy nie skoro może doprowadzić do zablokowania procka?
Dodano po 4 [minuty]:
emarcus wrote:
Jeżeli potrafisz go odczytać w tym środowisku, to tam również możesz wpisać kompilcję programu sporządzoną w Arduino.
Czyli mogę normalnie przekopiować ten szkic z arduino do bascoma?
Dodano po 25 [minuty]:
kaczakat wrote:
ściągnij program Zadig, podmień sterowniki USBASP
Sterowniki są na pewno ok. bo am ten program od dawna i sprawdzałem na wszystkich trzech rodzajach sterowników.
Dodano po 1 [minuty]:
kaczakat wrote:
spróbuj przestawić bit CKdiv8
Nie wiem gdzie to się zmienia.
Dodano po 3 [minuty]:
emarcus wrote:
Wystarczy wyexportować kompilację finalnej wersji programu, którą odnajdziesz w tymsamym folderze co znajduje się plik programu : '*.ino'.
Będzie to plik z adnotacją standard ; w formacie HEX.
Nie można użyć szkicu Arduino w Bascom.
Wgranie bootloadera nie blokuje uC, jak byś wybrał zewnętrzny kwarc 16MHz i wgrał bootloaer do uC, który nie ma połączonego kwarcu 16MHz, to już nic mu nie wgrasz, dopóki nie podłączysz tego kwarcu 16MHz, na tym polega ewentualne zablokowanie.
Przestawienie taktowania w Arduino na "internal 8MHz" nic nie robi w uC, to jest tylko informacja dla programu, że ten szkic będzie używany w urządzeniu taktowanym 8MHz, wszystko co jest związane z czasem, delay, UART, millis, itp. zostanie przeskalowane podczas kompilacji tak by sekunda trwała sekundę po wgraniu do tak ustawionego uC.
Przestawienie sprzętu na 8MHz odbywa się po wybraniu takiej opcji i wypaleniu bootloaera.
Albo możesz to zrobić ręcznie w AVR LAB++. I to jest właśnie ryzyko, bo nie wiesz co do czego jest w tych bitach, w Arduino wszystkie bity są ustawione wraz z wyborem opcji z menu, a ustawienie jest wgrywane do uC przy opcji WYPAL BOOTLOADER.
Tego ustawienia ckdiv8 nie ma w Atmega16 w jednym bicie, trzeba odczytaj Atmegę w AVR LAB++, zrób zrzut ekranu i wstaw tutaj.
Przy fabrycznym ustawieniu powinien być "ptaszek" przy bitach CKSEL 1 2 3, a dla 8MHz powinien być przy 0 1 i 3, więc trzeba kliknąć dwa razy i wybrać "Zapisz do AVR".
No chyba udało mi się zaprogramować tą atmege16 bo znalazłem plik hex do tego kodu z arduino w tym oto folderze (podświetlone na niebiesko:
Załadowałem go do tego programu extreme burner avr i wsad wgrał się bez problemu.
Teraz wystarczy złożyć ten termometr i sprawdzić czy działa.
Także napisze w najbliższym czasie czy działa.
W menu "szkic" masz opcję wyboru by hex'a wygenerował do katalogu projektu.
Jak wystarcza Ci uC działający na ustawieniach fabrycznych, i takie podałeś w menu Arduino, czyli 1MHz, to OK. Jak podałeś, że on będzie działał na 8Mhz, to wszystko w uC będzie działać 8x wolniej niż powinno, a że mam przed sobą magiczną kulę, to widzę, co będzie.
Kurcze miesza mi już się to wszystko.
Ustawiłem to tak w avr lab++ i zapisałem do avr po uprzednim wyeksportowaniu kodu z arduino do pliku hex z opcją external 1mhz.
i termometr nie działa podłączyłem wszystko na płytce stykowej wg. schematu.
Jak teraz robisz odczyt, i masz ptaszki przy 0 1 i 3, czyli udało się przestawić uC na 8MHz, to powinieneś wgrać kod skompilowany dla INTERANAL 8MHz.
A poza tym, jak się udało przestawić na 8MHz to sprawdź, czy działa wgrywanie z Arduino.
Jak działa to wgraj bootloader, on wyłącza specjalne funkcje pinów dla JTAG na porcie C, a jak widzę akurat masz konflikt na schemacie.
Z kolei widok zrzutu z AVR LAB++ sugeruje, że wgrałeś bootloader, bo funkcja JTAG jest wyłączona, a w nowym uC jest włączona, a inne domyślne są nieco inaczej ustawione.
Prawidłowo to ustawienie fuse tak jak robi to Arduino wgrywając bootloader wygląda tak:
Upewnij się, że program prawidłowo pracuje, fabryczna Atmega16 powinna wyglądać tak:
Jeśli przestawiałeś w AVRLAB++ tylko zegar na 8MHz, to powinno wyglądać to tak:
Ja mam USB ASP zainstalowane przez ZADIG jako LibusbK USB Device, w Arduino 1.8.10 działa OK, jak procek jest na 1MHz to trzeba wybrać opcję SLOW, jak jest na 8MHz to normalną.
Poza tym wygrzebałem z pudła kilka chińskich USBASP i one się dziwnie zachowują z najnowszym firmware, tym z roku 2011, odczytuje raz atmegę16 i potem trzeba go odłączyć z portu USB, a AVRLAB++ odczytuje głupoty nawet za tym pierwszym razem. Z Arduino potrafi prawidłowo zapisać fuse bity, po czym się nie umie z nią dogadać by zweryfikować. Z Atmegą 328p działała ten firmware normalnie. Wgrałem starszy firmware z 2009r i teraz jest OK z Atmega16 i tą typowo arduinową 328p.
Może ktoś wpadł na pomysł, by do tego programatora wgrać nowy firmware i na tym polega problem?
Z innej beczki, wybranie w tym core opcji 2MHz lub 4MHz ustawia mi w uC zegar na 1MHz, więc jak widać nikt nie jest doskonały, nawet twórcy tak hiper zestawu.
Kurcze miesza mi już się to wszystko.
Ustawiłem to tak w avr lab++ i zapisałem do avr po uprzednim wyeksportowaniu kodu z arduino do pliku hex z opcją external 1mhz.
i termometr nie działa
Fuse Low byte ustawiony błędnie!
Popraw na E4 i wpisz do AVR; Potrzebujesz ustawić taktowanie na 8 MHz, bo do takiej częstotliwości jest konfigurowana reszta programu (freq. pracy ADC i timingi dla LCD).
Również przed kompilacją wybierz w Arduino taki prametr dla Processora.
EXT Fuse =FF
Jak teraz robisz odczyt, i masz ptaszki przy 0 1 i 3, czyli udało się przestawić uC na 8MHz, to powinieneś wgrać kod skompilowany dla INTERANAL 8MHz.
Tak zrobiłem i nie działa wyświetlają mi się tylko na lcd czarne kwadraciki reguluje też kontrast i nic mi się na wyświetlaczu nie wyświetla a chyba dobrze podłączyłem potencjometr do regulacji kontrastu jedna skrajna nóżka do minusa zasilania a druga skrajna do plusa a środkową nóżkę do trzeciego pinu wyświetlacza.
kaczakat wrote:
A poza tym, jak się udało przestawić na 8MHz to sprawdź, czy działa wgrywanie z Arduino.
Też nie działa wyskakuje mi to: "podczas ładowania szkicu wystąpił błąd"
kaczakat wrote:
Jak działa to wgraj bootloader
Nie mogę wgrać bootloadera bo wyskakuje mi to: "błąd przy wgrywaniu bootloadera" zarówno przy opcji no bootloarder i yes (UART0).
kaczakat wrote:
a jak widzę akurat masz konflikt na schemacie
Myślisz że jest jakiś błąd na schemacie? Bo akurat też zrobiłem płytkę pcb do tego schematu w programie KiCad i też nie działa układ nawet wszystko sprawdzałem kilka razy czy nie zrobiłem jakiegoś błędu w połączeniach.
kaczakat wrote:
Upewnij się, że program prawidłowo pracuje, fabryczna Atmega16 powinna wyglądać tak:
Mam też drugą atmegę16 nieużywaną z fabrycznymi ustawieniami i wszystko pisało tak jak na obrazku.
Dodano po 24 [minuty]:
A tak wogule to w zeszłym tygodniu składałem jeszcze jeden termometr wg. tego schematu wygrzebanego z sieci łącznie z plikiem hex:
i działał tylko że po dołączeniu do atmegi zasilania bo na tym schemacie nie uwzględniono zasilania dla procesora i też dołączenia potencjometru do kontrastu ale zadziałał mi dopiero jak podałem zasilanie trochę wyższe niż 5v dokładnie 7,5v.
Dziś go ponownie złożyłem i patrz akurat jak na złość nie działa.
Procesorów obydwu na pewno nie spaliłem bo odczytuje mi avr lab++ bez problemu i nawet pliki hex się wgrywają też bez problemu wyświetlacze lcd też mam dwa jeden zielony drugi niebieski i też są sprawne bo sprawdzałem je na podstawie szkicu w arduino z tego schematu:
(napisy się wyświetlają)
Układ LM35 też mam sprawny bo go sprawdzałem na podstawie innego szkicu w arduino z tego schematu:
W AVR LAB ustaw sobie dokładnie tak fuse bity jakby zrobił to Arduino wgrywając bootloader dla 8MHz z wewnętrznym oscylatorem. Wartości masz na jednym z obrazków - A4 D5, prze zapisem sprawdź 3x, sprawdzając usiądź na rękach . Konflikt może polegać na tym, że piny są ustawione do obsługi JTAG, więc wszystkie polecenia z programu na te piny są ignorowane i nie wykonywane.
Sprawdź sterowniki USB ASP, ewentualnie ściągnij ZADIG i podmień na takie jak mam ja. Jak Ci nie będzie coś działać to wrócisz w taki sam sposób do tych dzisiejszych.
Ten program jest banalny i jak masz plany działać dłużej z Arduino to sam sobie taki napiszesz, wg dostępnych tutoriali dla ADC i LCD, LCD można podłączyć w trybie 4 bitowym, co zmniejsza liczbę kabli/połączeń na płytce/zmiennych, gdzie może Ci coś nie wyjść. W Arduino to jest wziąć przykład, zrobić analogRead i LCD.print, ewentualnie odczyt z analogRead przeliczyć na właściwe wartości.
Obyś miał bardzo kiepski multimetr, bo podanie napięcia 7.5V na AVR to wysoce prawdopodobny zgon dla Atmegi, teraz to mogą się na niej dziać różne cuda, nawet jeśli nie została całkowicie zniszczona. Zacząłbym od programu, który miga LED po kolei wszystkimi pinami i sprawdził, czy one działają, w szczególności te na porcie C gdzie jest JTAG.