Welcome
Username or Email:

Password:


Missing Code




[ ]
[ ]
Online
  • Guests: 19
  • Members: 0
  • Newest Member: omjtest
  • Most ever online: 396
    Guests: 396, Members: 0 on 12 Jan : 12:51
Members Birthdays:
One birthday today, congrats!
Colin 99 (53)


Next birthdays
05/14 hvguy (41)
05/14 thehappyelectron (14)
05/14 Justin (2024)
Contact
If you need assistance, please send an email to forum at 4hv dot org. To ensure your email is not marked as spam, please include the phrase "4hv help" in the subject line. You can also find assistance via IRC, at irc.shadowworld.net, room #hvcomm.
Support 4hv.org!
Donate:
4hv.org is hosted on a dedicated server. Unfortunately, this server costs and we rely on the help of site members to keep 4hv.org running. Please consider donating. We will place your name on the thanks list and you'll be helping to keep 4hv.org alive and free for everyone. Members whose names appear in red bold have donated recently. Green bold denotes those who have recently donated to keep the server carbon neutral.


Special Thanks To:
  • Aaron Holmes
  • Aaron Wheeler
  • Adam Horden
  • Alan Scrimgeour
  • Andre
  • Andrew Haynes
  • Anonymous000
  • asabase
  • Austin Weil
  • barney
  • Barry
  • Bert Hickman
  • Bill Kukowski
  • Blitzorn
  • Brandon Paradelas
  • Bruce Bowling
  • BubeeMike
  • Byong Park
  • Cesiumsponge
  • Chris F.
  • Chris Hooper
  • Corey Worthington
  • Derek Woodroffe
  • Dalus
  • Dan Strother
  • Daniel Davis
  • Daniel Uhrenholt
  • datasheetarchive
  • Dave Billington
  • Dave Marshall
  • David F.
  • Dennis Rogers
  • drelectrix
  • Dr. John Gudenas
  • Dr. Spark
  • E.TexasTesla
  • eastvoltresearch
  • Eirik Taylor
  • Erik Dyakov
  • Erlend^SE
  • Finn Hammer
  • Firebug24k
  • GalliumMan
  • Gary Peterson
  • George Slade
  • GhostNull
  • Gordon Mcknight
  • Graham Armitage
  • Grant
  • GreySoul
  • Henry H
  • IamSmooth
  • In memory of Leo Powning
  • Jacob Cash
  • James Howells
  • James Pawson
  • Jeff Greenfield
  • Jeff Thomas
  • Jesse Frost
  • Jim Mitchell
  • jlr134
  • Joe Mastroianni
  • John Forcina
  • John Oberg
  • John Willcutt
  • Jon Newcomb
  • klugesmith
  • Leslie Wright
  • Lutz Hoffman
  • Mads Barnkob
  • Martin King
  • Mats Karlsson
  • Matt Gibson
  • Matthew Guidry
  • mbd
  • Michael D'Angelo
  • Mikkel
  • mileswaldron
  • mister_rf
  • Neil Foster
  • Nick de Smith
  • Nick Soroka
  • nicklenorp
  • Nik
  • Norman Stanley
  • Patrick Coleman
  • Paul Brodie
  • Paul Jordan
  • Paul Montgomery
  • Ped
  • Peter Krogen
  • Peter Terren
  • PhilGood
  • Richard Feldman
  • Robert Bush
  • Royce Bailey
  • Scott Fusare
  • Scott Newman
  • smiffy
  • Stella
  • Steven Busic
  • Steve Conner
  • Steve Jones
  • Steve Ward
  • Sulaiman
  • Thomas Coyle
  • Thomas A. Wallace
  • Thomas W
  • Timo
  • Torch
  • Ulf Jonsson
  • vasil
  • Vaxian
  • vladi mazzilli
  • wastehl
  • Weston
  • William Kim
  • William N.
  • William Stehl
  • Wesley Venis
The aforementioned have contributed financially to the continuing triumph of 4hv.org. They are deserving of my most heartfelt thanks.
Forums
4hv.org :: Forums :: Computer Science
« Previous topic | Next topic »   

Help With Interrupts in AVR C

Move Thread LAN_403
Daniel Kramnik
Sun Apr 08 2012, 10:00PM Print
Daniel Kramnik Registered Member #3885 Joined: Sun May 15 2011, 12:47AM
Location: Newton, Massachusetts, United States
Posts: 94
Hi all!

I'm just getting started with AVR C and I'm having trouble setting up an interrupt on my ATTiny85V.

I have LEDs connected to Port B bits 1 - 4 and a pushbutton to ground connected to Port B bit 0. With this code, I am able to detect the state of the button (if it is currently being pushed or not), but the ISR is not called (I set an interrupt on PCINT0, and I only enabled source 0, so my pushbutton should trigger the ISR).

Any help at all would be appreciated! Normally, the code just fades the LEDs back and forth.

UPDATE: a friend pointed out that _SEI() isn't being called where it is in this code, so global interrupts are not being enabled, but when I move it into main or setupInterrupts, I get an undefined reference error - any suggestions?

FIXED!

It needs to be sei(), not _SEI()

hope this helps someone else who's having trouble!

#include <avr/io.h>

#define F_CPU 800000UL
#include <util/delay.h>

#include <avr/interrupt.h>
_SEI(); //Enable Global Interrupts

#define TRUE 1
#define FALSE 0
typedef int boolean;

#define topLEDLocation 0b00010000
#define bottomLEDLocation 0b00000010
#define pullUp 0b00000001

void blink();
void updateDelay();
void _delay_xus(int us);
void setNextByte();
void setupInterrupts();

int delayTime = 0;
boolean cylonUp = TRUE;

volatile boolean interruptFlag = FALSE;

unsigned char leadingByte = 0b00000100;

int main(void)
{
//Set all pins as outputs
DDRB = 0xff;
//Enable response to interrupts
setupInterrupts();

//Set all outputs low, enables internal pull-up on input pin 0
PORTB = 0x01;

//Main program cycle
while(1)
{
//This tells us if an interrupt has been detected - use for debugging
if(interruptFlag)
{
PORTB = 0xff;
_delay_ms(100);
PORTB = 0x01;
_delay_ms(100);

PORTB = 0xff;
_delay_ms(100);
PORTB = 0x01;
_delay_ms(100);

PORTB = 0xff;
_delay_ms(100);
PORTB = 0x01;
_delay_ms(100);

interruptFlag = FALSE;
}

if(PINB & (1 << 0) == 1)
{
//Makes the LEDs glow dimly if the button has not been pressed - use for debugging
PORTB = 0xff;
}

blink();

updateDelay();
}

return(0);
};

void blink()
{
//Start the first LED with low pulsewidth
PORTB = pullUp | leadingByte;
_delay_xus(delayTime);

///Start the second LED with high pulsewidth
if(cylonUp) {PORTB = pullUp | leadingByte >> 1;}
else {PORTB = pullUp | leadingByte << 1;}
_delay_xus(1000 - delayTime);
};

void updateDelay()
{
//Goes to the next set of LEDs once the leading LED has reached maximum pulsewidth
if(delayTime == 1000)
{
setNextByte();
delayTime = 0;
}
//If the leading LED has not reached maximum pulsewidth, increase the pulsewidth
else
{
delayTime += 10;
}
};

//This methods lets us use a variable with the _delay_us method instead of a constant
void _delay_xus(int us)
{
while (us--)
{
_delay_us(1);
}
};

//Determines which LED to jump to next
void setNextByte()
{
if(cylonUp)
{
if(leadingByte == topLEDLocation)
{
leadingByte = leadingByte >> 1;
cylonUp = FALSE;
}
else
{
leadingByte = leadingByte << 1;
}
}
else
{
if(leadingByte == bottomLEDLocation)
{
leadingByte = leadingByte << 1;
cylonUp = TRUE;
}
else
{
leadingByte = leadingByte >> 1;
}
}
};

void setupInterrupts()
{
//Sets the interrupt pin as an input
DDRB &= ~(1 << 0);

//Enable pin change interrupt
GIMSK |= (1 << PCIE);

//Enables PCINT0, leaves all others disabled
PCMSK |= (1 << PCINT0);
};

ISR(PCINT0_vect)
{
interruptFlag = TRUE;
};
Back to top

Moderator(s): Chris Russell, Noelle, Alex, Tesladownunder, Dave Marshall, Dave Billington, Bjørn, Steve Conner, Wolfram, Kizmo, Mads Barnkob

Go to:

Powered by e107 Forum System
 
Legal Information
This site is powered by e107, which is released under the GNU GPL License. All work on this site, except where otherwise noted, is licensed under a Creative Commons Attribution-ShareAlike 2.5 License. By submitting any information to this site, you agree that anything submitted will be so licensed. Please read our Disclaimer and Policies page for information on your rights and responsibilities regarding this site.