La verdad que si venis desde ASM y te manejas bien modificando los registros del PIC, te recomendaria XC8 en ves de CCS, ya que CCS tiene algunas cosas buenas y malas a mi gusto. Las buenas es que te permite hacer cosas rapidamente sin tener que pensar en registros. La mala es que hace muchas cosas detras tuyo y si no tenes experiencia con el compilador puede llegar a ser un dolor de cabeza.
Primero en C no necesitas "etiquetas" ( labels ) como lo es inicio_DHT.
Por otro lado salvo algunas excepciones no se usa el
goto, Digo excepciones porque a veces es mejor usarlo, pero para los primeros pasos mejor dejarlos aparte ya que es posible que cometas errores al no tener conocimiento de como funciona C internamente.
El DHT11 esta realizado para que se use con un pin colector abierto. Pero el PIC no posee esto. Por lo tanto la unica forma seria de activar la salida y luego pasarlo a entrada.
¿Cual es el problema de esto en CCS?
Como te decia, CCS hace cosas que alguien que no lo conoce pueden parecer raras. Cuando usas las instrucciones:
output_high();
output_low();
El compilador agregar lineas de codigo cambiando el TRIS de esos pines, suponete que lo tenias como entradas y pusiste esa instruccion, entonces lo deja como salida. Si pones un:
input_pin();
Ocurre lo mismo , nomas que ahora cambia el TRIS de ese pin a entrada.
Hay forma de evitar esto, y la forma es usando una directiva propia de CCS ( de estas posee muchas como fuses, use, bit, byte , etc ) y que no siguen el estándar de C.
Si pones
#USE FAST_IO(A)
Eso hace que para aquellos pines del puerto A no cambie el TRIS por si solo, y depende unicamente de vos.
Ahora podes definir los tris con set_tris_a(0b00010101);
------------------------------------------------------
Problemas de programacion en tu programa:
La primer linea es "include", usualmente si incluis un archivo es una cabecera o archivo con extension .h
Toda instruccion debe terminar con un punto y coma, excepto los if, for entre otros, ejemplo:
output_low(PIN_A4);
if(input_pin(PIN_A3))
{
output_high(PIN_A0);
delay_ms(30);
}
// Esto siempre se cumple, por lo tanto es un bucle infinito
while(1)
{
}
Recorda como hacias en ASM, y te vas a dar cuenta que siempre se debe tener un bucle infinito. Para eso se usa el while(1), en resumen tu programa quedaria con este formato:
void main(void)
{
//Aca la inicializacion de modulos o de partes externas
while(1)
{
//Aca el programa principal
que siempre se va a estar ejecutando
}
}
Te recomiendo que busques por internet los tipos de control de flujo que tenes, como los "for", los "if", los "while" y "do..while" y que realizes ejemplos simples para entenderlos.
Eso antes de meterte de lleno con las partes del microcontrolador. A lo que me refiero es tratar de conocer las herramientas que tenes para luego usarlas.