Spørsmål:
Arduino Leonardo timing Uoverensstemmelse
Karoly S
2014-07-10 00:42:51 UTC
view on stackexchange narkive permalink

Jeg har et spørsmål angående bruken av Millis () på en Leonardo Arduino. Jeg bruker den for tiden til å gå 4 sekunder mens jeg sender en seriell melding hvert sekund. Disse meldingene spiller av en lyd. På den fjerde meldingen er lyden annerledes for å betegne at Arduino har startet en begivenhet.

Jeg støter på et problem der lydene av og til spilles sporadisk uten et jevnt 1 sekund mellom dem. Jeg lurer på om det er en bedre måte å gjøre det jeg gjør? Under timingen gjør Arduino ingenting annet, og mottakermaskinen gjør heller ikke noe skatt. Er dette til og med et problem fra Arduino-siden? Mitt mottaksprogram er skrevet i C # ved hjelp av System.IO.Ports.SerialPort.

Årsaken til at dette gjøres gjennom Arduino er fordi arrangementet startet av Arduino må tilsvare nøyaktig lydene, men hvis dette ikke er løst, må jeg bearbeide dette.

Rediger: Kode etter ønske.

  ugyldig oppsett () {// Oppsettkode} ugyldig sløyfe () {// Kode som håndterer andre seriemeldinger og forskjellige tilstander hvis (isSpecificState == true) onSpecificState ();} ugyldig onSpecificState () {// Oppsett for å håndtere tilstand lang holdStart = millis (); langt holdVarighet = 0; boolsk print1 = falsk; boolsk print2 = falsk; boolsk print3 = falsk; boolsk print4 = falsk; while (holdDuration < = 4000) {if (holdDuration > = 4000 &&! print4) {Serial.println ("tt_sound: 2"); print4 = sant; } annet hvis (holdDuration > = 3000 &&! print3) {Serial.println ("tt_sound: 1"); print3 = sann; } annet hvis (holdDuration > = 2000 &&! print2) {Serial.println ("tt_sound: 1"); print2 = sann; }
annet hvis (holdDuration > = 1000 &&! print1) {Serial.println ("tt_sound: 1"); print1 = sann; } holdDuration = millis () - holdStart; } // Håndteringsstatus}  

Som jeg nevnte i kommentarene, gjør Arduino ingenting annet mens timingen skjer.

Kan du legge ut Arduino-koden slik at vi ser om det er et problem der inne?
Hvorfor nedstemningen? @jfpoilpret-koden er oppe, men det er smertefullt enkelt.
Lagt til avklaring, årsaken til at jeg ikke la ut koden i utgangspunktet, er at den fungerer 95% av tiden feilfritt. Det er imidlertid anledninger forårsaket av omstendigheter jeg ikke har funnet ut hvor lydene er av. Dette er det jeg trenger hjelp med.
Hvorfor ikke bruke en annen tidtaker til å planlegge dem?
Har du prøvd å skrive ut verdien for holdDuration og se om den er konsistent?
Bare for å avklare: Jeg nedstemte ikke spørsmålet ditt. Om koden din tviler jeg på at du alltid sender inn den første `hvis`, vanligvis den første` hvis` skal være plassert ** etter ** mens`-løkken. Viktig spørsmål: hva er typene `holdDuration` og` holdStart`?
@IgnacioVazquez-Abrams Kunne du utdype det? Jeg er ikke sikker på at jeg forstår. @Craig Jeg har ikke, jeg har ikke vært i stand til å gjengi problemet konsekvent. @jfpoilpret Mente ikke å antyde at du hadde, var et åpent spørsmål :) Både 'holdDuration' og 'holdStart' er av typen 'lang', samme som 'millis ()' returtype.
Jeg tror `millis ()` faktisk er `usignert lang`, men det er sannsynligvis ikke problemet med mindre du kjører i mer enn 24 dager.
Vennligst legg ut hele koden, ikke bare den delen som jeg antar er inne i 'loop' -funksjonen.
Alt jeg kan si er at jeg ikke forstår hva du mener, fordi du ikke ga et reproduserbart eksempel.
Legg merke til punkt 2 og 3 i dette svaret: http://electronics.stackexchange.com/a/126063/8627 Det kan hende du kan finne ut om dette er problemet ved å deaktivere USB-kommunikasjon og bytte til UART kombinert med en UART-til -USB-kabel.
To svar:
jippie
2014-08-17 19:00:52 UTC
view on stackexchange narkive permalink

Det er bare en veldig liten sjanse for at du oppfyller holdDuration > = 4000 -tilstanden i mens sløyfen. Bare når holdDuration vil være nøyaktig 4000, blir while-loop utført OG den påfølgende testen i if-setningen vil bestå.

De serielle utskriftskommandoer kan lett ta lang tid til å ha millis () kode> hopp fra et tall mindre enn 4000 til et tall som er høyere enn 4000 i en enkelt passering av mens sløyfen er.

For å bevise denne antagelsen, øk mens testen til holdDuration < = 4100 kode> og se om den intermitterende effekten forsvinner.

Karoly S
2014-08-19 02:31:25 UTC
view on stackexchange narkive permalink

Tanker: Jeg har dessverre ikke klart å komme til bunns i dette problemet. Jeg la merke til at problemet har en tendens til å skje første gang interaksjonen starter etter at datamaskinen og Arduino er inaktiv.

Uten å vite for mye om hvordan seriekommunikasjonen er bygget, gjetter jeg at uten trafikk blir forbindelsen satt i dvale, eller generelt inaktiv, og lydforsinkelsen er et resultat av at tilkoblingen trenger å initialisere eller noe av den typen. Jeg kan ikke huske en tid da problemet oppstod, og jeg hadde en nylig korrekt tidligere interaksjon. Når det fungerer, vil enhver umiddelbar prøveversjon også oppføre seg riktig.

Løsning: Jeg har siden flyttet min timing / lydavspillingskomponent i C # -appen min. Arduino signaliserer nå timeren, og deretter slutten på timeren med en umiddelbar start på arrangementet mitt.



Denne spørsmålet ble automatisk oversatt fra engelsk.Det opprinnelige innholdet er tilgjengelig på stackexchange, som vi takker for cc by-sa 3.0-lisensen den distribueres under.
Loading...