Created
July 8, 2013 22:54
Revisions
-
magnomp created this gist
Jul 8, 2013 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,72 @@ #include <TimerOne.h> #define FREQUENCIA 110 // hz #define TEMPO_TOCANDO 200 // ms #define TEMPO_PAUSA_CURTA 200 // ms #define TEMPO_PAUSA_LONGA 1000 // ms #define TOCANDO 0 #define PAUSA_CURTA 1 #define PAUSA_LONGA 2 #define PERIODO_TIMER (1000000/(FREQUENCIA*2)) #define CICLOS_TOCANDO (TEMPO_TOCANDO*1000L)/PERIODO_TIMER #define CICLOS_PAUSA_CURTA ((TEMPO_PAUSA_CURTA*1000L)/PERIODO_TIMER) #define CICLOS_PAUSA_LONGA ((TEMPO_PAUSA_LONGA*1000L)/PERIODO_TIMER) typedef struct { byte estado; byte contador; byte pulsos; } Canal; volatile byte estado = 0x00; volatile Canal canais[8]; void interrupt() { estado = ~estado; byte mascara_tocando = 0; for (int i = 0; i < 8; ++i) { ++canais[i].contador; if ((canais[i].estado == TOCANDO) && (canais[i].contador == CICLOS_TOCANDO)) { ++canais[i].pulsos; canais[i].contador = 0; canais[i].estado = canais[i].pulsos == (i + 1)?PAUSA_LONGA:PAUSA_CURTA; } else if ((canais[i].estado == PAUSA_CURTA) && (canais[i].contador == CICLOS_PAUSA_CURTA)) { canais[i].estado = TOCANDO; canais[i].contador = 0; } if ((canais[i].estado == PAUSA_LONGA) && (canais[i].contador == CICLOS_PAUSA_LONGA)) { canais[i].estado = TOCANDO; canais[i].contador = 0; canais[i].pulsos = 0; } if (canais[i].estado == TOCANDO) mascara_tocando |= 1 << i; } PORTD = estado & mascara_tocando; } void setup() { /* Serial.begin(9600); Serial.println("Constantes"); Serial.print("PERIODO_TIMER = "); Serial.println(PERIODO_TIMER); Serial.print("CICLOS_TOCANDO = "); Serial.println(CICLOS_TOCANDO); Serial.print("CICLOS_PAUSA_CURTA = "); Serial.println(CICLOS_PAUSA_CURTA); Serial.print("CICLOS_PAUSA_LONGA = "); Serial.println(CICLOS_PAUSA_LONGA); */ DDRD = 0xFF; memset((void *)&canais, '\0', sizeof(Canal)*8); Timer1.initialize(PERIODO_TIMER); Timer1.attachInterrupt(interrupt); } void loop() { }