// Brandon Jennings
// Embedded Systems Project 2 Problem 1.1
// Forward declaration for MyDelay function
void MyDelay(unsigned long mSec);
int main(void) {
//unsigned char *ptrSREG;
//ptrSREG = (unsigned char *) 0x5F; // AVR Status Register
//*ptrSREG &= ~(0x80); // 0xxx xxxx // Global Interrupt Disable
// How to disable global interrupt without breaking?
unsigned char *portD;
portD = (unsigned char *) 0x2B; // Data Register (Port D)
*portD |= 0x04; // 0000 0100 (PD2 ON)
unsigned char *AT328_EICRA;
AT328_EICRA = (unsigned char *) 0x69; // External Interrupt Control Register A
*AT328_EICRA |= 0x01; // Interrupt on any logical change
*AT328_EICRA &= ~(0x02); // Turns off xx0x (prevents register from being in wrong setting)
unsigned char *AT328_EIMSK;
AT328_EIMSK = (unsigned char *) 0x3D; // External Interrupt Mask Register
*AT328_EIMSK |= 0x01;
unsigned char *portDDRC;
portDDRC = (unsigned char *) 0x27; // Data Register (PORTC)
*portDDRC |= 0x3F; // 0011 1111 (Turning on all ports A0 - A5)
unsigned char *ptrSREG;
ptrSREG = (unsigned char *) 0x5F; // AVR Status Register
*ptrSREG |= 0x80; // 1000 0000 // Global Interrupt Enable
while (1) { // Regular Proccess
unsigned char *portC;
portC = (unsigned char *) 0x28; // Port D Output (PORTC)
*portC &= ~0x3F; // Set PC 0-5 low
*portC |= 0x01; // 0000 0001 (ON/High)
MyDelay(500); // 500 seems to be about 1 second, the delay function is imprecise
*portC &= ~0x3F;
*portC |= 0x02;
MyDelay(500);
*portC &= ~0x3F;
*portC |= 0x04;
MyDelay(500);
*portC &= ~0x3F;
*portC |= 0x08;
MyDelay(500);
*portC &= ~0x3F;
*portC |= 0x10;
MyDelay(500);
*portC &= ~0x3F;
*portC |= 0x20;
MyDelay(500);
}
}
ISR(INT0_vect) // Interrupt Service Routine
{
unsigned char *portPinD;
portPinD = (unsigned char *) 0x29; // Port D Input
unsigned char *portC;
portC = (unsigned char *) 0x28; // Port D Output (PORTC)
// Read PD2 using the Port D Pin Input Register (PIND)
if (*portPinD & 0x04) // 0000 0100 (???)
{
// PD2 is high, so button is released
// Set PC0 low using the Port C Data Register (PORTC)
*portC |= 0x3F; // 0001 1111 (Set PC 0-5 HIGH)
MyDelay(2000); // Wait
}
else
{
// PD2 is low, so button is pressed
*portC &= ~0x3F; // Set PC 0-5 LOW
MyDelay(2000); // Wait
}
}
// Define MyDelay function
void MyDelay(unsigned long mSec)
{
volatile unsigned long i;
unsigned long endT = 1000 * mSec;
for (i = 0; i < endT; i++);
}