Stránka 2 z 3
Napsal: 19 srp 2024, 22:37
od Celeron
Já reagoval na ten "signal generatorv3".
V tom dalším, "DDS_function_generator" samozřejmě ROTARY_ A a ROTARY_ B nejsou definovaný. Musíš odkomentovat jeden z těhle dvou:
Kód: Vybrat vše
attachInterrupt(0, updateEncoder, CHANGE);
attachInterrupt(1, updateEncoder, CHANGE);
Ta obsluha přerušení je stále stejná, jen se změnily jména.
Napsal: 20 srp 2024, 09:23
od jankrizan
Priznám sa Ti Celeron, že nerozumiem pojmu -odkomentovat-. Ja tu komentujem všeličo, ale môjmu problemu to nejako nepomáha. Popíš mi to tak nejako " ľudsky ". Ja som ešte tá chasa odchovaná na elektronkach, takže mi prepáč, ale niektorým pojmom nerozumiem.
Inak ten tvoj návod tam je original -od výrobcu-, ten som tam ja nedával.
void setup() {
lcd.init();
lcd.backlight();
startupScreen();
pinMode(led,OUTPUT);
pinMode(clk, INPUT_PULLUP);
pinMode(dt, INPUT_PULLUP);
pinMode(button1, INPUT_PULLUP);
pinMode(sw, INPUT_PULLUP);
pinMode(button2, INPUT_PULLUP);
digitalWrite(clk, HIGH);
digitalWrite(dt, HIGH);
digitalWrite(led,LOW);
attachInterrupt(0, updateEncoder, CHANGE);
attachInterrupt(1, updateEncoder, CHANGE);
gen.Begin();
}
Napsal: 20 srp 2024, 09:41
od Ruprecht
Komentář = poznámky v programu, které se nepřekládají. Zakomentovat znamená napsat před řádek // (nebude se překládat), odkomentovat znamená smazat //, aby se tento řádek stal součástí překládaného programu.
Napsal: 20 srp 2024, 09:54
od jankrizan
Aha, chápem. Ďakujem za vysvetlenie. Zasa som o niečo múdrejší, no čo, človek sa stále učí.
Napsal: 20 srp 2024, 18:35
od Celeron
Ruprecht píše:Zakomentovat znamená napsat před řádek // (nebude se překládat), odkomentovat znamená smazat //, aby se tento řádek stal součástí překládaného programu.
To jsem mu v tom udělal bordel, napsal jsem za a od přesně opačně.
Díky Ruprechte za upozornění. Asi se ze mě věkem taky začíná stávat "opačník".
to jankrizan: Prostě to zkus přeložit takhle:
Kód: Vybrat vše
// attachInterrupt(0, updateEncoder, CHANGE);
attachInterrupt(1, updateEncoder, CHANGE);
nebo takhle:
Kód: Vybrat vše
attachInterrupt(0, updateEncoder, CHANGE);
//attachInterrupt(1, updateEncoder, CHANGE);
Některý n-codery (hlavně ty od Lásky, odzkoušeno osobně na třech různých konstrukcích) jsou asi uvnitř udělaný trochu jinak a musí se použít jen jedno přerušení.
Poslal bych ti kousek code na volbu kmitočtu po jednom Hz pro Si5351 ale asi by ti to nebylo moc platný, je to jiný než ten tvůj generátor.
Napsal: 20 srp 2024, 19:47
od jankrizan
Skusil som to, ale nerobí to dobrotu. chvíľu nefunguje, potom preskočí o dva takty, zas nejde, je to nepravidelné. Bolo by to neunosné vyhodiť z programu tento rotary a vložiť trebars knižnicu Rotary.h. Ja to absolutne neviem, preto sa pýtam, či je niekto ochotný spraviť tieto zmeny?. Vďaka.
Napsal: 31 srp 2024, 17:48
od jankrizan
Chcel by som sa opäť vrátiť k môjmu problému s rotačným encoderom, či sa nájde niekto, kto dokáže upraviť problém so štyrmi taktmi na jednu polohu enkodera (pozri detaily v predošlých článkoch). Poprípade zmeniť iný systém encodera v tomto programe. Obnovím problém. Pri posunutí enkodéra o 1 polohu sa posunie frekvencia nie o napr.: 1000 Hz, ako má byť, ale preskočí po 250 Hz a 4x, čiže 250, 500, 750, sa posunú v medzipolohe jednej polohy, (jedného zuba). A niekedy tie hodnoty ešte preskočia nepravidelne a výsledok je napr.: 1000, 1250, 1500, 1750, a zostane zobrazenie displeja na 1750 namiesto 2000. Dúfam, že mi rozumiete čo mám na mysli, že ako sa to správa. Tu je ešte raz správny sketch.
Napsal: 06 říj 2024, 15:27
od jankrizan
Zdravím. Tak sa mi podarilo konečne eliminovať ten problém s enkodérom. Vlastne, asi nebol problém v enkodéri, ale v príkaze (#define rootOfTen (sqrt(sqrt(10))). Jednoducho som ho vymazal a všetko, čo sa týkalo rootOfTen a je po problémoch, enkoder prepína po kroku tak ako má, a nezmyselné medzipolohy už nie sú. Možno je to pre program nekorektné, ale funguje to ako ja chcem. Ale aj tak by som chcel na displeji zobrazovať frekvenciu v tvare 0 000 000, (čiže oddeľovač tisícov) a nie 0000000, tak ako to zobrazuje teraz a na to som krátky. Poradte mi, ako na to - PROSÍM -. Prikladám moju úpravu programu.
Napsal: 06 říj 2024, 16:58
od asdf
Pokus. Snad takhle?
Napsal: 06 říj 2024, 18:14
od jankrizan
PERFEKTNÉ. Ďakujem, vedel by si to aplikovať aj do precisionScale, toto sa prejavilo iba v encoderValue. Ale je to super.
Napsal: 06 říj 2024, 18:22
od asdf
Místo:
napíšeš:
Ale nevím, co tam znamená ten nulový druhý parametr, takže to možná neudělá přesně, co chceš.
EDIT: A v téhle řádce možná tu tečku vyměnit za mezeru, nebo co tam chceš tisknout:
Kód: Vybrat vše
if ( position % 3 == 0 && position ) print_char('.');
Napsal: 06 říj 2024, 18:37
od jankrizan
Tá 0 znamená počet desatinnych miest. Zmazanie 0 sa prejaví ako napr. 100,00 Hz.
Napsal: 06 říj 2024, 18:41
od jankrizan
if ( position % 3 == 0 && position ) print_char('.'); To som pochopil a aj zmenil, ale v precisionScale to nefachá.
Napsal: 06 říj 2024, 18:55
od jankrizan
Prepáč mi, nevšimol som si,že treba vymazať lcd. pred print. Takto to funguje . Veľká VĎAKA.
Napsal: 06 říj 2024, 18:55
od asdf
Aha, ono je to double a ne long.
Tak tam dej:
Kód: Vybrat vše
print((unsigned long) precisionScale);
Snad se to do toho longu vejde. Nevím, jakých hodnot to může nabývat.