Arduino: går det att ta reda på aktuell analog out?

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
FormerMazda
Inlägg: 6066
Blev medlem: 27 februari 2006, 14:59:36
Ort: Tranås (Jönköping)

Arduino: går det att ta reda på aktuell analog out?

Inlägg av FormerMazda »

Ny nöt att knäcka..

I mitt program så sätter jag flertalet analoga utgångar till lite olika värden, detta i olika funktioner och vid olika tillfällen.
Kort och gott, inget jag håller reda på i programmet så att säga.

Går det att på något vis få fram vad en analog UTgång har för värde?
Testat att helt enkelt göra en analogRead på samma pinne, men det verkar ju inte ge så bra svar..

Är inne på att i varje funktion som gör en analogWrite också spara värdet i en array, men det kändes inte snyggt.
Castor
Inlägg: 1981
Blev medlem: 24 mars 2012, 13:03:49

Re: Arduino: går det att ta reda på aktuell analog out?

Inlägg av Castor »

Pinnen kan ju påverkas av det som är anslutet, bli lastad för hårt tex, så att spara det man lägger ut (och vill ha) är väl det sätt man ska hantera börvärdet. Om man inte har det värdet på pinnen så får man väl åtgärda på något sätt.
Användarvisningsbild
Klas-Kenny
Inlägg: 11292
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Arduino: går det att ta reda på aktuell analog out?

Inlägg av Klas-Kenny »

Det går att läsa tillbaka, men tror inte det finns någon färdig funktion för det.
Kollar man i källkoden för analogWrite:
https://github.com/arduino/ArduinoCore- ... g_analog.c
Så ser man att värdet bara skrivs rakt in i ett timer-register. Det skulle absolut gå att läsa tillbaka därifrån. Kopiera analogWrite-funktionen och implementera den "baklänges" med hur det väljs vilket register som ska användas.

Vill man inte gå så långt är ju den enkla och mer eleganta lösningen är ju att skriva någon egen "wrapper" runt funktionen, typ en sån här fil:

Kod: Markera allt

int values[5];

void myAnalogWrite(uint8_t pin, int val) {
	values[pin] = val;
	
	analogWrite(pin,val);
}

int getAnalogOutVal(uint8_t pin) {
	return values[pin];
}
Och sen bara använda de funktionerna istället för den vanliga analogWrite. Så slipper du pilla in sparandet på varje ställe som sätter analogutgångarna.
Senast redigerad av Klas-Kenny 27 september 2020, 10:26:18, redigerad totalt 1 gång.
Användarvisningsbild
HUGGBÄVERN
Tidigare soundbrigade
Inlägg: 32628
Blev medlem: 23 augusti 2006, 22:44:11
Ort: Lilla Paris
Kontakt:

Re: Arduino: går det att ta reda på aktuell analog out?

Inlägg av HUGGBÄVERN »

Är inne på att i varje funktion som gör en analogWrite också spara värdet i en array, men det kändes inte snyggt.
Men det kanske ÄR snyggt ändå och helt enligt kaninbibeln. Jag skulle nog själv göra så för att inte hamna i värsta Londonsmogen.
FormerMazda
Inlägg: 6066
Blev medlem: 27 februari 2006, 14:59:36
Ort: Tranås (Jönköping)

Re: Arduino: går det att ta reda på aktuell analog out?

Inlägg av FormerMazda »

Det Klas-Kenny skriver gör mig lite sugen på att gå på djupet med den idén. Men samtidigt .. det är ju att göra vad jag ändå kommer få göra nu.
En wrapper överväger, då är det ju lättare att modda den i framtiden, skulle behovet uppstå. Men det betyder att vid en fade-funktion, alltså en for-loop med 256 steg så hoppar man dit 256 gånger och skriver om en variabel.
Så det slutar väl med att lägga in en rad efter varje _färdig_ analogWrite.

Exempel wrapper:

Kod: Markera allt

    for (int x = iMaxBright; x >= 0; x--){
      for (int i = 1; i <= iN; i++){
        MYanalogWrite(pinPWMN[7-i], x);
      }
      delayMicroseconds(iDelay);
    }
Exempel skriv när klar: (kräver väl dock att inte deklarera i och x i for-loopen)

Kod: Markera allt

    for (int x = iMaxBright; x >= 0; x--){
      for (int i = 1; i <= iN; i++){
        analogWrite(pinPWMN[7-i], x);
      }
      delayMicroseconds(iDelay);
    }
    PWMvalueN[7-i] = x;
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43149
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Arduino: går det att ta reda på aktuell analog out?

Inlägg av sodjan »

> Men det betyder att vid en fade-funktion...

... så gör du som idag, din egna funktion använder du bara då
du faktiskt behöver/vill spara värdet.
FormerMazda
Inlägg: 6066
Blev medlem: 27 februari 2006, 14:59:36
Ort: Tranås (Jönköping)

Re: Arduino: går det att ta reda på aktuell analog out?

Inlägg av FormerMazda »

Vilket jag vill efter varje fade-funktion också.
Men det ena utesluter ju inte det andra förstås, kan ju ha en kombo.
Användarvisningsbild
Klas-Kenny
Inlägg: 11292
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Arduino: går det att ta reda på aktuell analog out?

Inlägg av Klas-Kenny »

FormerMazda skrev: 27 september 2020, 10:41:33En wrapper överväger, då är det ju lättare att modda den i framtiden, skulle behovet uppstå. Men det betyder att vid en fade-funktion, alltså en for-loop med 256 steg så hoppar man dit 256 gånger och skriver om en variabel.
Lite nyfiken, vad gör det egentligen? :)
I exemplen har du ju ändå bara "dum" delay där inget vettigt görs efter varje skrivning. Vad spelar det för roll om ett par extra instruktioner körs för att spara en variabel varje gång?
FormerMazda
Inlägg: 6066
Blev medlem: 27 februari 2006, 14:59:36
Ort: Tranås (Jönköping)

Re: Arduino: går det att ta reda på aktuell analog out?

Inlägg av FormerMazda »

Det är nog grejen med mig, det gör nog inget.
Jag har bara en defekt som vill tänka på att inte göra saker i onödan, detta trots att jag inte är intresserad av assembler eller liknande utan trivs jättebra med högnivåspråken.
Så med tanke på vad jag försöker åstadkomma så spelar det nog ingen roll.

Jaa.. Kanske är den vägen att ta ändå då.
Pebert
Inlägg: 95
Blev medlem: 5 september 2020, 19:19:48

Re: Arduino: går det att ta reda på aktuell analog out?

Inlägg av Pebert »

Om det är noga att veta vad det faktiska värdet är, gör en feedbackloop och läs med en analog in.
FormerMazda
Inlägg: 6066
Blev medlem: 27 februari 2006, 14:59:36
Ort: Tranås (Jönköping)

Re: Arduino: går det att ta reda på aktuell analog out?

Inlägg av FormerMazda »

Det som är noga är inte faktiska värdet på så vis, men jag har en del kanske lite klumpiga rutiner som ska fadea en kanal i tag, säg från tänt till släckt.
Då om nån kanal redan är släckt så tänds ju den, och sen fadeas ner.
Så i den rutinen vill jag kunna kolla om kanalen redan är släckt, eller i nåt annat värde än 100% (eller ja, vad nu iMaxBright är).

Men att spara undan vid varje analogWrite blir ju melodin här.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43149
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Arduino: går det att ta reda på aktuell analog out?

Inlägg av sodjan »

Men, som någon annan tidigare sa, processorn måste ju redan ha det aktuella värdet någonstans.
Kanske onödigt att skapa en egen variabel om man kan hitta var det är lagrat...
FormerMazda
Inlägg: 6066
Blev medlem: 27 februari 2006, 14:59:36
Ort: Tranås (Jönköping)

Re: Arduino: går det att ta reda på aktuell analog out?

Inlägg av FormerMazda »

Ja det tycker jag också.
Men enda sättet som jag hintats om än är ju det Klas-Kenny skrev, att modda källkoden. Vilket inte lockar.
Det borde ju finnas i nåt register eller nåt nånstans som man kan peeka på eller så. Men där är jag lååångt utanför mina kunskaper.
Användarvisningsbild
Klas-Kenny
Inlägg: 11292
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Arduino: går det att ta reda på aktuell analog out?

Inlägg av Klas-Kenny »

Alltså du behöver ju inte modda källkoden för att göra på det sättet.
Bara kopiera den och skapa din egen funktion.

Kopiera och byt alla skrivningar av register till läsningar, ungefär.
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4689
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: Arduino: går det att ta reda på aktuell analog out?

Inlägg av Swech »

"I mitt program så sätter jag flertalet analoga utgångar till lite olika värden, detta i olika funktioner och vid olika tillfällen.
Kort och gott, inget jag håller reda på i programmet så att säga."

Det där är ett recept på program som blir buggigt och oerhört svårt att felsöka.
Du behöver en array med analog ut värden, En enda rutin skall vara ansvarig för att
flytta dessa värden från arrayen till analog ut med jämna intervall t.ex. 50 gånger / sekund.
Alla andra rutiner jobbar mot arrayen och inte direkt mot analog ut.

Grundprincipen för stabila program är att merparten av dina funktioner inte vet hur hårdvaran ser ut utan jobbar mot
en virtuell processor. Några få funktioner översätter och ser till att värdena hamnar på rätt pinnar/ portar.

Swech
Skriv svar