/*
1) Al iniciar el programa debe iniciar en el Efecto 1,
sobre el PORT indicado para el grupo en la BdD
de la catedra, en la planilla
2) Al pulsar (presionar y soltar) SW1, debe cambiar al
Efecto 2. Conectar apropiadamente SW1, en el pin indicado
para el grupo en la BdD de la catedra.
3) Al pulsar (presionar y soltar) SW2, debe cambiar al
Efecto 1. Conectar apropiadamente SW2, en el pin indicado
para el grupo en la BdD de la catedra.
*/
#include "macros.h" // Cabecera de macros
#define ALT_PIN PINB1 // Pin del botón para el patrón 1
#define STA_PIN PINB0 // Pin del botón para el patrón 2
#define ALT_PATTERN 0 // Macro para el patrón 1
#define STA_PATTERN 1 // Macro para el patrón 2
#define ALT_START 0b11011011; // Estado de inicio del patrón 1
#define ALT_OTHER 0b01100110; // Estado alternado del patrón 1
#define STA_LEFT 0 // Macro para la dirección izquierda
#define STA_RIGHT 1 // Macro para la dirección derecha
unsigned long millisCurrent = 0; // Tiempo de ejecución actual del loop
unsigned long millisPattern = 0; // Tiempo del último cambio de patrón
unsigned long millisButton = 0; // Tiempo de la última lectura de botón
bool pattern = ALT_PATTERN; // Selector del patrón
bool staDir = 0; // Sentido actual del patrón escalera
void changePattern(bool new_pattern) // Función para cambiar el patrón
{
pattern = new_pattern; // Actualización del booleano
if (pattern == ALT_PATTERN) { // Si es patrón 1
PORTD = ALT_START; // Output base del patrón 1
} else {
PORTD = 0x00; // Output base del patrón 2 (vacío)
}
}
void setup() // Setup loop
{
DDRD = (OUTPUT<<DDD7)| // Data Direction Register D [0-7] <- OUTPUT
(OUTPUT<<DDD6)|
(OUTPUT<<DDD5)|
(OUTPUT<<DDD4)|
(OUTPUT<<DDD3)|
(OUTPUT<<DDD2)|
(OUTPUT<<DDD1)|
(OUTPUT<<DDD0);
PORTD = ALT_START; // PORT D [0-7] <- ALT_START
DDRC = (INPUT << DDC0) | // Data Direction Register C [0-1] <- INPUT
(INPUT << DDC1) ;
PORTC = (PULL_UP << PC0 ) | // PORT C [0-1] <- PULL_UP
}
void loop() {
if (STAIR_PIN_P && (GET_BIT(PINC, STAIR_PIN) == LOW)) {
change_pattern(STAIR_PATTERN);
}
STAIR_PIN_P = GET_BIT(PINC, STAIR_PIN);
if (ALT_PIN_P && (GET_BIT(PINC, ALT_PIN) == LOW)) {
change_pattern(ALT_PATTERN);
}
ALT_PIN_P = GET_BIT(PINC, ALT_PIN);
if (millis() - TIME > 100) {
TIME = millis();
if (OUT_PATTERN == ALT_PATTERN) {
PORTD = ~PORTD;
} else if (OUT_PATTERN == STAIR_PATTERN) {
STAIR_POS++;
if (STAIR_POS%14 < 7) {
PORTD = (HIGH<<(STAIR_POS%7));
} else if (STAIR_POS%14 >= 7) {
PORTD = ((HIGH<<DDD7)>>(STAIR_POS%7));
}
}
}
}