Arduino: går det att ta reda på aktuell analog out?
-
- Inlägg: 6076
- 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?
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.
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.
Re: Arduino: går det att ta reda på aktuell analog out?
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.
- Klas-Kenny
- Inlägg: 11328
- Blev medlem: 17 maj 2010, 19:06:14
- Ort: Växjö/Alvesta
Re: Arduino: går det att ta reda på aktuell analog out?
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:
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.
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];
}
Senast redigerad av Klas-Kenny 27 september 2020, 10:26:18, redigerad totalt 1 gång.
- HUGGBÄVERN
- Tidigare soundbrigade
- Inlägg: 32735
- Blev medlem: 23 augusti 2006, 22:44:11
- Ort: Lilla Paris
- Kontakt:
Re: Arduino: går det att ta reda på aktuell analog out?
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.Ä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.
-
- Inlägg: 6076
- 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?
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:
Exempel skriv när klar: (kräver väl dock att inte deklarera i och x i for-loopen)
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);
}
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;
Re: Arduino: går det att ta reda på aktuell analog out?
> 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.
... så gör du som idag, din egna funktion använder du bara då
du faktiskt behöver/vill spara värdet.
-
- Inlägg: 6076
- 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?
Vilket jag vill efter varje fade-funktion också.
Men det ena utesluter ju inte det andra förstås, kan ju ha en kombo.
Men det ena utesluter ju inte det andra förstås, kan ju ha en kombo.
- Klas-Kenny
- Inlägg: 11328
- Blev medlem: 17 maj 2010, 19:06:14
- Ort: Växjö/Alvesta
Re: Arduino: går det att ta reda på aktuell analog out?
Lite nyfiken, vad gör det egentligen?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.
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?
-
- Inlägg: 6076
- 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?
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å.
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å.
Re: Arduino: går det att ta reda på aktuell analog out?
Om det är noga att veta vad det faktiska värdet är, gör en feedbackloop och läs med en analog in.
-
- Inlägg: 6076
- 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?
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.
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.
Re: Arduino: går det att ta reda på aktuell analog out?
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...
Kanske onödigt att skapa en egen variabel om man kan hitta var det är lagrat...
-
- Inlägg: 6076
- 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?
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.
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.
- Klas-Kenny
- Inlägg: 11328
- Blev medlem: 17 maj 2010, 19:06:14
- Ort: Växjö/Alvesta
Re: Arduino: går det att ta reda på aktuell analog out?
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.
Bara kopiera den och skapa din egen funktion.
Kopiera och byt alla skrivningar av register till läsningar, ungefär.
- Swech
- EF Sponsor
- Inlägg: 4693
- 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?
"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
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