Muchas gracias por tu pronta respuesta, una ultima duda, si yo tengo qué utilizar el ccp y quiero usar pwm también y solo tiene un pin que hace las 2 cosas podria hacer las 2 cosas a la vez ??
La solución fácil en Arduino (sin interrupciones) es leer la función millis() al pulsar y al soltar el pulsador. Luego restas los valores y ya está.
Un par de condensadores y la resistencia de reset.
Puedes desarrollar con la placa y luego pasarlo a un micro con encapsulado tqfp.
Saludos.
No entiendo bien la pregunta.
Si quieres grabar un programa en un Atmega328 (o un bootloader), se puede hacer fácilmente con otro Arduino:
https://www.arduino.cc/en/Tutorial/ArduinoISP
(https://www.arduino.cc/en/uploads/Tutorial/BreadboardAVR.png)
O con cualquier otro programador externo para ATmel.
Saludos.
¿Cómo es el programa y el esquema?
const int btnV = 2;
int btnStatusV = 0;
unsigned long durBtnV;
void setup() {
Serial.begin(115200);
pinMode(btnV, INPUT);
Serial.print("Setup Finalizado, continuando...\n");
}
void loop() {
durBtnV = pulseIn(btnV, HIGH);
Serial.print("durBtnV: ");
Serial.print(durBtnV);
Serial.print("\n");
if (durBtnV >= 3000) {
analogWrite(9, HIGH);
}
}
2768ms - isPowered: 0 durBtnV: 0
3461ms - isPowered: 0 durBtnV: 0
3682ms - isPowered: 0 durBtnV: 3051
3702ms - isPowered: 0 durBtnV: 3644
3723ms - isPowered: 0 durBtnV: 4110
3742ms - isPowered: 0 durBtnV: 4528
3763ms - isPowered: 0 durBtnV: 4954
3783ms - isPowered: 0 durBtnV: 5256
3803ms - isPowered: 0 durBtnV: 5482
3823ms - isPowered: 0 durBtnV: 5689
3844ms - isPowered: 0 durBtnV: 5910
3863ms - isPowered: 0 durBtnV: 6131
3884ms - isPowered: 0 durBtnV: 6314
3903ms - isPowered: 0 durBtnV: 6491
3923ms - isPowered: 0 durBtnV: 6670
3944ms - isPowered: 0 durBtnV: 6922
3963ms - isPowered: 0 durBtnV: 7302
3984ms - isPowered: 0 durBtnV: 7647
4003ms - isPowered: 0 durBtnV: 7968
4024ms - isPowered: 0 durBtnV: 8280
4044ms - isPowered: 0 durBtnV: 8570
4064ms - isPowered: 0 durBtnV: 8929
4084ms - isPowered: 0 durBtnV: 9331
4105ms - isPowered: 0 durBtnV: 9752
4125ms - isPowered: 0 durBtnV: 10322
4145ms - isPowered: 0 durBtnV: 10662
4165ms - isPowered: 0 durBtnV: 10714
4185ms - isPowered: 0 durBtnV: 10683
4205ms - isPowered: 0 durBtnV: 10601
4225ms - isPowered: 0 durBtnV: 10536
4245ms - isPowered: 0 durBtnV: 10432
4265ms - isPowered: 0 durBtnV: 10332
4285ms - isPowered: 0 durBtnV: 10315
4305ms - isPowered: 0 durBtnV: 10224
4325ms - isPowered: 0 durBtnV: 10109
4345ms - isPowered: 0 durBtnV: 9888
4365ms - isPowered: 0 durBtnV: 9660
4385ms - isPowered: 0 durBtnV: 9430
4405ms - isPowered: 0 durBtnV: 9159
4425ms - isPowered: 0 durBtnV: 8897
4445ms - isPowered: 0 durBtnV: 8602
4464ms - isPowered: 0 durBtnV: 8280
4485ms - isPowered: 0 durBtnV: 7899
4504ms - isPowered: 0 durBtnV: 7584
4525ms - isPowered: 0 durBtnV: 7265
4544ms - isPowered: 0 durBtnV: 6946
4564ms - isPowered: 0 durBtnV: 6612
4584ms - isPowered: 0 durBtnV: 6318
4603ms - isPowered: 0 durBtnV: 6005
4624ms - isPowered: 0 durBtnV: 5743
4643ms - isPowered: 0 durBtnV: 5413
4664ms - isPowered: 0 durBtnV: 5058
4683ms - isPowered: 0 durBtnV: 4735
4704ms - isPowered: 0 durBtnV: 4446
4723ms - isPowered: 0 durBtnV: 4157
4744ms - isPowered: 0 durBtnV: 3787
5436ms - isPowered: 0 durBtnV: 0
6128ms - isPowered: 0 durBtnV: 0
6821ms - isPowered: 0 durBtnV: 0
7514ms - isPowered: 0 durBtnV: 0
Esto solo por acercar un poco el dedo al cableLevel=Level = HIGH Lapse = 7964 ms
Level=Level = LOW Lapse = 3 ms
Level=Level = HIGH Lapse = 0 ms
Level=Level = LOW Lapse = 0 ms
Level=Level = HIGH Lapse = 16 ms
Level=Level = LOW Lapse = 0 ms
Level=Level = HIGH Lapse = 1 ms
Level=Level = LOW Lapse = 776 ms
Level=Level = HIGH Lapse = 5 ms
Level=Level = LOW Lapse = 5 ms
Y por que no realizarlo por HW ? en el protoboard me refiero...
Es ideal lo que comenta Picuino para ahorrar espacio y componentes, pero podria hacerlo con una resistencia y un capacitor.
Si queres aprender a hacerlo por software entonces adelante.
Ahora el resultado es más lógico.
De todas formas tienes muchos rebotes. Esa es la segunda tarea a realizar, filtrar rebotes para que sólo aparezca un pulso limpio.
Yo lo hago con una máquina de estados y con un contador. El estado sólo cambia a HIGH cuando se cuentan varios milisegundos seguidos en HIGH. En tu caso te conviene poner más de 5 milisegundos y así filtras todos esos rebotes que se ven.
Saludos.
void TIMER1_isr(void)//Función de interrupción por desbordamiento TMR1
{
MedioSeg=MedioSeg+1;
if (MedioSeg==2)
{
Segundos=Segundos+1;
MedioSeg=0;
SegundosRestantes=SegundosRestantes+1;
}
Nada:
set_timer1(0x0BDC);//(0x0BDC);//carga del TMR1
// restart_wdt();
}
Si quieres filtrar por software:
1º Defines una variable con el estado del pulsador
Estado 1: Estado bajo, pulsador a nivel bajo
Estado 2: Estado bajo, pulsador a nivel alto
Estado 3: Estado alto, pulsador a nivel alto
Estado 4: Estado alto, pulsador a nivel bajo
2º Defines una variable de medida de tiempo en milisegundos.
Los estados 1 y 3 son estables. La medida de tiempo se asigna a cero
Los estados 2 y 4 son de transición. Tienes que medir cuanto tiempo se encuentra en ese estado y si supera un tiempo establecido, cambias el estado de 2 a 3 y de 4 a 1.
El cambio de estado entre 1 y 2 se produce al leer el nivel del pulsador.
Lo mejor es programarlo todo en una rutina y llamarla cada milisegundo:Código: C
unsigned long oldmillis; unsigned char pulsador2; setup() { oldmillis = millis()+1; } loop() { if (millis() >= oldmillis) { oldmillis++; teclado(); // Rutina de lectura del estado del teclado } // Resto del programa if (pulsador2 == HIGH) { .... } ... }
En la función teclado se lee el pulsador y se actualiza el valor de la variable pulsador2 en consecuencia.
Esto te permite trabajar con el resto del programa sin que se paralice todo por la lectura del teclado.
Si quieres te comento cómo hacerlo con un RTOS muy sencillo que facilita las cosas.
Un saludo.