Hvala.
Trebao je samo 100k umjesto 10k
Hvala.
Trebao je samo 100k umjesto 10k
Vidio sam ovaj sajt na EEV Blogu: http://www.pighixxx.com/test/pinoutspg/
Stavljam link ovdje jer vjerujem da bi mnogima mogao biti od koristi. Radi se o pinoutima u PDF formatu za brojne Arduino i slične pločice, te neke MCU-ove.
Vidio sam ovaj sajt na EEV Blogu: http://www.pighixxx.com/test/pinoutspg/
Stavljam link ovdje jer vjerujem da bi mnogima mogao biti od koristi. Radi se o pinoutima u PDF formatu za brojne Arduino i slične pločice, te neke MCU-ove.
tnx! stranica je odlicna, a ima zgodnih stvari i na ostatku sitea... http://www.pighixxx.com/test/abc/
Vidio sam ovaj sajt na EEV Blogu: http://www.pighixxx.com/test/pinoutspg/
Stavljam link ovdje jer vjerujem da bi mnogima mogao biti od koristi. Radi se o pinoutima u PDF formatu za brojne Arduino i slične pločice, te neke MCU-ove.
tnx! stranica je odlicna, a ima zgodnih stvari i na ostatku sitea... http://www.pighixxx.com/test/abc/
Da, baš tu knjigu je Dave pokazivao u mailbagu. Samo šteta što i to nije dao u PDF formatu.
Vidio sam ovaj sajt na EEV Blogu: http://www.pighixxx.com/test/pinoutspg/
Stavljam link ovdje jer vjerujem da bi mnogima mogao biti od koristi. Radi se o pinoutima u PDF formatu za brojne Arduino i slične pločice, te neke MCU-ove.
Gledao sam na YTu nešto uvezi registrya, i kako palit/gasit pinove direktno bez funkcije, korisna stvar, al opet ne kužim kak ide
Gledao sam na YTu nešto uvezi registrya, i kako palit/gasit pinove direktno bez funkcije, korisna stvar, al opet ne kužim kak ide
mislis port manipulation: https://www.arduino.cc/en/Reference/PortManipulation
samo gledas gdje se pojedini arduino-pin nalazi na cipu, odnosno na kojem portu i onda pomocu DDRx i PORTx naredbi zadajes koji je pin izlazni(1), ulazni(0), odnosno u stanju 1 ili 0.
npr. d13 na uno je zapravo portB, bit 5.
ako zelis isti postavit kao izlazni zadat ces:
DDRB|=B00100000; //OUTPUT
ostali bitovi ce bit NEPROMJENJENI
ako zelis d13 postavit kao ulazni napisat ces:
DDRB&=B11011111; //INPUT ili INPUT_PULLUP ovisno o DDR.
ostali bitovi ce bit NEPROMJENJENI
ako zelis d13 stavit u log.1, onda ces napisat:
PORTB|=B00100000;
ostali bitovi ostaju kako jesu, ako je rijec o ulaznom pinu, ukljucujes pull-up otpornik (INPUT_PULLUP)
slicno za log.0:
PORTB&=B11011111;
ostali bitovi nepromjenjeni, a ako je rijec o ulazu, onda iskljucujes pull-up otpornik (INPUT)
Kako da s jednog Arduina pošaljem byte(broj neće bit veći od 255) na drugi? Preko Seriala?
S tim da bi se ta vrijednost očitavala svake sekunde(na prvom Arduinou), a na drugom bi u loopu stalno slao izračunatu vrijednost.
Malo sam guglao, i spojio TX od prvog Arduina(glavnog) u RX od drugog Arduina, i obratno. Isprogramirao sam(kako sam znao), i ne radi baš najbolje.
A Serial.println iz glavnom koda izbacuje < na računalu.
Arduino pločice koriste serijski port za programiranje čipa i debug ispis. Atmega328p ima samo jedan hardverski serial (USART). Rađe iskoristi Wire library koji komunicira putem I2C sabirnice.
Ili možeš i SPI sabirnicu ali ćeš imati više žica i možda će ti biti teže implemetirati jer protokol zahtjeva slanje i primanje podataka u isto vrijeme.
Ako baš moraš slati podatke putem serijskog postoji i software serial library, ali performansama nije kao hardverski serial i nema buffer pa ti nekad "pojede" podatke.
Zadnja opcija je preko drugog arduina (Arduino as ISP) programirati mikrokontroler tako da ti port ostane slobodan,
a za debug uzmeš software serial i otvoriš terminal na taj port. Jedino što ti treba dodatan USB-TTL modul.
-
Imao sam takav problem sa bluetooth modulom koji ima AT komande preko serijskog porta a software serial je pre klimav da bi pouzdano radio.
Pa sam uzeo zadnju opciju. Bolje da ne prođe debug nego komunikacija sa bluetoothom.
Naravno možeš i nabaviti megu koja ima više serijskih portova ili neki drugi mcu koji ima arduino support.
Btw, zašto moraš imati dva mikrokontrolera, nedostatak pinova, memorije, snage ili nešto drugo?
Zato što na glavnom interrupt koristim za brzinu, a drugi će mi biti za okretaje.
Mogao sam i na prvi stavit, al jednostavno bi smetali interruptovi jedan drugome.
A i osježavanje ekrana uzima i po 40-ak ms. Mislim da ne bi bilo dobro, kad bi kasnile neke stvari.
Riješio sam preko Seriala, samo je na glavnom Arduinou trebalo dodati provjeru Serial.available(), i to je to.
Šta je brže? IIC ili Serial?
Koristim već ekran i RTC preko IICa, znam da neće bit nikakvih problema(jedino nez za adresu).
Zato što na glavnom interrupt koristim za brzinu, a drugi će mi biti za okretaje.
Mogao sam i na prvi stavit, al jednostavno bi smetali interruptovi jedan drugome.
A i osježavanje ekrana uzima i po 40-ak ms. Mislim da ne bi bilo dobro, kad bi kasnile neke stvari.
Riješio sam preko Seriala, samo je na glavnom Arduinou trebalo dodati provjeru Serial.available(), i to je to.
Šta je brže? IIC ili Serial?
Koristim već ekran i RTC preko IICa, znam da neće bit nikakvih problema(jedino nez za adresu).
Nece ti nista smetati interrupti, samo ti potprogram za obradu interrupta mora biti minimalan.
Drugim rjecima, u interrupt potprogramu radis ono sto minimalno moras da bi znao kolko si interrupta primio i njihove osnovne podatke, a dalje radis u glavnom loopu.(obradu tih podataka)
Ako je meni nano izdrzao rezoluciju enkodera 50 na servu na 3000okr/min:
50*4(4 pulsa po ciklusu enkodera)*3000=600 000 interrupta u minuti sto je 10 000 interrupta u sekundi, izdrzat ce i tebi za kotac koji se okrene svega par puta u sekundi(ako i tolko)
Samo treba pametno kodirati bez previse trosenja resursa u prekidnom potprogramu.
Interrupt za okretaje
void revolution()
{
revDuration = millis() - revTick;
revTick = millis();
send = true;
}
Interrupt za brzinu
void wheeleRevolution() // ISR FOR SPEED AND DISTANCE CALCULATION - DO NOT TOUCH! OR, IF YOU NEED, DO NOT USE SERIAL WITHIN ISR FUNCTION.
{
revDuration = millis() - speedTick;
speedTick = millis();
distance++;
distanceB++;
distanceC++;
distanceD++;
avgDistance++;
avgDistance++;
}
send u prvom interruptu onda nije potreban.
Interrupt za okretaje
void revolution()
{
revDuration = millis() - revTick;
revTick = millis();
send = true;
}
Interrupt za brzinu
void wheeleRevolution() // ISR FOR SPEED AND DISTANCE CALCULATION - DO NOT TOUCH! OR, IF YOU NEED, DO NOT USE SERIAL WITHIN ISR FUNCTION.
{
revDuration = millis() - speedTick;
speedTick = millis();
distance++;
distanceB++;
distanceC++;
distanceD++;
avgDistance++;
avgDistance++;
}
send u prvom interruptu onda nije potreban.
I to je ok, ja imam i par if-a, pa sve ok radi, bitno da nemas neke velike petlje.
Al sam sad skužio da ne mogu jer mi je zauzet pin na kojem je drugi interrupt.
Nek bude ovako
Samo me zanima što je bolji Serial, ili IIC?
Ne treba ti dva pina za isti event (prolaz magneta). Dosta je jedan interupt samo moraš bolje napisati kod.
Dva mikrokontrolera za brzinomjer su rasipanje resursa, a i onda imaš potencijalni problem sinkronizacije podataka među njima.
I2C podržava veće brzine.
Ne treba ti dva pina za isti event (prolaz magneta). Dosta je jedan interupt samo moraš bolje napisati kod.
Dva mikrokontrolera za brzinomjer su rasipanje resursa, a i onda imaš potencijalni problem sinkronizacije podataka među njima.
I2C podržava veće brzine.
Jedan interrupt mjeri brzinu kretanja(km/h), a drugi brzinu okretanja (rpm), al ne kotača već pedala.
Za sad ću ostavit ovako. No zanima me kako da znam koji bajt se odnosi na kojeg? Recimo, želim da na drugi Arduino radim kopiju EEPROMa(ne cijelog), već nekih pet-šest stavki(neke stavke su četiri bajtne). Kako da prenesem to, a da ne zamiješam bajtove?
Ne radi ništa hahaha.
Doduše, za backup ne znam, al restore opcija ne radi.
Evo pitanje ovdje, zajedno i s kodom
https://stackoverflow.com/questions/44889162/eeprom-restoring-doesnt-work
Za početak zanemari pisanje u eeprom na drugom čipu. Tek kad si točno prenio podatke onda se fokusiraj na to.
Treba ti neki jednostavan protokol. Napravi char array i pointer na trenutni char u tom arrayu te ga puni kako ti dolaze podaci,
svaki novi char povečava pointer za 1 osim ako nije došao do maksimalne vrijednosti, odnosno veličine arraya.
Kad dobiješ newline ('\n') odluči što s tim podacima, resetiraj pointer, pošalji acknowledge drugom čipu i kreni na druge podatke.
Možeš čak i staviti human readable string, a ne čisti byte da ti je lakše debugirat, poslije samo strtoul-om pretvoriš u brojčanu vrijednost.
Npr pošalješ: "EEW:0:50" (eeprom write, adresa 0, vrijednost: 50), a dobiješ "ACK:OK" ako je sve ok ili "ACK:ERR" ako je došlo do greške.
Možeš čak i imati error kodove pa ti piše da se dogodio ERR2 na primjer. Pošiljaoc nek čeka na ACK i kad ga dobije šalje write za sljedeću adresu.
P.S. I dalje mislim da ti treba samo jedan mcu. Interrupti ti se vjerojatno "kolju" jer koristiš istu variablu za računanje vremena u oba interrupta.
Nikad nisam s pointerima radio, tak da mislim da tek onda ne bi radilo. N e razumijem taj *, šta on točno radi.
Tu čak nisam mislio na klasični pointer nego na jednu variablu koja bi pokazivala na aktivni element u arrayu, npr:
char charBuffer[32]; //Array
char arrayPointer = 0; //"Pointer"
Pa onda spremanje vrijednosti:
charBuffer[arrayPointer] = tempChar; //tempChar je dobiven čitanjem serijskog porta
if (tempChar < 32) tempChar++; //Sljedeći element
-
Pointeri su kao i normalne variable samo za vrijednost sadrže adresu memorije, nešto više o tome.
Tu čak nisam mislio na klasični pointer nego na jednu variablu koja bi pokazivala na aktivni element u arrayu, npr:
char charBuffer[32]; //Array
char arrayPointer = 0; //"Pointer"
Ne da to nije klasični pointer, nego to nije nikakav pointer. Nemoj uvoditi svoje pogrešne termine jer ćeš samo izazvati kaos. To se zove indeks.
Pozdrav, izgleda da je moj DHT11 riknuo a treba mi hitno, da li ima netko viška da bi prodao? Ne mogu čekati da mi stigne s ebay-a...
EDIT: Sad vidim da ima u Chipoteci
Imam problem s programiranjem plocica:
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x67
avrdude: stk500_recv(): programmer is not responding
i tako do 10
Problem se javlja na svim plocicama koje imam(nisam isprobao one koje su u nekim projektima jer mi se neda kopat po tome)
znaci 4xNano(od toga 2 full nove otvorene), 1xUno, 2xMega, 1xProMini(+FTDI)
sve plocice su radile kad sam prosli put isprobao.
Probao sam sve kablove koje imam, na PC i laptopu(s tim da sam na laptopu probao i windows i linux), 2 verzije Arduino IDE-a i nikako rjesiti problem...
Ako ima netko kakvu ideju nek kaze.
EDIT:
USBasp radi
Čudno. Probaj na neku pločicu staviti bootloader pa vidi onda.
Ja sam na 1.8.1 i meni sve dobro radi.
A što se tiče programa, primijetio sam da kad s Arduino pločice (mogu potvrditi za Pro Micro, ne sjećam se za ostale) serial zasipam podacima, da se može dogoditi da je više ne mogu reprogramirati, nego prvo trebam preko USB as ISP staviti Arduino bootloader. Tako da odsad imam praksu da, kad radim na projektiću koji sumanuto radi debugginga šiba podatke preko seriala, ostavim barem 5 sekundi na početku programa prije nego li išta krenem slati na serial.
Čudno. Probaj na neku pločicu staviti bootloader pa vidi onda.
Ja sam na 1.8.1 i meni sve dobro radi.
A što se tiče programa, primijetio sam da kad s Arduino pločice (mogu potvrditi za Pro Micro, ne sjećam se za ostale) serial zasipam podacima, da se može dogoditi da je više ne mogu reprogramirati, nego prvo trebam preko USB as ISP staviti Arduino bootloader. Tako da odsad imam praksu da, kad radim na projektiću koji sumanuto radi debugginga šiba podatke preko seriala, ostavim barem 5 sekundi na početku programa prije nego li išta krenem slati na serial.
1 nano je proradio, 3 nisu, a za ostale plocice nemam vise zivaca, sve cu ih bacit u smece i naruciti nove...
1 nano i 1 uno za prototipove, od svakog jos 2 rezerve i ostalo pro mini.
I jos par STM-ova (koji rade savrseno trenutno)
BTW koji konstruktor koristis u u8glibu za OLED, rezolucija mi je jasna, ali ima 3 verzije IIC
EDIT:
od ova 3
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); // I2C / TWI
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST); // Dev 0, Fast I2C / TWI
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NO_ACK); // Display which does not send ACK
Neeeee! Nemoj bacat!
Napravi si bazu za stavljanje bootloadera - tako da kad dođe do problema, da možeš to lako obaviti. Ako se bootloader ne da staviti, onda pločicu baciš, ako se da - riješio si problem. Evo recimo moja baza za Pro Micro. Ako mi se zbrlja koji Nano, onda ću dodati gore još i headere za Nano. Ovaj Nano koji je gore je već programiran s Arduino as ISP.
EDIT:
od ova 3
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); // I2C / TWI
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST); // Dev 0, Fast I2C / TWI
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NO_ACK); // Display which does not send ACK
Samo jednom sam probao tu biblotektu tako da... A iz opisa bi se moglo zaključiti da ti je najbolje koristiti drugi konstruktor, jer bi tada I2C sabirnica trebala raditi na višoj frekvenciji, a treći konstruktor je samo za one OLED ekrančiće koji ne šalju ACK signal, pa da ih Arduino onda ne čeka za ACK signal (jer takav ekran ne bi radio s prva dva konstruktora). Naravno, ako drugi konstruktor ne radi, onda si prisiljen koristiti prvi.
Neeeee! Nemoj bacat!
Napravi si bazu za stavljanje bootloadera - tako da kad dođe do problema, da možeš to lako obaviti. Ako se bootloader ne da staviti, onda pločicu baciš, ako se da - riješio si problem. Evo recimo moja baza za Pro Micro. Ako mi se zbrlja koji Nano, onda ću dodati gore još i headere za Nano. Ovaj Nano koji je gore je već programiran s Arduino as ISP.
Ja pro micro ne koristim, a za pro mini(a onda bi jos i za taj pro micro stavio headere, 5 min posla) bi si mogao tako nesto sloziti, samo sto ja burnam bootloadere USBasp programerom na kojeg sam si slozio 6 pin nastavak(ICSP) i nano,uno i mega mi nije problem burnati, jedino ove bez headera.
Necu bacati, samo cu ih programirati na ovaj nacin i ubaciti u neke projekte na koje mogu zaboraviti .
EDIT:
Koju biblioteku koristis za OLED?
Izgleda da nije bilo do konstruktora nego je kinez poslao pokvareni ekran, drugi radi.
Stavi si muške headere na pločicu ili štoveć za burnanje bootloadera pa neka gravitacija obavi svoje.
Ja isto tako nekad na Pro Mini izbjegavam zalemiti header, ali zato ima USB2serial programatora koji imaju isti pinout i samo se onda Pro Mini stisne na muške pinove USB2serial programatora. Istu foru možeš iskoristiti za burnanje bootloadera.
Adafruitovu. Adafruitinu? Lady Adainu?
Ni jedno ni drugo nije idealno. Afafruitova troši tonu Arduinovog RAM-a (nije problem kod Mega, mali problem je kod Leonardo/Pro Micro, ozbiljni problem kod Nano/Uno), a u8glib četiri ili koliko već puta prolazi kroz iscrtavanje ekrana da bi uspio iscrtati čitav ekran.
Počeo sam s Adafruitovom, a ipak nisam bio prisiljen prijeći na u8glib, a i u zadnje vrijeme sam nešto više prčkao po stm32 koji ima dovoljno RAM-a, a i počeo sam se malo igrati s većim LCD ekranom.
Ako ni jedna konkstruktor ne radi (ni onaj treći), onda je to to. BTW da možda nije stvar u "jumperu" za odabir adrese? Ako ima otpornik od 0 ohma, mogao bi piknuti lemove ili zamijeniti otpornik žičicom ili jednostavno kratkospojiti lemom.
Adafruitovu. Adafruitinu? Lady Adainu?
Ni jedno ni drugo nije idealno. Afafruitova troši tonu Arduinovog RAM-a (nije problem kod Mega, mali problem je kod Leonardo/Pro Micro, ozbiljni problem kod Nano/Uno), a u8glib četiri ili koliko već puta prolazi kroz iscrtavanje ekrana da bi uspio iscrtati čitav ekran.
To me i najvise muci kod adafruitove, stavim biblioteku i nano vise nema memorije...
A opet koristiti STM32 za nesto malo kompliciranije od timera s prikazom odbrojavanja mi je bezveze.
Ako ni jedna konkstruktor ne radi (ni onaj treći), onda je to to. BTW da možda nije stvar u "jumperu" za odabir adrese? Ako ima otpornik od 0 ohma, mogao bi piknuti lemove ili zamijeniti otpornik žičicom ili jednostavno kratkospojiti lemom.
Sad je vec gotovo, zaljepio sam taj ekrancic vrucim ljepilom prije nego sam ga isprobao(direktno iz kuverte) u kuciste i to bez stednje na ljepilu(a kuciste je jako malo) tako da mi nije ostala druga opcija nego istisnuti ekran van s prednje strane, a samim time ga i razbiti.
Koristim DS3231 modul za datum i vrijeme. Sad me zanima kako da provjerim dali je dani datum ispravan? Tipa da upišem 31.2.2017., kako da provjerim to?
I još me zanima dali funkcija F kod print/println štedi RAM ili ROM?