Any way to do non hardware interrupts on the 328

The simple answer is yes, every analogue or digital pin can generate an interrupt.

They are not quite as convenient as INT0 & INT1.
Each pin has a dedicated interrupt service routine that is called when the corresponding pin changes.

There are only three "Pin Change" interrupts for all the input & output pins. Each pin change interrupt can be triggered by upto 8 pins.
The mapping is roughly:

  • PCI0 will be triggered by pins in Port B (Arduino pins 8 to 13)
  • PCI1 will be triggered by pins in Port C (Arduino pins Analog 0 to 5 & Reset)
  • PCI2 will be triggered by pins in Port D (Arduino pins 0 to 7)

The details can be found at Atmel in the ATmega328/Atmega168/ATmega88/ATmega48 documents Currently (and this does change as new versions are released) in http://www.atmel.com/dyn/resources/prod_documents/8271.pdf

If you look in Section 12. External Interrupts, it explains:

The External Interrupts are triggered by the INT0 and INT1 pins or any of the PCINT23...0 pins. ... The pin change interrupt PCI2 will trigger if any enabled PCINT23...16 pin toggles. The pin change interrupt PCI1 will trigger if any enabled PCINT14...8 pin toggles. The pin change interrupt PCI0 will trigger if any enabled PCINT7...0 pin toggles.

Section 11. Interrupts, explains the names of the interrupt routines.

This explains the relationship between PCINTn pins and the Arduino pin numbering: http://arduino.cc/en/Hacking/PinMapping168

So, when you arrive in the interrupt routine for e.g. PCI0, it can be triggered by upto 8 pins, and you'll have to write a little bit of code to figure out which. Of course, if only one pin is set up to generate an interrupt, then there is only one pin to look at.

HTH
GB