Bra sleepmode kod till UNO?

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Bra sleepmode kod till UNO?

Inlägg av fosfor »

Hej! :)

Har någon nåt bra tips på en kod som försätter UNO i strömsnålt viloläge efter en viss tid?
Och kan startas upp med en eller två knappar. :humm:

Mvh U
Användarvisningsbild
tecno
Inlägg: 27022
Blev medlem: 6 september 2004, 17:34:45
Skype: tecnobs
Ort: Sparreholm, Södermanland N 59° 4.134', E 16° 49.743'
Kontakt:

Re: Bra sleepmode kod till UNO?

Inlägg av tecno »

:humm:

Försöker du ens att göra en enkel Google sökning?

https://playground.arduino.cc/Learning/ArduinoSleepCode
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Bra sleepmode kod till UNO?

Inlägg av fosfor »

Problemet jag har med Arduinos exempel
är att mina enda 2 interrupts på UNO är upptagna av motor med rotaryencoder.

Finns det någon väg kring detta på en UNO?
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Bra sleepmode kod till UNO?

Inlägg av lillahuset »

Min första tanke är: Varför behöver du två interrupt till en rotary encoder? Låter ganska exotiskt.

Min andra tanke är: Nog för att Atmega 328 är en halvantik åttabittare men nog bord den ha fler än två externa interrupt. Och det har den, pin change på 23 I/O-pinnar.
Användarvisningsbild
ffredrik
Inlägg: 340
Blev medlem: 20 oktober 2009, 17:52:18
Ort: Göinge

Re: Bra sleepmode kod till UNO?

Inlägg av ffredrik »

Läs gärna Atmels datablad.
SeniorLemuren
Inlägg: 7779
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Bra sleepmode kod till UNO?

Inlägg av SeniorLemuren »

lillahuset skrev:Min första tanke är: Varför behöver du två interrupt till en rotary encoder? Låter ganska exotiskt.

Min andra tanke är: Nog för att Atmega 328 är en halvantik åttabittare men nog bord den ha fler än två externa interrupt. Och det har den, pin change på 23 I/O-pinnar.
Förstår inte varför det är exotiskt. Han vill ju hålla reda på rotationsriktningen. Det betyder väl att han måste ta in både A och B signalen på varsin pinne.

Sedan om interupt och pin change :
The processor at the heart of any Arduino has two different kinds of interrupts: “external”, and “pin change”. There are only two external interrupt pins on the ATmega168/328 (ie, in the Arduino Uno/Nano/Duemilanove), INT0 and INT1, and they are mapped to Arduino pins 2 and 3.

On the other hand the pin change interrupts can be enabled on many more pins. For ATmega168/328-based Arduinos, they can be enabled on any or all 20 of the Arduino's signal pins; on the ATmega-based Arduinos they can be enabled on 24 pins.

Furthermore, the pin change interrupts are grouped into 3 “port”s on the MCU, so there are only 3 interrupt vectors (subroutines) for the entire body of pins. This makes the job of resolving the action on a single interrupt even more complicated.
Och det där "more complicated" kanske man skall passa sig för i detta fallet. :)
Användarvisningsbild
Klas-Kenny
Inlägg: 11291
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Bra sleepmode kod till UNO?

Inlägg av Klas-Kenny »

Fast så länge man bara behöver en eller två pinnar för interrupt kan man ju lägga dem på varsin grupp, med varsitt interrupt. Då behöver man inte ens kolla vilken pinne som gjorde interruptet...

Inte för att det skulle vara ett dugg komplicerat att kolla vilken pinne det kom ifrån, men ändå...
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Bra sleepmode kod till UNO?

Inlägg av lillahuset »

Nu vet ju inte jag vad det är för rotary encoder men de jag har använt har varit kvadratur och då räcker det gott med ett interrupt. Naturligtvis behöver man en pinne för riktningen också men det behöver ju inte vara ett interrupt.

Att klassa uppgiften att hantera "pin change interrupt" på en ATmega328 som komplicerat framstår ju bara som löjligt.
SeniorLemuren
Inlägg: 7779
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Bra sleepmode kod till UNO?

Inlägg av SeniorLemuren »

För dig ja. Men för TS kanske det inte är lika enkelt. Hoppa ner från hästen du store man. :)
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Bra sleepmode kod till UNO?

Inlägg av lillahuset »

Jag kanske inte skulle ha skrivit löjligt, sorgligt hade nog varit bättre.
Hästen rymde för många år sedan, nu är det en åsna som gäller. Nedskärningar vet du... :wink:

Men att det räcker mer än väl med ett interrupt för en kvadraturenkoder kan vi väl vara överens om?
PF013
Inlägg: 319
Blev medlem: 6 december 2007, 08:44:23
Ort: Linköping

Re: Bra sleepmode kod till UNO?

Inlägg av PF013 »

Det beror på vilken upplösning man vill ha. Om du nöjer dig med ett steg per period så räcker det med ett flankinterrupt och en riktningspinne. Vill du ha två steg per period räcker det också med ett interrupt, men det behöver trigga på båda flankerna. Om du däremot vill ha fyra steg per period så vill du att saker händer på båda flankerna på båda pinnarna. Om du löser det med bara ett intterupt så får du gärna förklara hur! :D
Användarvisningsbild
Klas-Kenny
Inlägg: 11291
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Bra sleepmode kod till UNO?

Inlägg av Klas-Kenny »

Väljer man bara "rätt" processor så löser man en kvadraturenkoder helt utan interrupt.... :vissla:
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Bra sleepmode kod till UNO?

Inlägg av fosfor »

Hoi!

Så jag kan alltså inte "aktivera" ett till interrupt på min vanliga Arduino UNO... ?
Men tydligen har Arduino Mega ett gäng fler interrupts, man kanske kan gå över till den då?
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43147
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Bra sleepmode kod till UNO?

Inlägg av sodjan »

Du måste skilja på "interrupt" och "interrupt". Ofta har en processor
en eller ett par direkta interrupt ingångar som är oberoende av andra
delar i processorn. I en ATmega328P (som sitter i Arduino UNO Rev3)
så är dessa två st. och kallas för INT0 och INT1.

Sen så finns det massor av andra interrupt, se "Table 11-1. Reset and
Interrupt Vectors in ATmega328P" i databladet (se nedan). De som
antagligen är mest intressanta här, är "PCINT0-2".

Ardunio Mega har en ATmega2560 processor. Den har 8 externa INT0-7 ingångar.
Så ja, den har flera interrupt av just den sorten...

Kod: Markera allt

Vector No. Program Address Source   Interrupt Definition
1          0x0000 RESET             External pin, power-on reset, brown-out reset and watchdog system reset
2          0x0002 INT0              External interrupt request 0
3          0x0004 INT1              External interrupt request 1
4          0x0006 PCINT0            Pin change interrupt request 0
5          0x0008 PCINT1            Pin change interrupt request 1
6          0x000A PCINT2            Pin change interrupt request 2
7          0x000C WDT               Watchdog time-out interrupt
8          0x000E TIMER2 COMPA      Timer/Counter2 compare match A
9          0x0010 TIMER2 COMPB      Timer/Counter2 compare match B
10         0x0012 TIMER2 OVF        Timer/Counter2 overflow
11         0x0014 TIMER1 CAPT       Timer/Counter1 capture event
12         0x0016 TIMER1 COMPA      Timer/Counter1 compare match A
13         0x0018 TIMER1 COMPB      Timer/Counter1 compare match B
14         0x001A TIMER1 OVF        Timer/Counter1 overflow
15         0x001C TIMER0 COMPA      Timer/Counter0 compare match A
16         0x001E TIMER0 COMPB      Timer/Counter0 compare match B
17         0x0020 TIMER0 OVF        Timer/Counter0 overflow
18         0x0022 SPI, STC          SPI serial transfer complete
19         0x0024 USART, RX         USART Rx complete
20         0x0026 USART, UDRE       USART, data register empty
21         0x0028 USART, TX         USART, Tx complete
22         0x002A ADC               ADC conversion complete
23         0x002C EE READY          EEPROM ready
24         0x002E ANALOG COMP       Analog comparator
25         0x0030 TWI               2-wire serial interface
26         0x0032 SPM READY         Store program memory ready
Användarvisningsbild
hawkan
Inlägg: 2585
Blev medlem: 14 augusti 2011, 10:27:40

Re: Bra sleepmode kod till UNO?

Inlägg av hawkan »

Jo det går att få interrupt på i princip alla pinnar. Men inte av typen "external interrup" för det går bara på pinne 2 och 3.
"Pin change interrupt" kan fås på nästan alla andra pinnar.
Det finns en skillnad mellan de, men om du tar ett färdigt bilbiotek så märks inte skillnaden.

Gå till Skiss -> Inkludera biblotek -> Hantera bilbiotek...
och sök efter och installera "EnableInterrupt"
Kolla exemplen som finns som vanligt under Fil -> Exempel -> EnableInterrupt

Här är det mesta av koden för exemplet "Simple"

Kod: Markera allt

// EnableInterrupt Simple example sketch. Demonstrates operation on a single pin of your choice.
// See https://github.com/GreyGnome/EnableInterrupt and the README.md for more information.
#include <EnableInterrupt.h>

#define ARDUINOPIN 7

volatile uint16_t interruptCount=0; // The count will go back to 0 after hitting 65535.

void interruptFunction() {
  interruptCount++;
}

void setup() {
  Serial.begin(115200);
  pinMode(ARDUINOPIN, INPUT_PULLUP);  // See http://arduino.cc/en/Tutorial/DigitalPins
 enableInterrupt(ARDUINOPIN, interruptFunction, CHANGE);
}

// In the loop we just display interruptCount. The value is updated by the interrupt routine.
void loop() {
  Serial.println("---------------------------------------");
  delay(1000);
  Serial.print("Pin was interrupted: ");
  Serial.print(interruptCount, DEC);
  Serial.println(" times so far.");
}
Skriv svar