Fórum témák

» Több friss téma
Fórum » AVR - Miértek hogyanok
 
Témaindító: pakibec, idő: Márc 11, 2006
Témakörök:
WinAVR / GCC alapszabályok:
1. Ha ISR-ben használsz globális változót, az legyen "volatile"
2. Soha ne érjen véget a main() függvény
3. UART/USART hibák 99,9% a rossz órajel miatt van
4. Kerüld el a -O0 optimalizációs beállítást minden áron
5. Ha nem jó a _delay időzítése, akkor túllépted a 65ms-et, vagy rossz az optimalizációs beállítás
6. Ha a PORTC-n nem működik valami, kapcsold ki a JTAG-et
Bővebben: AVR-libc FAQ
Lapozás: OK   838 / 840
(#) cua válasza Tambi hozzászólására (») Aug 20, 2024 /
 
Ez lenne amit az ESP32 timerBegin() varna.
Roviden:
  1. hw_timer_t * timerBegin(uint32_t frequency);


Ez pedig az az altalad hasznalt valtozat .
Roviden:
  1. hw_timer_t * timerBegin(uint8_t num, uint16_t divider, bool countUp)


Megrovidebben: rossz a framework/library.
A hozzászólás módosítva: Aug 20, 2024
(#) Tambi válasza cua hozzászólására (») Aug 20, 2024 /
 
Köszönöm kedves Cua és Bakman!

Végső elkeseredésemben kábelemet bent hagytam a munkahelyemen, így holnap tudom feltölteni, de szoftveresen ellenőrizve hibaüzenet nélküli a végeredmény:

  1. #define LED 2                                     //LED legyen a D2 lábon
  2. #define POT_PIN 34                                //a potenciométer legyen a 34-es ADC lábon
  3. hw_timer_t * timer = NULL;                        //timer-nek elnevezzük a timer NULL (0) időzítőt
  4. uint32_t usec = 500000;                           //kezdő időköz 500 000 µs (0,5 másodperc)
  5.  
  6. void IRAM_ATTR onTimer(){                         //ezt a megszakításkor végrehjatandó programrész onTimer "címe"
  7. digitalWrite(LED, !digitalRead(LED));}            //ez pedig a programrész (toggle LED)
  8.  
  9. void setup(){
  10.   pinMode(LED, OUTPUT);                            //LED pin beállítása kimenetként
  11.   timer = timerBegin(80);                          //80MHz előosztója 80, T = 1 usec
  12.   timerAttachInterrupt(timer, &onTimer);           //megszakításkor az onTimer-ben levő programrészt hajtja végre
  13.   timerAlarm(timer, usec, true, 0);}               //KEZDŐÉRTÉK; az időzítő "usec" mikroszekundum utan megszakít
  14.  
  15. void loop() {
  16.   int potValue = analogRead(POT_PIN);              //potenciométer érték olvasása
  17.   usec = map(potValue, 0, 4095, 1000, 1000000);    //az érték átalakítása 1 ms és 1000 ms közé
  18.   timerAlarm(timer, usec, true, 0);}               //az időzítő "usec" mikroszekundum utan megszakít, 0:folyamatosan


enable nincs benne...

Természetesen lábon lőttem magam, mert nekem lineáris frekvenciagenerátor kellene, de innen talán könnyebb lesz...

Még egyszer köszönöm!

Jó éjt; Tambi
A hozzászólás módosítva: Aug 20, 2024
(#) Tambi válasza Tambi hozzászólására (») Aug 22, 2024 /
 
Köszönöm mindenkinek, ez működik 100-150 kHz-ig, de 4-5% kitöltésremegéssel. Feltöltöm ide, talán haszznát veszi valaki:
  1. #define LED 2                                     //LED legyen a D2 lábon
  2. hw_timer_t * timer = NULL;                        //"timer"-nek elnevezzük a timer NULL (0) időzítőt
  3.  
  4. void IRAM_ATTR onTimer(){                         //ez a megszakításkor végrehjatandó programrész onTimer "címe"
  5. digitalWrite(LED, !digitalRead(LED));}             //ez pedig a programrész (toggle LED)
  6.  
  7. void setup(){
  8.   pinMode(LED, OUTPUT);                            //LED pin beállítása kimenetként
  9.   timer = timerBegin(1000000);                     //frekvencia Hz
  10.   timerAttachInterrupt(timer, &onTimer);           //megszakításkor a "void IRAM_ATTR onTimer" programrészt hajtja végre
  11.   timerAlarm(timer, 10, true,0);}                  //a "timer" időzítő, 10 mikroszekundumonként, folyamatosan megszakít
  12.  
  13. void loop() {}
A hozzászólás módosítva: Aug 22, 2024
(#) lazsi válasza Tambi hozzászólására (») Aug 22, 2024 /
 
Esetleg egy másik megszakítás beleszólhat?
(#) Tambi válasza lazsi hozzászólására (») Aug 25, 2024 /
 
Köszönöm, kedves Lazsi!
Nincs tudomásom másik megszakításról, de a "tudomásom" nem jelent semmit (vagy csak nagyon keveset...).

Megtörve bár, de fogyva nem felteszem életem fő művét, melyet sokak segítségével (de főleg Asch útmutatása alapján) hoztam össze Nano-ra. Stabil, nem leng, nagyon jól működik. A frekvenciát és a frekvenciasávokat 1-1 db forgójeladó TEKERÉSÉVEL lehet állítani, mert a nyomógombokat utálom...
Szomorúság benne, hogy 100 kHz fölött az OCR1A egyre durvább frekvenciaváltozást okoz lépésenként.
Végülis az eredeti célt; a 100 Hz-től (50)60 kHz-ig terjedő, sávváltás nélküli átfogást, valamint némi kis hatványozással a frekvencia (fordulatszám) emberibb szabályozását sikerült elérni.

A TM1637; 6 karakteres 7 szegmens LED kijelző nem megméri a frekvenciát csupán azt jelzi, hogy mennyinek kellene lenni, így némi kis eltérés (max. 1-2%) tapasztalható. Fogyaszt vagy 30 mA-t, cserébe akárhonnan, akármilyen fényviszonyok mellett is jól látható (még hátulról is; tükörből...)

  1. /*   ENCODER:  2db HESTORE ROT-1AB:
  2. pulse:  "ACh"-D2 között 10kOhm, D2-GND között 10nF, "BCh" D7-en  
  3.    ex:  "ACh"-D3 között 10kOhm, D3-GND között 10nF, "BCh" D6-on  */
  4. #include <Arduino.h>
  5. #include <TM1637TinyDisplay6.h>       // Include 6-Digit Display Class Header
  6. #define CLK 4                         // TM1637 D4 -> CLK
  7. #define DIO 5                         // TM1637 D5 -> DIO
  8. TM1637TinyDisplay6 display(CLK, DIO); // 6-Digit Display Class
  9. volatile int pulse = 1;               //a "pulse" impulzusösszeg "volatile int" tipusú, "1" kezdőértékűre állítjuk
  10. volatile int ex = 0;                  //"ex" a decimális léptetés 10-es alapú hatványának kitevője 0-tól 5-ig
  11. long  frequency = 1;                  //kimenő frekvencia
  12. int P = 1;                            //"Prescaler" elllőosztó értéke
  13. int b = 1;                            //sávszélesség korrekciós szám
  14.  
  15. void setup(){
  16.      Serial.begin(9600);
  17.      display.setBrightness(1);        //TM1637 fényerő 1-7-ig
  18.     pinMode (2, INPUT_PULLUP);        //INT0 megszakítás; frekvenciaszorzó, ENCODER1 ACh  
  19.     pinMode (3, INPUT_PULLUP);        //INT1 megszakítás; hullámsáv decimális szorzó ENCODER2 ACh  
  20.     pinMode (6, INPUT_PULLUP);        //ENCODER2 BCh
  21.     pinMode (7, INPUT_PULLUP);        //ENCODER1 BCh
  22.     pinMode (9, OUTPUT);              //jelkimenet
  23.   TCCR1A = 0b01000000;                //OC1A (9-es kimenet) toggling mód beállítása
  24.     attachInterrupt(digitalPinToInterrupt(2), INT0_SUBR, FALLING);
  25.     attachInterrupt(digitalPinToInterrupt(3), INT1_SUBR, FALLING); }
  26.  
  27. void loop(){
  28. long  a = pow(10, ex);                                                          // decimális sávváltó-szorzó
  29.      if(ex == 0)  { TCCR1B = 0b00001100; P = 256; b= 1; }                             //  1-10Hz    WGM12 CTC mód, P=256            
  30. else if(ex == 1)  { TCCR1B = 0b00001011; P =  64; b= 1; }                             //  10-100Hz  P=64
  31. else if(ex == 2)  { TCCR1B = 0b00001010; P =   8; b= 1; }                             // 100-1kHz   P=8
  32. else if(ex == 3)  { TCCR1B = 0b00001001; P =   1; b= 1; }                             //  1k-10kHz  P=1          
  33. else if(ex == 4)  { TCCR1B = 0b00001001; P =   1; b= 1; }                             // 10k-100kHz P=1
  34. else if(ex == 5)  { TCCR1B = 0b00001001; P =   1; b= 1; }                             //100k-1MHz   P=1
  35. else if(ex == 6)  { TCCR1B = 0b00001010; P =   8; a = 10; b = pow(1.066059666, pulse);}  // 10Hz-60kHz P=8   , 1.39
  36.   long  frequency = map(pulse,1,100,a,10*a*b);
  37.           OCR1A = (16000000UL / (2 * P * frequency)) - 1;
  38.       Serial.print("pulse = ");    
  39.       Serial.print(pulse);
  40.       Serial.print("    ex = ");    
  41.       Serial.print(ex);
  42.       Serial.print("    a = ");    
  43.       Serial.print(a);
  44.       Serial.print("     frequency = ");    
  45.       Serial.print(frequency);
  46.       Serial.println("Hz");
  47.     display.showNumberDec(frequency, true, 6); //TM1637_6 frekvenciakijelző
  48.   delay(300); }
  49.  
  50. void INT0_SUBR () {                  //INT0 megszakítás: 2. láb "FALLING" lefutóélére innen folytatja:
  51.   if(digitalRead(7) == LOW){         //ha a B-csatorna "0" LOW, akkor
  52.    pulse++;                          //növeli 1-el "pulse" összegét
  53.    }else {                           //ha B értéke nem "0" LOW, akkor
  54.    pulse--; }                        //csökkenti 1-el "pulse" összegét.
  55. pulse = min(max(pulse, 1), 100); }   // 1 < pulse < 100, az "INT0_SUBR" végrehajtva, vissza a főprogramba
  56.  
  57. void INT1_SUBR () {                  //INT1 megszakítás: 3. láb "FALLING" lefutóélére innen folytatja:
  58.   if(digitalRead(6) == LOW){         //ha a B-csatorna "0" LOW, akkor
  59.    ex++;                             //növeli 1-el "pulse" összegét
  60.    }else {                           //ha B értéke nem "0" LOW, akkor
  61.    ex--; }                           //csökkenti 1-el "pulse" összegét.
  62. ex = min(max(ex, 0), 6); }           // 0 < pulse < 6, az "INT1_SUBR" végrehajtva, vissza a főprogramba


De büszke lennék magamra, ha egyszer az életben tőlem is kérdezne valaki...

Derűs napot kíván; Tambi.
(#) Tambi válasza lazsi hozzászólására (») Aug 26, 2024 /
 
Kedves Lazsi!
Ismét elővettem az AD9833-t, hogy 100kHz és 1MHz között is elfogadható lépésekkel lehessen szabályozni a frekvenciát.
  1. /*   ENCODER:  2db HESTORE ROT-1AB:
  2. 1. ENCODER: pulse:  "ACh"-D2 között 10kOhm, D2-GND között 10nF, "BCh" D7-en  
  3. 2. ENCODER:    ex:  "ACh"-D3 között 10kOhm, D3-GND között 10nF, "BCh" D6-on  */
  4. #include <Arduino.h>
  5. #include <TM1637TinyDisplay6.h>       // Include 6-Digit Display Class Header
  6. AD9833 gen(9); // AD9833 D9 -> FSYNC, D11 -> SDATA, D13 -> SCLK
  7. #define CLK 4  // TM1637 D4 -> CLK
  8. #define DIO 5  // TM1637 D5 -> DIO
  9. TM1637TinyDisplay6 display(CLK, DIO); // 6-Digit Display Class
  10. volatile int pulse = 1;      //a "pulse" impulzusösszeg "volatile int" tipusú, "1" kezdőértékűre állítjuk
  11. volatile int ex = 0;         //"ex" a decimális léptetés 10-es alapú hatványának kitevője 0-tól 6-ig
  12.  
  13. void setup(){
  14.      Serial.begin(9600);
  15.      display.setBrightness(1);
  16.     pinMode (2, INPUT_PULLUP);   //1. ENCODER: "ACh_Pin" D2. lábat "INPUT_PULLUP" bemenetként felhúzzuk tápfeszültségre    
  17.     pinMode (3, INPUT_PULLUP);   //2. ENCODER: "ACh_Pin" D3. lábat "INPUT_PULLUP" bemenetként felhúzzuk tápfeszültségre    
  18.     pinMode (6, INPUT_PULLUP);   //2. ENCODER: "BCh_Pin" D6. lábat "INPUT_PULLUP" bemenetként felhúzzuk tápfeszültségre    
  19.     pinMode (7, INPUT_PULLUP);   //1. ENCODER: "BCh_Pin" D7. lábat "INPUT_PULLUP" bemenetként felhúzzuk tápfeszültségre
  20.     attachInterrupt(digitalPinToInterrupt(2), INT0_SUBR, FALLING);
  21.     attachInterrupt(digitalPinToInterrupt(3), INT1_SUBR, FALLING);
  22.   gen.Begin();              
  23.   gen.EnableOutput(true);}
  24.  
  25. void loop(){
  26.       Serial.print("pulse = ");    
  27.       Serial.print(pulse);
  28.       Serial.print("    ex = ");    
  29.       Serial.print(ex);
  30. long  a = pow(10, ex); //a 2. ENCODER  a decimális hullámsávváltást 10^ex-el vezérli
  31.       Serial.print("    a = ");    
  32.       Serial.print(a);
  33. if(ex < 6){
  34. long  frequency = map(pulse,1,100,a,10*a);
  35.       Serial.print("     frequency = ");    
  36.       Serial.print(frequency);
  37.       Serial.println("Hz");
  38.      display.showNumberDec(frequency, true, 6);
  39. int   WAVE = digitalRead(8);
  40. if (WAVE == HIGH) {gen.ApplySignal(SQUARE_WAVE,REG0,frequency);} //hullámforma választása a D8 lábbal
  41. else {gen.ApplySignal(SINE_WAVE,REG0,frequency);} }    
  42.      
  43. else {
  44. long  frequency = map(pulse,1,100,100,100 * pow(1.066059666, pulse));//a pow(hatvány, kitevő) függvényt a 100Hz-60kHz könyebb szabályozása érdekében alkalmazzuk
  45.       Serial.print("     frequency = ");    
  46.       Serial.print(frequency);
  47.       Serial.println("Hz");
  48.      display.showNumberDec(frequency, true, 6);}  //TM1637_6-on a frekvencia kijelzése
  49. delay(300); }
  50.  
  51. void INT0_SUBR () {                  //INT0 2. láb "FALLING" lefutóélére innen folytatja
  52.   if(digitalRead(7) == LOW){         //ha a B-csatorna (D7) "0" LOW, akkor
  53.    pulse++;                          //növeli 1-el "pulse" összegét
  54.    }else {                           //ha B értéke nem "0" LOW, akkor
  55.    pulse--; }                        //csökkenti 1-el "pulse" összegét.
  56. pulse = min(max(pulse, 1), 100); }   // 1 < pulse < 100, az "INT0_SUB" végrehajtva, vissza a főprogramba
  57.  
  58. void INT1_SUBR () {                  //INT1 3. láb "FALLING" lefutóélére innen folytatja
  59.   if(digitalRead(6) == LOW){         //ha a B-csatorna (D6) "1" magas, akkor
  60.    ex++;                             //növeli 1-el "pulse" összegét
  61.    }else {                           //ha B értéke nem "1" magas, akkor
  62.    ex--; }                           //csökkenti 1-el "pulse" összegét.
  63. ex = min(max(ex, 0), 6); }           // 0 < pulse < 5, az "INT0_SUB" végrehajtva, vissza a főprogramba


Jól működne, ha az impulzusszélesség stabil lenne... Mitől lehet és mit lehet tenni? ("Természetesen" dugdosós panelen van összerakva...)

Köszönettel; Tambi.
A hozzászólás módosítva: Aug 26, 2024

INSTABIL.jpg
    
(#) lazsi válasza Tambi hozzászólására (») Aug 26, 2024 /
 
Megmondom őszintén, én csak AVR-ekkel (értsd: saját készítésű áramkörben lévő "üres" proci és nem ARDUINO, amiben van egy "betöltő-rutin") foglalkoztam, és ASM-ben programoztam őket.
Amikor időzítés-kritikus programot írtam, ott mindig nagyon kellett figyelni a megszakításokra, hogy mikor jöhet és mikor nem jöhet be egy másik - ezért gondoltam erre nálad is.

Nem tudom, hogy pl. a kijelzőre író rutin használ-e megszakítást... De én a főhurokba lehetőség szerint semmit sem tennék... A kijelző tartalmát csak akkor íratnám ki, amikor az megváltozik. Amikor megváltozik, az ugye valamilyen emberi beavatkozás következménye, tehát aközben nem gond, ha változik az impulzus-szélesség (persze jó lenne, ha akkor sem, de az még "elnézhető").

Nem ismerem (még nem használtam) az AD9833-at, ha annak a kimenete "lötyög", akkor vagy abban van a probléma (vélhetően nem...), vagy ilyen változó vezérlést kap.
Nem tudhatom azt sem, hogy miként reagál arra, ha menet közben új beállítást kap.
Ha ugyanazt kapja, de megkapja (másodpercenként 3-szor?), az is újnak számít?

Nem tudom, hogy a map() függvénynek hány paraméter kell... A 35. sorban 5-öt, a 45. sorban 6-ot kap.


Én a főhurokból mindent kiszerveznék a változás kezelőjéhez. (Esetleg amikor bármilyen beállítás-változtatás történik, leállítanám a generálást, és a kijelzés végeztével kapcsolnám vissza.
De kb. itt értem az ötleteim végére... Remélem kapsz hozzáértőbb választ is!
(#) majkimester válasza Tambi hozzászólására (») Aug 26, 2024 / 1
 
Előszőr állapítsd meg, hogy a jitter a program vagy az áramkör miatt van. A setup végére tegyél be 1db gen.ApplySignal(SQUARE_WAVE,REG0,frequency); hívást, a loop() pedig legyen üres. Ez után a AD ezt a frekit fogja generálni. Ha így is van jitter, akkor azt az áramkörödben kell keresni, ha nincs, akkor pedig a programban.
(#) Tambi válasza majkimester hozzászólására (») Aug 26, 2024 /
 
Köszönöm kedves Fórumtársak!

Minimalizálva:
  1. /*
  2. Nano ->9833
  3.   D9 ->FSYNC
  4.   D11->SDATA
  5.   D13->SCLK*/
  6. AD9833 gen(9);
  7.  
  8. void setup(){
  9.   gen.Begin();              
  10.   gen.EnableOutput(true);
  11.   gen.ApplySignal(SQUARE_WAVE,REG0,1000000);}
  12.  
  13. void loop(){}


Az eredmény kb 5 óra múlva lesz látható: https://youtu.be/8zwMYINne6o

Sajnos a jitter a régi...
(Az új Qwon-nak jobb a szinkronja, mint a régi Rigol-nak. )

Három db AD9833-al próbáltam, az eredmény ugyanaz, bár nyilván azonos szériából valók...
A szinusz 0,6 Vcs-cs, és stabil, nincs jitter.

Köszönettel; Tambi
A hozzászólás módosítva: Aug 26, 2024
(#) Bakman válasza Tambi hozzászólására (») Aug 26, 2024 /
 
Nem ismerem az IC-t, de itt van egy érdekes rész, valószínűleg az adatlapból idéz az illető: Bővebben: Link.

Idézet:
„it may be worth using a integer multiple MCLK to avoid phase tuncation errors which do have an impact on jitter.”
(#) Tambi hozzászólása Szept 1, 2024 /
 
Kedves Fórumtársak!
Ismét ti tudtok segíteni...
ESP32 újabb kiadású szoftverével kínlódok. Az első kód nagyszerűen működik, még 40 MHz is kijön belőle, bár inkább szinusznak mérem, de stabil... 1 Hz-től 10 MHz-ig elfogadható négyszöghullám. Ráadásul a teljes kód mind a két sorát értem...

  1. /*   https://espressif-docs.readthedocs-hosted.com/projects/arduino-esp32/en/latest/api/ledc.html
  2. https://docs.espressif.com/projects/arduino-esp32/en/latest/api/ledc.html    */
  3. int PIN = 2;
  4. long  f = 1000;
  5. int   D = 12;
  6.  
  7. void setup() {}
  8.  
  9. void loop() {
  10.   ledcAttach(PIN, f, D);             //OUTPUT_PIN, frequency, duty cicle kitöltés beállíthatósága pl.: 2^D
  11.   ledcWrite (PIN, pow(2, D) / 2); }  //OUTPUT_PIN, kitöltés = (2^D / 2) / (2^D) * 100 = 50%
  12.  
  13. /* kitöltés felbontása Dmax:  (2^D * f) < 40MHz
  14.      1Hz -  10kHz D = 10
  15.   10 kHz - 100kHz D =  8
  16.   100kHz - 1MHz   D =  5
  17.     1MHz - 10MHz  D =  2
  18.    10MHz - 40MHz  D =  1
  19. */



Ezt az alábbiak szerint forgó jeladóval kiegészítve csak a fejlécbe beírt frekvencia hajlandó megjelenni a GPIO2-n. A jeladót szkóppal nézve működik, a megszakítás is, mert a serial.print által kiírt frekvenciaérték is úgy változatható, ahogy kell, és ezt meg is jeleníti, de a kimeneten mégsem változik a frekvencia.
Az összes általam ismert adattípussal kipróbáltam a változókat, de mostanra kifogytam az ötletekből.

Szerintetek mit lehet itt tenni?

  1. /*   HESTORE ROT-1AB encoder
  2. irodalom:
  3. https://espressif-docs.readthedocs-hosted.com/projects/arduino-esp32/en/latest/api/ledc.html
  4. https://docs.espressif.com/projects/arduino-esp32/en/latest/api/ledc.html              */
  5. int PIN_A = 22;
  6. int PIN_B = 23;
  7. uint8_t PIN = 2;
  8. volatile uint32_t f = 100;
  9. uint8_t D = 14;
  10.  
  11. void IRAM_ATTR INT_F() {
  12.    if (digitalRead(PIN_B) == LOW) {  
  13.         f++;
  14.    } else {  
  15.         f--;
  16.    }
  17. }
  18.  
  19. void setup() {
  20.     Serial.begin(115200);
  21.     pinMode(PIN_A, INPUT_PULLUP);  
  22.     pinMode(PIN_B, INPUT_PULLUP);  
  23.     attachInterrupt(digitalPinToInterrupt(PIN_A), INT_F, FALLING);
  24. }
  25.  
  26. void loop() {
  27.     Serial.print("f: ");
  28.     Serial.println(f);
  29.   ledcAttach(PIN, f, D);                 //OUTPUT_PIN, frequency, duty cicle kitöltés beállíthatósága pl.: 2^D
  30.   ledcWrite (PIN, pow(2, D) / 2); }      //OUTPUT_PIN, kitöltés = ((2^D / 2) / (2^D)) * 100 = 50%
  31.  
  32. /* kitöltés felbontása Dmax:  2^D * f < 40MHz
  33.      1Hz -  10kHz D = 10
  34.   10 kHz - 100kHz D =  8
  35.   100kHz - 1MHz   D =  5
  36.     1MHz - 10MHz  D =  2
  37.    10MHz - 40MHz  D =  1
  38. */


Köszönettel derűs estét kíván; Tambi
A hozzászólás módosítva: Szept 1, 2024
(#) dc001 válasza Tambi hozzászólására (») Szept 2, 2024 /
 
Csak tippelek, lehet a 99 vagy 101 frekvencia nem jó a ledcAttach()-nak. Én megpróbálnám megnézni nagyobb léptékkel ( f+=50; ) vagy szorozni/osztani kettővel, hogy azzal megy-e.

A másik, hogy a ledcAttach() visszatérési értékét is kiírni. Ha sikeres TRUE ha sikertelen akkor FALSE értéket ad vissza.
A hozzászólás módosítva: Szept 2, 2024
(#) Tambi válasza dc001 hozzászólására (») Szept 2, 2024 /
 
Köszönöm kedves Dc001!
Az alapfrekvenciát megváltoztattam 182 Hz-re, az f++ -t f=f+10-re, a serial.print(f) gyönyörűen jelzi a 10-es lépésenkénti változást, de a kimenet marad a stabil 182 Hz, nem változik f-el együtt.

A ledcAttach(PIN, f, D); áthelyezhető a setup-ból a loop-ba?

Hogyan kell a ledcAttach()-t kiíratni? A
Serial.print(" ledcAttach: ");
Serial.println(ledcAttach); -ra nagyon hosszú hibalistát küldött:

C:\OneDrive\OneDrive - Csarnok.hu Kft\EN\AVR_2024\_____ESP32\GENERATOR_LEDC_ENC_min\GENERATOR_LEDC_ENC_min.ino: In function 'void loop()':
C:\OneDrive\OneDrive - Csarnok.hu Kft\EN\AVR_2024\_____ESP32\GENERATOR_LEDC_ENC_min\GENERATOR_LEDC_ENC_min.ino:33:15: error: no matching function for call to 'println(bool (&)(uint8_t, uint32_t, uint8_t))'
33 | Serial.println(ledcAttach);
In file included from C:\Users\APA\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.0.3\cores\esp32/Stream.h:26,
from C:\Users\APA\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.0.3\cores\esp32/Arduino.h:193,
from C:\Users\APA\AppData\Local\Temp\arduino\sketches\0EBA565169E8B35385C1FC4A6CDA5573\sketch\GENERATOR_LEDC_ENC_min.ino.cpp:1:
C:\Users\APA\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.0.3\cores\esp32/Print.h:102:10: note: candidate: 'size_t Print::println(char)' (near match)
102 | size_t println(char);
| ^~~~~~~
C:\Users\APA\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.0.3\cores\esp32/Print.h:102:10: note: conversion of argument 1 would be ill-formed:
C:\OneDrive\OneDrive - Csarnok.hu Kft\EN\AVR_2024\_____ESP32\GENERATOR_LEDC_ENC_min\GENERATOR_LEDC_ENC_min.ino:33:16: error: invalid conversion from 'bool (*)(uint8_t, uint32_t, uint8_t)' {aka 'bool (*)(unsigned char, long unsigned int, unsigned char)'} to 'char' [-fpermissive]
33 | Serial.println(ledcAttach);
| ^~~~~~~~~~
| |
| bool (*)(uint8_t, uint32_t, uint8_t) {aka bool (*)(unsigned char, long unsigned int, unsigned char)}
C:\Users\APA\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.0.3\cores\esp32/Print.h:103:10: note: candidate: 'size_t Print::println(unsigned char, int)' (near match)
103 | size_t println(unsigned char, int = DEC);
| ^~~~~~~
C:\Users\APA\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.0.3\cores\esp32/Print.h:103:10: note: conversion of argument 1 would be ill-formed:
C:\OneDrive\OneDrive - Csarnok.hu Kft\EN\AVR_2024\_____ESP32\GENERATOR_LEDC_ENC_min\GENERATOR_LEDC_ENC_min.ino:33:16: error: invalid conversion from 'bool (*)(uint8_t, uint32_t, uint8_t)' {aka 'bool (*)(unsigned char, long unsigned int, unsigned char)'} to 'unsigned char' [-fpermissive]
33 | Serial.println(ledcAttach);
| ^~~~~~~~~~
| |
| bool (*)(uint8_t, uint32_t, uint8_t) {aka bool (*)(unsigned char, long unsigned int, unsigned char)}
C:\Users\APA\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.0.3\cores\esp32/Print.h:104:10: note: candidate: 'size_t Print::println(int, int)' (near match)
104 | size_t println(int, int = DEC);
| ^~~~~~~
C:\Users\APA\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.0.3\cores\esp32/Print.h:104:10: note: conversion of argument 1 would be ill-formed:
C:\OneDrive\OneDrive - Csarnok.hu Kft\EN\AVR_2024\_____ESP32\GENERATOR_LEDC_ENC_min\GENERATOR_LEDC_ENC_min.ino:33:16: error: invalid conversion from 'bool (*)(uint8_t, uint32_t, uint8_t)' {aka 'bool (*)(unsigned char, long unsigned int, unsigned char)'} to 'int' [-fpermissive]
33 | Serial.println(ledcAttach);
| ^~~~~~~~~~
| |
| bool (*)(uint8_t, uint32_t, uint8_t) {aka bool (*)(unsigned char, long unsigned int, unsigned char)}
C:\Users\APA\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.0.3\cores\esp32/Print.h:105:10: note: candidate: 'size_t Print::println(unsigned int, int)' (near match)
105 | size_t println(unsigned int, int = DEC);
| ^~~~~~~
C:\Users\APA\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.0.3\cores\esp32/Print.h:105:10: note: conversion of argument 1 would be ill-formed:
C:\OneDrive\OneDrive - Csarnok.hu Kft\EN\AVR_2024\_____ESP32\GENERATOR_LEDC_ENC_min\GENERATOR_LEDC_ENC_min.ino:33:16: error: invalid conversion from 'bool (*)(uint8_t, uint32_t, uint8_t)' {aka 'bool (*)(unsigned char, long unsigned int, unsigned char)'} to 'unsigned int' [-fpermissive]
33 | Serial.println(ledcAttach);
| ^~~~~~~~~~
| |
| bool (*)(uint8_t, uint32_t, uint8_t) {aka bool (*)(unsigned char, long unsigned int, unsigned char)}
C:\Users\APA\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.0.3\cores\esp32/Print.h:106:10: note: candidate: 'size_t Print::println(long int, int)' (near match)
106 | size_t println(long, int = DEC);
| ^~~~~~~
C:\Users\APA\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.0.3\cores\esp32/Print.h:106:10: note: conversion of argument 1 would be ill-formed:
C:\OneDrive\OneDrive - Csarnok.hu Kft\EN\AVR_2024\_____ESP32\GENERATOR_LEDC_ENC_min\GENERATOR_LEDC_ENC_min.ino:33:16: error: invalid conversion from 'bool (*)(uint8_t, uint32_t, uint8_t)' {aka 'bool (*)(unsigned char, long unsigned int, unsigned char)'} to 'long int' [-fpermissive]
33 | Serial.println(ledcAttach);
| ^~~~~~~~~~
| |
| bool (*)(uint8_t, uint32_t, uint8_t) {aka bool (*)(unsigned char, long unsigned int, unsigned char)}
C:\Users\APA\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.0.3\cores\esp32/Print.h:107:10: note: candidate: 'size_t Print::println(long unsigned int, int)' (near match)
107 | size_t println(unsigned long, int = DEC);
| ^~~~~~~
C:\Users\APA\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.0.3\cores\esp32/Print.h:107:10: note: conversion of argument 1 would be ill-formed:
C:\OneDrive\OneDrive - Csarnok.hu Kft\EN\AVR_2024\_____ESP32\GENERATOR_LEDC_ENC_min\GENERATOR_LEDC_ENC_min.ino:33:16: error: invalid conversion from 'bool (*)(uint8_t, uint32_t, uint8_t)' {aka 'bool (*)(unsigned char, long unsigned int, unsigned char)'} to 'long unsigned int' [-fpermissive]
33 | Serial.println(ledcAttach);
| ^~~~~~~~~~
| |
| bool (*)(uint8_t, uint32_t, uint8_t) {aka bool (*)(unsigned char, long unsigned int, unsigned char)}
C:\Users\APA\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.0.3\cores\esp32/Print.h:108:10: note: candidate: 'size_t Print::println(long long int, int)' (near match)
108 | size_t println(long long, int = DEC);
| ^~~~~~~
C:\Users\APA\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.0.3\cores\esp32/Print.h:108:10: note: conversion of argument 1 would be ill-formed:
C:\OneDrive\OneDrive - Csarnok.hu Kft\EN\AVR_2024\_____ESP32\GENERATOR_LEDC_ENC_min\GENERATOR_LEDC_ENC_min.ino:33:16: error: invalid conversion from 'bool (*)(uint8_t, uint32_t, uint8_t)' {aka 'bool (*)(unsigned char, long unsigned int, unsigned char)'} to 'long long int' [-fpermissive]
33 | Serial.println(ledcAttach);
| ^~~~~~~~~~
| |
| bool (*)(uint8_t, uint32_t, uint8_t) {aka bool (*)(unsigned char, long unsigned int, unsigned char)}
C:\Users\APA\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.0.3\cores\esp32/Print.h:109:10: note: candidate: 'size_t Print::println(long long unsigned int, int)' (near match)
109 | size_t println(unsigned long long, int = DEC);
| ^~~~~~~
C:\Users\APA\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.0.3\cores\esp32/Print.h:109:10: note: conversion of argument 1 would be ill-formed:
C:\OneDrive\OneDrive - Csarnok.hu Kft\EN\AVR_2024\_____ESP32\GENERATOR_LEDC_ENC_min\GENERATOR_LEDC_ENC_min.ino:33:16: error: invalid conversion from 'bool (*)(uint8_t, uint32_t, uint8_t)' {aka 'bool (*)(unsigned char, long unsigned int, unsigned char)'} to 'long long unsigned int' [-fpermissive]
33 | Serial.println(ledcAttach);
| ^~~~~~~~~~
| |
| bool (*)(uint8_t, uint32_t, uint8_t) {aka bool (*)(unsigned char, long unsigned int, unsigned char)}

exit status 1

Compilation error: no matching function for call to 'println(bool (&)(uint8_t, uint32_t, uint8_t))'

Mindig olyasmibe fogok, ami meghaladja....

Köszönettel; Tambi
(#) Tambi válasza Tambi hozzászólására (») Szept 2, 2024 /
 
Külön méreg, hogy x10 mérőfejjel még a 10 MHz is stabil, semmi jitter, fel és lefutása 4 nsec körül van!!! Vagyis nagyszerű lenne, ha működne...
(#) lazsi válasza Tambi hozzászólására (») Szept 2, 2024 /
 
Én továbbra is azt tanácsolom, hogy a frekvencia változtatását ne tedd meg minden egyes ciklusban...
Amikor megváltozik a bemenet miatt, akkor (és csak akkor egyszer) küldd ki és írasd ki!
Nem gondolom, hogy ez lenne a hiba oka (bár ki tudja?), de a későbbiekben jobban jársz vele...

Tesztként azt próbálnám meg, hogy
f++ helyett f = 150
f-- helyett f = 50
Így persze csak ezt a két értéket tudod kiválasztani!
De támpont lehet a további hibakereséshez:
- Csak az egyiket állítja be
- Beállítja, de egyből vissza is áll alap f-ra *
- Beállítja az egyiket, de egyből beállítja a másikat is, így vissza is áll az alap f-ra *
- Egyiket sem állítja be
* Ezt úgy tudnád észlelni, ha a szkópon olyan lassú eltérítést állítasz be, amin még észrevehetőek az egyes periódusok hossza közötti különbség, de minél több van belőlük. Pl. ha az alapfrekvenciát leviszed a 10-edére vagy 50-edére és az eltérítést a másodperc tartományba, akkor amint elindul az eltérítés, egyből elforgatod a jeladót.
Vagy a szkópot indított üzemmódban a kiküldött adatról szinkronizálod. (Emiatt is előnyösebb, ha nem a főhurokban folyamatosan ismételve küldi ki az értéket, hanem csak egyszer, amikor eltekerted a jeladót...) Vagy a jeladóról, hiszen az indítja az egész folyamatot.
Pl.
f = 10, f++ -> f= 15, f-- -> f = 5
f = 2, f++ -> f = 3, f-- -> f = 1
A hozzászólás módosítva: Szept 2, 2024
(#) szucsip hozzászólása Szept 2, 2024 /
 
Sziasztok!
Atmega128-nál (vagy bármelyiknél) milyen messze lehet az órajel kristálya az XTAL kivehetésektől? Sajnos erre a ChatGPT is csak bullshitet tudott mondani, bármi konkrét nélkül.

Az a helyzet, hogy 3 quartzot akarok rátenni, és jumperrel kiválasztani melyikről menjen. Persze a kivehetések egyik fele mindig fixen összekötve. Teliföld nincs
A hozzászólás módosítva: Szept 2, 2024
(#) kapu48 válasza Tambi hozzászólására (») Szept 2, 2024 /
 
Próbáld igy:
  1. ...
  2. attachInterrupt(PIN_A, INT_F, FALLING);
  3. ...
(#) Bakman válasza szucsip hozzászólására (») Szept 2, 2024 / 1
 
Láttam én már olyan NYÁK-ot is, ahol kb. 30 mm hosszú vezetősávokkal volt bekötve a kvarc.
(#) lazsi válasza szucsip hozzászólására (») Szept 3, 2024 /
 
El tudom képzelni, hogy a lehetséges (és üzembiztos) távolság függ a frekvenciától is...
12-16-20MHz vagy 32768Hz-65536Hz-1MHz?
(#) kalmi.kalmi válasza lazsi hozzászólására (») Szept 3, 2024 /
 
20Mhz-nél 15méteres a hullámhossz !
Néhány cm nem okoz problémát.
(#) lazsi válasza kalmi.kalmi hozzászólására (») Szept 3, 2024 /
 
És a párhuzamosan futó vezetékek kapacitása?
(#) kalmi.kalmi válasza lazsi hozzászólására (») Szept 3, 2024 /
 
Nem veszed figyelembe !
(#) szucsip válasza kalmi.kalmi hozzászólására (») Szept 3, 2024 /
 
De ha az élet figyelembe veszi, akkor megint lesz amomália. Lehet inkabb oszcillátorokat fogok használni. Es igen: 16 18.32 es 20MHz
(#) lazsi válasza szucsip hozzászólására (») Szept 4, 2024 /
 
Egyébként te milyen távol tervezted (volna) a kvarcokat?
A vezetékek kapacitása elhangolhatja a frekvenciát (időkritikus alkalmazásnál gond lehet) vagy instabillá teheti a teljes működést.
(#) Tambi hozzászólása Szept 11, 2024 / 1
 
Kedves Fórumtársak!

Azzal szeretném megköszönni a tőletek kapott sok segítséget, hogy idebiggyesztem a generátor végleges kódját.

  1. const byte ACh = 22;  // az A-csatorna jelét az GPIO18 lábra kötjük
  2. const byte BCh = 23;  // az B-csatorna jelét az GPIO19 lábra kötjük
  3. const byte eACh = 18;  // az eA-csatorna jelét az GPIO20 lábra kötjük
  4. const byte eBCh = 19;  // az eB-csatorna jelét az GPIO21 lábra kötjük
  5.  
  6. volatile int pulse = 1;  // Impulzusok száma
  7. volatile int e = 0;  // e impulzusok száma
  8. const int PWMCh = 1;  // ESP32 has 16 channels for PWM
  9. int RESOLUTION = 12;  // Kezdeti felbontás
  10. const int OUT = 4;
  11. uint32_t freq = 1;
  12.  
  13. // Pergésmentesítéshez használt időzítők
  14. volatile unsigned long lastDebounceTimeA = 0;
  15. volatile unsigned long lastDebounceTimeE = 0;
  16. const unsigned long debounceDelay = 50;  // 50 ms
  17.  
  18. void IRAM_ATTR INT0_SUBR() {
  19.   unsigned long currentTime = millis();
  20.   if (currentTime - lastDebounceTimeA > debounceDelay) {
  21.     lastDebounceTimeA = currentTime;
  22.  
  23.     if (digitalRead(BCh) == LOW) {
  24.       pulse++;  // Impulzus növelése
  25.     } else {
  26.       pulse--;  // Impulzus csökkentése
  27.     }
  28.  
  29.     // Pulse határainak ellenőrzése
  30.     if (pulse < 0) {
  31.       pulse = 0;
  32.     }
  33.     if (pulse > 100) {  // Maximum impulzusok száma (100 impulzus)
  34.       pulse = 100;
  35.     }
  36.   }
  37. }
  38.  
  39. void IRAM_ATTR eINT0_SUBR() {
  40.   unsigned long currentTime = millis();
  41.   if (currentTime - lastDebounceTimeE > debounceDelay) {
  42.     lastDebounceTimeE = currentTime;
  43.  
  44.     if (digitalRead(eBCh) == LOW) {
  45.       e++;  // Impulzus növelése
  46.     } else {
  47.       e--;  // Impulzus csökkentése
  48.     }
  49.  
  50.     // e határainak ellenőrzése (0 és 6 között)
  51.     if (e < 0) {
  52.       e = 0;
  53.     }
  54.     if (e > 6) {
  55.       e = 6;
  56.     }
  57.  
  58.     // Felbontás beállítása az 'e' értéke alapján
  59.     if (e == 0) {RESOLUTION = 10;}
  60.     else if (e == 1) {RESOLUTION = 12;}
  61.     else if (e == 2) {RESOLUTION = 10;}
  62.     else if (e == 3) {RESOLUTION = 8;}
  63.     else if (e == 4) {RESOLUTION = 6;}
  64.     else if (e == 5) {RESOLUTION = 4;}
  65.     else if (e == 6) {RESOLUTION = 2;}
  66.   }
  67. }
  68.  
  69. void setup() {
  70.   Serial.begin(115200);
  71.   pinMode(ACh, INPUT_PULLUP);  // A bemeneteket felhúzzuk
  72.   pinMode(BCh, INPUT_PULLUP);
  73.   pinMode(eACh, INPUT_PULLUP);
  74.   pinMode(eBCh, INPUT_PULLUP);
  75.   attachInterrupt(digitalPinToInterrupt(ACh), INT0_SUBR, FALLING);  // Interrupt beállítása
  76.   attachInterrupt(digitalPinToInterrupt(eACh), eINT0_SUBR, FALLING);  // Második encoder interrupt beállítása
  77.  
  78.   // Kezdeti PWM beállítás
  79.   ledcSetup(PWMCh, 1, RESOLUTION);
  80.   ledcAttachPin(OUT, PWMCh);
  81.   ledcWrite(PWMCh, (pow(2, RESOLUTION) / 2));  // Állandó 50%-os kitöltési tényező
  82. }
  83.  
  84. void loop() {
  85.   // A frekvencia kiszámítása az 'e' értéke alapján
  86.   if (e == 0) { RESOLUTION = 10;
  87.     freq = map(pulse, 1, 100, 100, 100 * pow(1.066059666, pulse));
  88.   } else {
  89.     freq = pow(10, e) + (pow(10, e) * 0.09 * pulse);
  90.   }
  91.  
  92.   // Információk megjelenítése a soros monitoron
  93.   Serial.print("e: ");
  94.   Serial.print(e);
  95.   Serial.print("    RESOLUTION: ");
  96.   Serial.print(RESOLUTION);
  97.   Serial.print("    Frequency: ");
  98.   Serial.println(freq);
  99.  
  100.   // PWM frekvencia frissítése
  101.   ledcSetup(PWMCh, freq, RESOLUTION);  // A frekvenciát a 'freq' értékére állítjuk
  102.   ledcWrite(PWMCh, (pow(2, RESOLUTION) / 2));  // Állandó 50%-os kitöltési tényező
  103.  
  104.   delay(100);
  105. }


1 Hz-től 10 MHz-ig, 6 dekádikus sávban képes 50%-os négyszög jelet generálni 2 db Hestore ROT-1AB forgó jeladóval lineárisan szabályozva a frekvenciát sávonként 100 egyenlő lépésben.
A fel- és lefutás 4-5 nsec, és stabil a frekvencia; majdnem jitter mentes...
Az e = 0 sáv szervomotorok tesztelésére szolgál, ahol a sávátfogás 100 Hz-től 60 kHz-ig terjed.

A nemvárt trükk az, hogy a setup-ban is, és a loop-ban is be kell állítani a ledcSetup-ot.
Szintén fontos, hogy az Arduino Ide Board esp32 by Espressif Systems régebbi (nekem 2.0.9) legyen, mert a jelenlegi 3.0.4 "nem ismeri" a ledcSetup-ot, ledcAttachPin-t, stb.

Köszönettel; Tambi
A hozzászólás módosítva: Szept 11, 2024
(#) Tambi válasza Tambi hozzászólására (») Szept 11, 2024 / 1
 
Bocsánat, ez a végleges kód, ami 40 MHz-ig megy

  1. const byte ACh = 22;  // az A-csatorna jelét az GPIO18 lábra kötjük
  2. const byte BCh = 23;  // az B-csatorna jelét az GPIO19 lábra kötjük
  3. const byte eACh = 18;  // az eA-csatorna jelét az GPIO20 lábra kötjük
  4. const byte eBCh = 19;  // az eB-csatorna jelét az GPIO21 lábra kötjük
  5.  
  6. volatile int pulse = 1;  // Impulzusok száma
  7. volatile int e = 0;  // e impulzusok száma
  8. const int PWMCh = 1;  // ESP32 has 16 channels for PWM
  9. int RESOLUTION = 12;  // Kezdeti felbontás
  10. const int OUT = 4;
  11. uint32_t freq = 1;
  12.  
  13. // Pergésmentesítéshez használt időzítők
  14. volatile unsigned long lastDebounceTimeA = 0;
  15. volatile unsigned long lastDebounceTimeE = 0;
  16. const unsigned long debounceDelay = 50;  // 50 ms
  17.  
  18. void IRAM_ATTR INT0_SUBR() {
  19.   unsigned long currentTime = millis();
  20.   if (currentTime - lastDebounceTimeA > debounceDelay) {
  21.     lastDebounceTimeA = currentTime;
  22.  
  23.     if (digitalRead(BCh) == LOW) {
  24.       pulse++;  // Impulzus növelése
  25.     } else {
  26.       pulse--;  // Impulzus csökkentése
  27.     }
  28.  
  29.     // Pulse határainak ellenőrzése
  30.     if (pulse < 0) {
  31.       pulse = 0;
  32.     }
  33.     if (pulse > 100) {  // Maximum impulzusok száma (100 impulzus)
  34.       pulse = 100;
  35.     }
  36.   }
  37. }
  38.  
  39. void IRAM_ATTR eINT0_SUBR() {
  40.   unsigned long currentTime = millis();
  41.   if (currentTime - lastDebounceTimeE > debounceDelay) {
  42.     lastDebounceTimeE = currentTime;
  43.  
  44.     if (digitalRead(eBCh) == LOW) {
  45.       e++;  // Impulzus növelése
  46.     } else {
  47.       e--;  // Impulzus csökkentése
  48.     }
  49.  
  50.     // e határainak ellenőrzése (0 és 6 között)
  51.     if (e < 0) {
  52.       e = 0;
  53.     }
  54.     if (e > 7) {
  55.       e = 7;
  56.     }
  57.  
  58.     // Felbontás beállítása az 'e' értéke alapján
  59.     if (e == 0) {RESOLUTION = 10;}
  60.     else if (e == 1) {RESOLUTION = 12;}
  61.     else if (e == 2) {RESOLUTION = 10;}
  62.     else if (e == 3) {RESOLUTION = 8;}
  63.     else if (e == 4) {RESOLUTION = 6;}
  64.     else if (e == 5) {RESOLUTION = 4;}
  65.     else if (e == 6) {RESOLUTION = 2;}
  66.     else if (e == 7) {RESOLUTION = 1;}
  67.   }
  68. }
  69.  
  70. void setup() {
  71.   Serial.begin(115200);
  72.   pinMode(ACh, INPUT_PULLUP);  // A bemeneteket felhúzzuk
  73.   pinMode(BCh, INPUT_PULLUP);
  74.   pinMode(eACh, INPUT_PULLUP);
  75.   pinMode(eBCh, INPUT_PULLUP);
  76.   attachInterrupt(digitalPinToInterrupt(ACh), INT0_SUBR, FALLING);  // Interrupt beállítása
  77.   attachInterrupt(digitalPinToInterrupt(eACh), eINT0_SUBR, FALLING);  // Második encoder interrupt beállítása
  78.  
  79.   // Kezdeti PWM beállítás
  80.   ledcSetup(PWMCh, 1, RESOLUTION);
  81.   ledcAttachPin(OUT, PWMCh);
  82.   ledcWrite(PWMCh, (pow(2, RESOLUTION) / 2));  // Állandó 50%-os kitöltési tényező
  83. }
  84.  
  85. void loop() {
  86.   // A frekvencia kiszámítása az 'e' értéke alapján
  87.   if (e == 0) { RESOLUTION = 10;
  88.     freq = map(pulse, 1, 100, 100, 100 * pow(1.066059666, pulse));
  89.   } else {
  90.     freq = pow(10, e) + (pow(10, e) * 0.09 * pulse);
  91.   }
  92.   if (freq > 40000000) {freq = 40000000;}
  93.   // Információk megjelenítése a soros monitoron
  94.   Serial.print("e: ");
  95.   Serial.print(e);
  96.   Serial.print("    RESOLUTION: ");
  97.   Serial.print(RESOLUTION);
  98.   Serial.print("    Frequency: ");
  99.   Serial.println(freq);
  100.  
  101.   // PWM frekvencia frissítése
  102.   ledcSetup(PWMCh, freq, RESOLUTION);  // A frekvenciát a 'freq' értékére állítjuk
  103.   ledcWrite(PWMCh, (pow(2, RESOLUTION) / 2));  // Állandó 50%-os kitöltési tényező
  104.  
  105.   delay(100);
  106. }
(#) scooby_ hozzászólása Szept 14, 2024 /
 
Sziasztok!
Kertült hozzám kettő processzor kártya. Az egyik tökéletesen működik, a másikat széthackelték. A bootloader mindekttőben ép maradt, U-Boot megy alatta, illetve Linux kernelt futtat saját firmwerrel.

Meg szeretném menteni a hackelt kártyát is, és valahogy a teljes kernelt cakkli-pakkli átdobni a működő kártyáról a hibás kártyára. A flash tartalmat SD kártyára bin fájlokba kimentettem, ezek megtvannak.
Partícionáltam egy másik SD kártyát és rámásoltam az uImaget (bin kiterjesztésben) a 2. partícióra (onnan várja) illetve a rootfs-t az eslő partícióra kicsomagolva a BIN-ből.

Viszont mikor kiadom a run sdboot parancsot (miután az u-bootot beállítottam) akkor mindig kernel panic-kal megáll és hiányolja az init fájlt.

Valaki tud esetleg ebben segíteni, hogy mi is lehet ez az init fájl, és hol találom?
Valahol olvastam, hogy ez összefüggésben lehet a busybox-szal, mert az fut alatta.
A hozzászólás módosítva: Szept 14, 2024
(#) vargham válasza scooby_ hozzászólására (») Szept 14, 2024 /
 
Szerintem erre a kérdésre nem az AVR mikrokontroller topikban találod meg a választ.
(#) scooby_ válasza vargham hozzászólására (») Szept 14, 2024 /
 
Azért tettem fel itt a kérdést, mert végül is egy AVR32-n fut, ez egy beágyazott linux AT32AP7001 kontrolleren. Ez kimaradt az előző hozzászólásomból.
A hozzászólás módosítva: Szept 14, 2024
(#) pipi válasza scooby_ hozzászólására (») Szept 14, 2024 /
 
Miért nem direkt szektor copy-t csináltál az sdkártyára?
Következő: »»   838 / 840
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem