Fórum témák

» Több friss téma
Fórum » Arduino
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Lapozás: OK   292 / 864
(#) jeges válasza kapu48 hozzászólására (») Nov 20, 2016 /
 
Akkor ehhez kell Optiboot bootloader cserélni ami tudja kezelni a wdt?
(#) kapu48 válasza jeges hozzászólására (») Nov 20, 2016 /
 
Próbáldki!:
  1. #include <avr/wdt.h>
  2. uint8_t res = 0;
  3. /*
  4. Threshold value  Constant name Supported on
  5. 15 ms   WDTO_15MS ATMega 8, 168, 328, 1280, 2560
  6. 30 ms   WDTO_30MS ATMega 8, 168, 328, 1280, 2560
  7. 60 ms   WDTO_60MS ATMega 8, 168, 328, 1280, 2560
  8. 120 ms  WDTO_120MS  ATMega 8, 168, 328, 1280, 2560
  9. 250 ms  WDTO_250MS  ATMega 8, 168, 328, 1280, 2560
  10. 500 ms  WDTO_500MS  ATMega 8, 168, 328, 1280, 2560
  11. 1 s   WDTO_1S ATMega 8, 168, 328, 1280, 2560
  12. 2 s   WDTO_2S ATMega 8, 168, 328, 1280, 2560
  13. 4 s   WDTO_4S ATMega 168, 328, 1280, 2560
  14. 8 s   WDTO_8S ATMega 168, 328, 1280, 2560
  15. */
  16. void setup() {
  17.   // put your setup code here, to run once:
  18.   wdt_enable(WDTO_500MS); // ujraindul 500ms mulva
  19. }
  20.  
  21. void loop() {
  22.   // put your main code here, to run repeatedly:
  23.   // vagy:
  24.   res = 1;  // Wachdog Reset aktiwállása
  25.   if(res == 1) wdt_enable(WDTO_15MS); // ujraindul minden 15ms mulva
  26.   // lekapcsolja:
  27.   wdt_disable();
  28.  
  29.   // WDT timert ujra inditja:
  30.   wdt_reset();
  31. }
A hozzászólás módosítva: Nov 20, 2016
(#) morgo hozzászólása Nov 21, 2016 /
 
Sziasztok!
Az a problémám, hogy ha elindítok egy szervótesztert, utána nem tudom leállítani. Egy arduban kéne lenni a szervóteszternek, és egy frekimérőnek. Ha a frekimérő van először indítva, semmi probléma mindaddig, amíg a szervós progi nem futott. Viszont a szervóteszter használata után megzavarodik a frekimérő, csak a reset segít. Próbálkoztam leállítani, de a myservo.detach() nem segít. Teljesen mindegy milyen a pin konfiguráció, sehogy sem bírok vele.
Ki lehet ezt lőni valahogy reset nélkül?
(#) kapu48 válasza morgo hozzászólására (») Nov 21, 2016 /
 
És gondolod, hogy ebből a pár sor panaszkodásból mi hozzá tudunk szólni a témához?

Feltételezem, hogy a szervót az ardutól független tápról hajtod, és mindenűt ott vannak a szűrő kondik ahol kel?
Akkor!
Ha esetleg látnánk a programot, talán?

Lehet, hogy ugyanazt a timert használja mindkét rutin?
Akkor mindig újra kellene inicializálni, mikor rutint váltasz.
A hozzászólás módosítva: Nov 21, 2016
(#) morgo válasza kapu48 hozzászólására (») Nov 21, 2016 /
 
Nem külső zavar okozza, mert ha semmi nincs rákötve akkor is ez a helyzet.
Az viszont elképzelhető, hogy ugyanazt a timert használja mindkettő.
De inkább felteszem a kódot.

  1. /*
  2.     LCD pin: A4,A5 (0,1,2,3,4,6)
  3.    Frekimérő bemenet: 5,
  4.    Szervó kimenet: 9,
  5.    Szervó led: 12,
  6.    ledPin4: 13,
  7.    Poti : A0,
  8.    buttonPin: 11,
  9. */
  10. #include <FreqCount.h>
  11. #include <PWMServo.h>
  12. #include <elapsedMillis.h>
  13. #include <LiquidCrystal_I2C.h>
  14. LiquidCrystal_I2C lcd(0x38);
  15. //#include <LiquidCrystal .h>
  16. //LiquidCrystal lcd(0,1,2,3,4,6);
  17. elapsedMillis timeElapsed;      //időzítések
  18. unsigned int interval = 1000;   //időzítések
  19. int input = 5;                  //frekimérő
  20. //Szervo/////////////////////////////////////////////////////////
  21. int ledPin4 = 12;
  22. int potpin = A7;
  23. int val;
  24. int servoinput = 9;
  25. float high_time;
  26. PWMServo myservo;
  27. //Gomb kezelés/////////////////////////////////////////////////////
  28. const int buttonPin = 11;  
  29. const int ledPin = 13;
  30. int ledState = LOW;
  31. int buttonState;
  32. int lastButtonState = HIGH;
  33. long lastDebounceTime = 0;
  34. long debounceDelay = 10;
  35.  
  36. ///////////////////////////////////////////////////////////////////
  37. void setup() {
  38.   lcd.begin(16, 2);
  39.   delay(30);
  40.   FreqCount.begin(1000);
  41.   pinMode(buttonPin, INPUT);
  42.   pinMode(ledPin, OUTPUT);
  43.   pinMode(ledPin4, OUTPUT);
  44.   lcd.setCursor(0, 0);  lcd.print("MORGOELEKTRONIKA");
  45.  
  46. }
  47. ///////////////////////////////////////////////////////////////////
  48. void loop() {
  49.   //Gomb kezelés/////////////////////////////////////////////////////
  50.   {
  51.     int reading = digitalRead(buttonPin);
  52.     if (reading != lastButtonState) {
  53.       lastDebounceTime = millis();
  54.     }
  55.     if ((millis() - lastDebounceTime) > debounceDelay) {
  56.       if (reading != buttonState) {
  57.         buttonState = reading;
  58.         if (buttonState == LOW) {
  59.           ledState = !ledState;
  60.         }
  61.       }
  62.     }
  63.     digitalWrite(ledPin, ledState);
  64.     lastButtonState = reading;
  65.   }
  66.   //frekimérő///////////////////////////////////////////////////////
  67.   ledState = digitalRead (ledPin);
  68.   if (ledState == LOW) {
  69.     digitalWrite (ledPin4, LOW);
  70.     if (timeElapsed > interval) {
  71.       if (FreqCount.available()) {
  72.         unsigned long count = FreqCount.read();
  73.         long number = count * 10.0007;
  74.         {
  75.           lcd.clear();
  76.           lcd.setCursor(1, 0);
  77.           lcd.print("Frequency meter");
  78.           lcd.setCursor(1, 1);
  79.           int numb1 = (int) (number / 1000000L);
  80.           if (numb1 < 10)
  81.             lcd.print("00");
  82.           else if (numb1 <= 99 && numb1 > 9)
  83.             lcd.print("0");
  84.           lcd.print(numb1);
  85.           lcd.setCursor(4, 1);
  86.           lcd.print(".");
  87.           int numb2 = (int) ((number - numb1 * 1000000L) / 1000L);
  88.           if (numb2 < 10)
  89.             lcd.print("00");
  90.           else if (numb2 <= 99 && numb2 > 9)
  91.             lcd.print("0");
  92.           lcd.print(numb2);
  93.           lcd.setCursor(8, 1);
  94.           lcd.print(".");
  95.           int numb3 = (int) ((number - numb1 * 1000000L - numb2 * 1000L));
  96.           if (numb3 < 10)
  97.             lcd.print("00");
  98.           else if (numb3 <= 99 && numb3 > 9)
  99.             lcd.print("0");
  100.           lcd.print(numb3);
  101.           lcd.print(" Hz");
  102.         }
  103.         timeElapsed = 500;
  104.       }
  105.     }
  106.   }
  107.   //szervóteszter/////////////////////////////////////////////////////////////////////
  108.   if (ledState == HIGH) {
  109.     myservo.attach((SERVO_PIN_A));
  110.     if (timeElapsed > interval) {
  111.       val = analogRead(potpin);
  112.       val = map(val, 0, 1023, 0, 190);
  113.       myservo.write(val);
  114.       high_time = pulseIn(servoinput, HIGH);
  115.       lcd.clear();
  116.       lcd.setCursor(2, 0); lcd.print("SERVO TESTER");
  117.       lcd.setCursor(1, 1); lcd.print(high_time / 1000);
  118.       lcd.setCursor(5, 1); lcd.print("  millisec");
  119.       if (high_time < 1550 && high_time > 1450) {
  120.         digitalWrite(ledPin4, HIGH);
  121.       }
  122.       else {
  123.         digitalWrite(ledPin4, LOW);
  124.       }
  125.       timeElapsed = 500;
  126.     }
  127.   }
  128. }
A hozzászólás módosítva: Nov 21, 2016
(#) kapu48 válasza morgo hozzászólására (») Nov 21, 2016 /
 
A <PWMServo.h> -t nem találtam meg!
De tudva, hogy mindössze 3 timer van az UC-ben, és mindkét rutin időzítéseket használ.

Ezért maradok az első gondolatomnál, hogy a szervó PWM elrontja a frekimérő timer,
esetleg még a megszakítás isr beállításait is?
  1. void FreqCountClass::begin(uint16_t msec)
  2. {
  3.         if (msec < 10) return;
  4.         gate_index = 0;
  5.         count_msw = 0;
  6.         count_prev = 0;
  7.         count_ready = 0;
  8.         counter_init();  ????
  9.         gate_length = timer_init(msec); ?????
  10.         uint8_t status = SREG;
  11.         cli();
  12.         timer_start(); ???
  13.         timer_isr_latency_delay();  ????
  14.         counter_start();
  15.         SREG = status;
  16. }


Ezért javaslom a kód kiegészítését:
  1. ...
  2. //szervóteszter/////////////////////////////////////////////////////////////////////
  3. FreqCount.begin(1000);
  4.   if (ledState == HIGH) {
  5.     myservo.attach((SERVO_PIN_A));
  6. ...
A hozzászólás módosítva: Nov 21, 2016
(#) morgo válasza kapu48 hozzászólására (») Nov 21, 2016 /
 
Már ezt próbáltam, de így el sem indul a frekimérő. Az Arduino oldalán is megtalálható Servo.h, meg egy másik (VarSpeedServo) is lett próbálva, ugyanaz a helyzet. Ha nem jutok előrébb, marad a reset gomb. Délelőtt megpróbáltam az automata reset kódodat is beilleszteni, az lett a vége, hogy ISP teljes törlés, bootloader újratelepítés.
A hozzászólás módosítva: Nov 21, 2016
(#) kapu48 válasza morgo hozzászólására (») Nov 21, 2016 /
 
Ha 1/1-ben úgy próbáltad, ahogyan ott gyorsan felvázoltam a lehetőségeket?
Az alkalmazott project ismerete nélkül. Akkor nem is csodálkozom!
(#) jeges válasza kapu48 hozzászólására (») Nov 21, 2016 /
 
köszönöm a példát!
sajnos nem müködik !
Ennek valami olyasmit kellene produkálni mind ha reset gombot nyomkodnám UNO be nyomás után fel villana 13 pin ledje de semmi ilyesmi nem történik....
(#) kapu48 válasza morgo hozzászólására (») Nov 21, 2016 /
 
Sajnos nem sok időm van mostanában!

Ami feltűnt, hogy hiányzik a gombnyomásra váró ciklus szervezése!
A zárójelek {...} magukban még nem érnek semmit:
  1. .....
  2.   //Gomb kezelés/////////////////////////////////////////////////////
  3. Várni kellene valami ciklussal a gombnyomásra?????????
  4.   {
  5.     int reading = digitalRead(buttonPin);
  6.     if (reading != lastButtonState) {
  7.       lastDebounceTime = millis();
  8.     }
  9.     if ((millis() - lastDebounceTime) > debounceDelay) {
  10.       if (reading != buttonState) {
  11.         buttonState = reading;
  12.         if (buttonState == LOW) {
  13.           ledState = !ledState;
  14.         }
  15.       }
  16.     }
  17.     digitalWrite(ledPin, ledState);
  18.     lastButtonState = reading;
  19.   } ?????????
  20.   //frekimérő///////////////////////////////////////////////////////
  21.  ....


Igy sosem váltasz a végrehajtandó if(ágak között!)
A hozzászólás módosítva: Nov 21, 2016
(#) kapu48 válasza jeges hozzászólására (») Nov 22, 2016 /
 
Én csak a linken levő lehetőségeket vázoltam fel (Nem pedig működő programot!):
Bővebben: Link
Ezt kellene értelmezni és alkalmazni!
(#) kitartás hozzászólása Nov 22, 2016 /
 
Sziasztok. Küzdenék az arduinoval ubuntu linuxon. A windowsos verzióhoz képes nálam több menüpont is hiányzik. Pl a beállítások alatt a Additional Boards Manager URLs , eszközök->alappanel alatt nincs alappanel hozzáadás. Elméletileg a legfrissebb verziót raktam fe (1.6.12). Valamit rosszul csinálok, vagy tényleg különbözik a wines és a linuxos verzió. (próbáltam rootként is indítani)
(#) mateatek válasza kitartás hozzászólására (») Nov 22, 2016 /
 
A Linuxos, és a Win-es verzió különbözik egymástól. Pontosan nem tudom, hogy mikben, egyszer láttam Win-es verziót működni, de rögtön láttam, hogy nem ugyan olyanok.
(#) kitartás válasza mateatek hozzászólására (») Nov 22, 2016 /
 
Köszi. Akkor már csak az lenne a kérdés, hogy reszeljem bele mondjuk az esp modult. Amit a gugli haverunknál találtam roppant egyszerű, de mind a windowsos verziót mutatja. (lehet rossz helyen kerestem)
A hozzászólás módosítva: Nov 22, 2016
(#) morgo válasza kapu48 hozzászólására (») Nov 22, 2016 /
 
A gombnyomás érzékelésével semmi gondom. A timer akadhat ki. Fixen 3,276,xxx értéket mutat, ha már futott a szervóteszter. Üres frekimérő bemenettel is, meg akkor is ha bármilyen frekvenciájú generátort rákapcsolok.
A reset beépítésekor úgy próbálkoztam, hogy a loopba raktam a disable-t, a szervóteszterbe a wdt_reset-et, a frekimérőbe pedig az indítást. Úgy, hogy a feltételként lastledState==HIGH szerepelt. Tehát az volt az elgondolásom, hogy amikor feláll az ardu, első körben tiltja a wdt-t, elindul a frekimérés, hiányzik a feltétel, mert nem volt előző magas led állapot. Ha már futott a szervó, akkor teljesül a lastledState ==HIGH, és csinál egy resetet. Valamit benézhettem...
Ha bárhová berakom a loopba a frekvenciaszámláló újrainicializálását, akkor el sem indul semmi a setup után.
(#) bujan hozzászólása Nov 22, 2016 /
 
Tisztelt Fórumozók!
Másfél éve foglalkozom Arduino-val az alaptanfolyam elvégzése után. Most egy olyan dologban kérném a segítségeteket, amin én már hetek óta dolgozom, de nem tudtam megoldani. Több szem többet lát, tapasztaltabb többet tud.
Van egy programom, melyben a 6 PWM kimeneten lévő ledeken léptetéssel be tudom állítani mindegyiken egy saját fényerőt többször is, ha újra oda léptetem. A led számát és fényerejét kiíratom egy LCD-re vagy PC-re. A végeredményt beíratom az EEPROM-ba, így kikapcsolás után is megmaradnak a beállítások. Bekapcsoláskor rendben visszaállítja a kikapcsolás előtti állapotot. A probléma a következő: ha újraindítás után meg akarom változtatni a korábbi elmentett fényerőket és elkezdem léptetni a számlálót, akkor először mindig először nullára állítja az aktuális ledet és nem az elmentettől folytatja.
A mellékelt program egy kijelzés nélküli és kettő ledre lerövidített, de ez is úgy működik, ahogy nem szeretném.
Ha segít valaki a megoldásban, előre is köszönöm.
  1. #include <EEPROM.h>
  2. int pulses;
  3. int brightness1;
  4. int brightness2;
  5. void setup() {
  6. attachInterrupt(0, countpulses, RISING); // Button on digital pin 2
  7. pinMode(A1,INPUT);  // Button brightness DOWN, PullDown
  8. pinMode(A2,INPUT);  // Button brightness UP, PullDown
  9. pinMode(3,OUTPUT);  // LED1
  10. pinMode(5,OUTPUT);  // LED2
  11. }
  12. void loop() {
  13. analogWrite(3, EEPROM.read(0));
  14. analogWrite(5, EEPROM.read(1));
  15. if (pulses == 1) {
  16. if(digitalRead(A1) == HIGH) brightness1 -=5;
  17. if(brightness1 < 0) brightness1 = 0;
  18. if(digitalRead(A2) == HIGH) brightness1 +=5;
  19. if(brightness1 > 255) brightness1 = 255;
  20. analogWrite(3, map(brightness1, 0, 255, 0, 100));
  21. EEPROM.write(0, map(brightness1, 0, 255, 0, 100));
  22. delay(500);    
  23. }
  24. if (pulses == 2) {
  25. if(digitalRead(A1) == HIGH) brightness2 -=5;
  26. if(brightness2 < 0) brightness2 = 0;
  27. if(digitalRead(A2) == HIGH) brightness2 +=5;
  28. if(brightness2 > 255) brightness2 = 255;
  29. analogWrite(5, map(brightness2, 0, 255, 0, 100));
  30. EEPROM.write(1, map(brightness2, 0, 255, 0, 100));
  31. delay(500);  
  32. }
  33. }
  34. void countpulses() {
  35.   pulses++;
  36.   if(pulses >= 3)
  37.    pulses=1;
  38. }
(#) (Felhasználó 120038) válasza bujan hozzászólására (») Nov 22, 2016 /
 
Csak Totózok:

volatile int pulses;
A hozzászólás módosítva: Nov 22, 2016
(#) (Felhasználó 120038) válasza bujan hozzászólására (») Nov 22, 2016 /
 
Szia!

Amit küldtem az kell bele, de nem elég. A setup-ban kell kiolvasni az eepromból az elmentett értéket. Ha nem teszed, akkor az pulses változód 0 lesz, Azaz azt is el kell menteni, majd a setupban (ami az induláskor ELSŐRE fut le, ki kell olvasni.)
(#) kistee hozzászólása Nov 22, 2016 /
 
Sziasztok!

Most kezdek Arduino-zni, vettem egy UNO-t (ezt) és egy szűz ATMega328-ast (ezt).

Ott akadtam el, hogy nem tudom a "szűz" 328-ast felprogramozni. Olvastam a honlapon, hogyan lehet az UNO-t ISP-ként használni úgy, hogy a cél MCU próbapanelben van. Be is kötöttem úgy, követtem a leírást és hibaüzenetet kaptam. Valami fuse biteket emleget...

- hol tudom állítani a fuse biteket?
- hogyan tudom a bootloadert beégetni a szűz 328-asba?
- ha benne lesz a bootloader, akkor be tudom tenni az UNO-ban lévő 328-as helyére és ugyanúgy tudom használni?

Eddig PIC-kel foglalkoztam, azzal valahogy könnyebb volt elindulni...
(#) kapu48 válasza morgo hozzászólására (») Nov 22, 2016 /
 
Nem jó a gombkezelés rutinod!

De OK!
Én nem vitatkozok veled!
(#) (Felhasználó 120038) válasza bujan hozzászólására (») Nov 22, 2016 /
 
Valamint az sem egészséges, ha 500 ms-onként írsz az EEpromba, nem fogja sokáig bírni.
(#) Medve válasza kistee hozzászólására (») Nov 22, 2016 /
 
Szia.
- hol tudom állítani a fuse biteket?
Szűz arduino esetében nem kell foglalkoznod a fuse bitekkel, kezdő szinten az arduinoban sem.
- hogyan tudom a bootloadert beégetni a szűz 328-asba?
Én a honlapján lévő egyik példát követtem, egy UNO-ba beleégettem az ISP programozót, és rádrótoztam a szüzet. Hibaüzenet jött, de a bootloader benne volt.
- ha benne lesz a bootloader, akkor be tudom tenni az UNO-ban lévő 328-as helyére... Igen.
(#) kistee válasza Medve hozzászólására (») Nov 22, 2016 /
 
Kösz a válaszokat! Időközben tovább kutakodtam a neten és találtam egy részletesebb leírást, ami alapján sikerült egy led-villogtatót beletuszkolnom a szűz 328-asba. Tettem mellé kvarcot, 22 pF-ekkel és 10 kohm-ot a reset lábra a táp felé. Eddig csak simán "feltöltés"-sel próbálkoztam, de a "feltöltés programozóval" kellett volna.

A bootloader látszólag belement, de ha betettem az eredeti helyére, akkor nem tudtam programot tölteni bele. Mit rontottam el?
(#) Medve válasza kistee hozzászólására (») Nov 22, 2016 /
 
Egy a lényeg, a bootloadernek ott kell lennie, a "bootloader égetése" menüponttal tedd bele...
(#) kistee válasza Medve hozzászólására (») Nov 22, 2016 /
 
Ok, kösz. Tovább próbálkozom...
(#) jeges válasza kapu48 hozzászólására (») Nov 22, 2016 /
 
Én kérdeztem amit nem értek valaki hátha alkalmazot már valami hasonlot és igy rávetetél a wdt témára és keresgéltem kapcsolatban de bootloader firmware nem kezeli valamiért ez a legföbb probléma több felsorolt tipusoknál sem igy továbra is nem lehet használni....
(#) bujan válasza (Felhasználó 120038) hozzászólására (») Nov 22, 2016 /
 
Köszönöm a pozitív hozzáállásod és a segítséget, de sajnos a helyzet nem változott. Az EEPROM-ba írást majd a EEPRM.get funkcióval írom, igy csak változáskor ír az EEPROM-ba.
(#) jeges válasza kistee hozzászólására (») Nov 22, 2016 /
 
https://www.arduino.cc/en/Tutorial/ArduinoISP
Fuse biteket ne piszkáld arduino ide tudja melyik procihoz milyen beálitás tartozik csak a listábol kell válaztani mit akarsz felprogramozni......
ha nem sikerül segitek utba igazitani!
(#) Medve válasza jeges hozzászólására (») Nov 22, 2016 /
 
Erről beszéltem, a jobb oldali legalsó megoldást használtam.
(#) kistee válasza Medve hozzászólására (») Nov 22, 2016 /
 
Én is...
Következő: »»   292 / 864
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