[Icc-avr] Interrupt Help Please (Happy New Year)
John Baraclough
j_baraclough at zetnet.co.uk
Thu Jan 3 10:12:23 PST 2008
I haven't used this part and don't know the USB module, but I can see
two things you aren't doing which may help.
You are enabling the SPI and USART in 'wake()' and disabling them again
in 'sleep()', which is fine. However when the SPI and USART are disabled
the associated IO pins revert to normal port operation and will take on
the level and direction held in the PORTx and DDRx registers. If these
pins are driving external parts with pull-ups you may be pulling current
through the pins.
You need to ensure that the IO pins for the SPI and USART modules are
not driving anything befor going to sleep.
John
Andrew wrote:
> Hi john,
>
> I am actually powering the RTC from a port as it only takes 100uA (
> not my desgin, more a temparay fix).
>
> The thing is the code works with out change alsong as i dont't plug in
> the USB. So i can make it sleep and resume from sleep all day long by
> swaping the power over from backup battery to power (so PORTD BIT 1
> goes high and low). but if i plug in the USB connector and disconnect
> the USB connecor to make the processor sleep. the sleep current goes p
> to 112 - 120uA.
>
> Can you see something in the USB that i am not turnning off, it seems
> to me that the USB or some part of it is staying on.
>
> Andy
>
>
>
> ----- Original Message ----- From: "John Baraclough"
> <j_baraclough at zetnet.co.uk>
> To: "Discussion list for ICCAVR and ICCtiny Users. You do NOT need
> tosubscribe to icc-announce if you are a member of this."
> <icc-avr at imagecraft.com>
> Sent: Thursday, January 03, 2008 3:37 PM
> Subject: Re: [Icc-avr] Interrupt Help Please (Happy New Year)
>
>
>> The processor is clearly in a different state when it goes to sleep
>> from when it first starts up. At a guess, I would say you are leaving
>> a port pin enabled and driving a low level out to a pull-up resistor
>> (possibly more than one). Calculating the extra current; 112uA would
>> be the current drawn through a 47k resistor from a 5V supply (or 30k
>> and 3.3V).
>>
>> What is the mechanism for turning off the RTC? The ideal way to do
>> this is to use a resistive pull-up/pull-down to turn off the RTC and
>> then overdrive it with the appropriate level from a port pin to turn
>> it on. When the processor goes to sleep just tri-state all the port
>> pins so there is no current drawn.
>>
>> HTH
>>
>> John
>>
>> Andrew wrote:
>>> Hi john/anybody ,
>>> I have a intresting/anoying problem. to recap. I have an
>>> AT90USB162. i am basically trying to send the processor to sleep if
>>> Bit 1 on PORTD is high and wake when the PIN goes low. The basically
>>> tells the processor it has lost main power and is now running on a
>>> battery.
>>> I have the code working well and i am getting 7.12uA when the
>>> Processor is asleep.and my pin interrupt routine works and wakes the
>>> processor if PORTD BIT1 is low and returns back to the 7.12uA when
>>> PORTD BIT1 is high. The problem i have is when i pug the USB in.
>>> This also has the same effect on PORTD BIT 1 as it now takes over
>>> powring the system from the battery.
>>> So as before if the USB connector is pugged in PORDT BIT 1 goes low
>>> and the processor resumes from sleep. this also works and i can use
>>> the USB port as a serial emulator using some atmel exmaple code. The
>>> probelm comes when i unplug the USB connector. Which sends PORTD BIT
>>> 1 high and thus the processor goes to sleep but it only goes down to
>>> 119uA not the 7.12uA i was getting before. I have checked and the
>>> processor is asleep as the external oscillator is turnned off. So
>>> some part of the USB must be still enabled. Can anybody suggest a
>>> solution: -
>>> CODE
>>> NOTE : -
>>>
>>> #define USB_CONNECTED (PIND & 0x01)
>>> #define BAT_CONNECTED (PIND & 0x02)
>>>
>>> are defined in a sepearte c file.
>>>
>>> * *
>>>
>>> *void* sleep(*void*);
>>> *void* wake(*void*);
>>>
>>> //-----------------------------------------------------------------------------
>>>
>>> //
>>> // Function name : Sleep
>>> //
>>> // Returns : None
>>> //
>>> // Parameters : None
>>> //
>>> // Purpose : Send the processor into sleep mode (Low power)
>>> //
>>> //-----------------------------------------------------------------------------
>>>
>>> *void* sleep(*void*)
>>> {
>>>
>>> SPCR = 0x00; // Power Down the SPI
>>> UCSRB = 0x00; // NOT FOUND THIS IN THe DATASHEET
>>>
>>> REGCR = 0x01; // Disable the USB Regulator
>>> RTC_POWER_OFF // Turn the Power too the RTC OFF (PORTD4)
>>>
>>> EICRA = 0x08; // Change INT1 Pin Interrupt to Falling
>>> Edge (INT1)
>>>
>>> PRR1 = 0x81; // Turn Off the USB and USART using
>>> the power reduction register
>>>
>>> SMCR = 0; // Clear SMCR Register
>>> SMCR = 0x05; // Configure Sleep Register for Deep
>>> Sleep
>>> asm(/"sleep"/); // Put Processor into Deep Sleep
>>>
>>> }
>>>
>>> //-----------------------------------------------------------------------------
>>>
>>> //
>>> // Function name : Wake
>>> //
>>> // Returns :
>>> //
>>> // Parameters :
>>> //
>>> // Purpose : Return from Sleep mode and restart devices
>>> //
>>> //-----------------------------------------------------------------------------
>>>
>>> *void* wake (*void*)
>>> {
>>> PRR1 = 0x00; // Restart the USB from Power Reduction
>>> Mode
>>> EICRA = 0x0C; // Change the Battery on pin to interrupt
>>> on rising edge (INT1)
>>> RTC_POWER_ON // Turn the RTC Power Supply back on (PORTD4)
>>>
>>> UCSRB = 0x98; // HAVE NO IDEA WHAT THIS REGISTRY IS FOR
>>> SPCR = 0x5C; // Restart the SPI
>>> Usb_enable_regulator(); // Enable the USB regulator
>>> }
>>>
>>> //-----------------------------------------------------------------------------
>>>
>>> // Main Program Loop
>>> //-----------------------------------------------------------------------------
>>>
>>> *void* main(*void*)
>>> {
>>> init_devices(); // Initilise all the devices
>>>
>>> Usb_enable_regulator(); // Enable the USB Regulator
>>> usb_scheduler_init(); // Set up the USB Scheduler
>>>
>>> *while* (1)
>>> {
>>>
>>> *if*(USB_CONNECTED) // If the USB Connected Pin is High
>>> {
>>> usb_scheduler_tasks(); // Schedule the USB tasks
>>> }
>>>
>>> *if*(BAT_CONNECTED) // If the Battery Connected Pin is high
>>> {
>>> sleep(); // Call the Sleep function
>>> NOP(); // Small Delay
>>> NOP(); // Small Delay
>>> wake(); // Wake from Sleep and restart USB and SPI
>>>
>>> }
>>>
>>> }
>>> }
>>>
>>> Andy
>>> ------------------------------------------------------------------------
>>>
>>>
>>> _______________________________________________
>>> Icc-avr mailing list
>>> Icc-avr at imagecraft.com
>>> http://dragonsgate.net/mailman/listinfo/icc-avr
>>>
>>
>> _______________________________________________
>> Icc-avr mailing list
>> Icc-avr at imagecraft.com
>> http://dragonsgate.net/mailman/listinfo/icc-avr
>>
>
> _______________________________________________
> Icc-avr mailing list
> Icc-avr at imagecraft.com
> http://dragonsgate.net/mailman/listinfo/icc-avr
>
>
More information about the Icc-avr
mailing list