Sobresaliente Genaro. Permíteme explicar los resultados y usar para este propósito tus imagenes de los impulsos del receptor:
Quiero indicar una vez mas, lo que llamas complicado realmente no lo es. El propósito de este curso es capacitar a todo forero interesado entender las cosas que por si son muy simples pero inacostumbradas y así poder usar la herramienta "electrónica" y no solo copiar o duplicar diesenos.
Los 2 diagramas arriba permiten ver de forma muy clara que el tamano de la superficie de las columnas es mas pequena en el primer gráfico que el de las columnas en el segundo gráfico. Eso significa que por mas tiempo la senal tiene la tensión de 5V en el gráfico 2 que en el 1. Este cambio de tensiones de los impulsos es tan velos, 50 veces por segundo, que el multimetro solo da un promedio de la tensión y no el valor de la verdadera tensión. Obviamente cuando el tiempo que la senal tiene un valor de 5V es mas larga el promedio aumenta.
La PWM que se usa para controlar un motor de escobillas DC usa eso para controlar la velocidad de rotación de un motor. Cada vez que la PWM aplica un impulso, en el sentido de los diagramas arriba, un rectángulo, el motor es acelerado, cada vez que el impulso ha terminado el motor continua girando por inercia y la solicitación, por ejemplo una helice ue propulsa una motonave, lo frena. Obviamente que si se aplica el 100% del tiempo la tensión al motor esta girará a mas velocidad hasta alcanzar su máximo.
Volvamos a tu tarea!
Por lo dicho anteriormente y por los valores que has medido he indicado aquí la senal llega correctamente al pin D.2. Ahora lo que debes hacer como próximo paso para acercarte a la solución es asegurar que la medición de la longitud del impulso sea medida correctamente. Para esto todo lo que haría es escribir el valor leido en la pantalla una vez por segundo.
Código:
'Zuweisung der Interrupt-Service-Routinen
On Int0 Rc_read
On Timer1 Rc_error
'Timer-Freigabe
Enable Timer1
Stop Timer1
'Freigabe der Interrupt-Routinen
Enable Int0
Enable Interrupts
Analicemos un poco el programa del módulo de software número 7. Arriba he sacado de allí una parte del código de inicialisación!
"On Int0 Rc_read"
este renglón del programa indica que el interrupt Int0 es accionado cuando cambia el nivel de la tensión en el pin d.2. La subrutina Rc_read es la rutina de servicio del interrupt. Recordemos. El interrupt es una "llamada" que ocurre cuando un evento externo tiene lugar. En nuestro caso este evento es cuando la tensión del pin D.2 cambia de 0V a 5V.
"Enable Timer1
Stop Timer1"
Estos 2 renglones del programa hacen lo siguiente. El primer renglón dice que queremos usar el contador "Timer1" y así lo activamos. El segundo renglón dice, favor para el contador de contar y inicializa lo poniendolo en "0". Así con cada "Tick" del reloj interno el contador incrementa su valor por "1", en el caso del programa, el reloj interno funciona a 4MHz, lo que hay que poner manualmente cambiando los valores de los tales "Fuse bits"! Lo has hecho?
Como hemos discutido anteriormente el "Prescaler" es un divisor de la velocidad de los "Ticks" del reloj interno! Por eso si el prescaler tiene un valor de "4", entonces el contador Timer1 no incrementa 4 millones de veces por segundo, sino solo 1 millón de veces! Recuerdas?
Código:
'======================================================
'ISR für INT0 - Leer canal RC
'======================================================
Rc_read:
'El Timer arranca contando con el cambio de 0V a 5V desde "0"
If Reading = 0 Then
Start Timer1 'Aquí arranca!
Reading = 1
Toggle Portc.0 'Aquí invierte la condición que activa el interrupt
'El contador Timer1 parará contando cuando la tensión vuelva de 5V a 0V!
'Esto es lo que ocurre al final del impulso, ver columnas en los gráficos
'La variable "Reading" que tenía el valor de "0" es puesta a "1". Ahora cuando ocurra el evento del fin del impulso la condicion Reading = 0 es falsa y el programa salta a la primera sentencia después de "else"
Else
Stop Timer1 'Ven, ahora la variable Reading = 1 por lo que el programa salta acá!
Rc_value = Timer1 'Aquí la variable Rc_value recibe el valor del contador!
Timer1 = 0 'Aquí el contador es reseteado estando así listo para cuando el impulso se repita despues de 20ms!
Reading = 0 'Aqui la variable Reading vuelve a recibir el valor de "0" por lo que el programa ejecutará las sentecias anteriores a "else" la próxima vez que el impulso aparesca!
Toggle Portc.1
End If
'Error-Bit rücksetzen
Error = 0
Return
La variable "Error" tiene la función demanejar la situación cuando por X-razón el receptor no pueda recibir el impulso correctamente. No voy a entrar en detalles aquí!