Autor Tema: Microcursillo en C  (Leído 179003 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado mariosaul

  • PIC10
  • *
  • Mensajes: 21
RE: Microcursillo en C
« Respuesta #210 en: 11 de Enero de 2005, 14:07:00 »
Esta debe ser una pregunta muy basica pero da igual,

output_b(0xff);
esa instruccion me pone en 1 todos los pines del portb,
como hago para elegir exactamente que pin quiero poner en uno?

lo mismo con
output_b(0x00);

Lo de adentro del parentesis me permite elejis si lo pongo en uno o en cero, y he visto ejemplos (0x0f), que pone la mitad del puerto en cero y la mitad en uno, ojala puedan explicarme con mas detalle.

Los que sepan bien esto podrian hacer un diccionario de funciones de C, no todo lo de c, sino la parte que tiene relacion con los pics, el resto esta muy bien documentado en internet

saludos,
juaco

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: Microcursillo en C
« Respuesta #211 en: 11 de Enero de 2005, 14:24:00 »
Que onda mariosaul,
De hecho la infomacion  viene en el manual del compilador que junto con un libro clasico para aprender uniones ,estructuras , punteros,variables,etc (PICmicro MCU C® An introduction to programming The Microchip PIC in CCS C By Nigel Gardner) deja muy en claro muchas de estas dudas.
hablando en especifico de este  output_b(0x00) , que como tu bien dices saca un cero logico en todo  el puerto b , asi mismo esta funcion establece al registro del puerto como salidas(cero logico) o como entradas(en el caso de poner 255) DEPENDIENDO de la definicion que uses  de puertos: #Use XXX_IO(X) . Asi mismo la forma mas VISUAL de saber  que pin pones como salida o cual como entrada seri usando binario:
output_b(0b00000000) , donde 0b es indicador que continua un binario, y 00000000 son los 8 bits del puerto b, de MSB a LSB(bit7,6,5..0) asi si solo quieres setear solo el bit 7 del puerto b seria  output_b(0b10000000) , usando esta funcion. Aunque hay funciones que especifican esto de otra forma  como   bit_clear(var, bit) asi: bit_set(6,1) ;seteamos el bit 7 del portb(direcionado en la posicion 6) . bit_set(11,7) ;seteamos el bit 7 de INTCON y asi sucesivamente...

Salu2 pana

Desconectado mariosaul

  • PIC10
  • *
  • Mensajes: 21
RE: Microcursillo en C
« Respuesta #212 en: 11 de Enero de 2005, 14:52:00 »
disculpa que te haya preguntado eso, justo despues de postiar me meti al comilador a hacer pruebas,  hic eun pequenio programa que me lee el estado de los pulsadores y me prende un led por cada pulsador que este presionado, o despresionado, dependiendo de el tipo de pulsador,

ojala alguien me pueda decir si esto funciona:

#include <16F628.h>
#fuses XT,NOWDT,NOPROTECT
#use delay(clock=4000000)
#use fast_io(B)



void main()
{

set_tris_b(0x00);

   while (1)
   {          
      output_b(0b00000000);

      if (input(PIN_B0)){
         output_high(PIN_A0);
      }

      if(input(PIN_B1)){
         output_high(PIN_A1);
      }

      if(input(PIN_B2)){
        output_high(PIN_A2);
      }
     
   }
}


si tengo un entero, una variable int con el numero parecido a  0001011, que son los pines a poner en 1, se puede hacer algo asi como output_b(0b<nombre de variable>Giño


gracias laguer por responder tan rapido

juaco

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: Microcursillo en C
« Respuesta #213 en: 11 de Enero de 2005, 16:06:00 »
No tienes que agradecer nada pana, para eso estamos.
Aqui tu ejemplo corregido y con la respuesta a tu duda:

#include <16F628.h>
#fuses XT,NOWDT,NOPROTECT
#use delay(clock=4000000)
#byte CMCON = 0x19
#use fast_io(B) /*Ya que usamos el formato RAPIDO, debemos especificar entradas
y salidas antes de usarlas, si quitamos este formato, lo hace por defaul como
#use standard_io(x) generando CADA ves que se use el comando que este determinado por este
como el output_x() y generando mas espacio y menos rapides*/
int puerto;
void main(){CMCON=7;/*Deshabilitemos comparadores!!!*/
puerto=255;                 /La variable que comentabas*/
set_tris_b(0b00000111); /*b0,b1,b2 entradas, las demas salidas*/
output_a(puerto); /*limpiamos todo puerto Ay lo ponemos de salida,
                          aqui no es necesario poner tris ya que solo
                          definimos el portb como FAST!!!!!!!!!!!!!*/
Delay_ms(1000);
puerto=0;            
output_a(puerto);
while (1){
if (!input(PIN_B0)){                  /*como no usamos pullups internas usamos resitencias
                                       externas, por tanto negamos la condicionante
                                       asi si NO esta en 1 cada pin, enciende el led*/
output_high(PIN_A0);}
if(!input(PIN_B1)){  
output_high(PIN_A1);}
if(!input(PIN_B2)){
output_high(PIN_A2);}
}
}

Salu2

Desconectado mariosaul

  • PIC10
  • *
  • Mensajes: 21
RE: Microcursillo en C
« Respuesta #214 en: 11 de Enero de 2005, 16:42:00 »
no es necesario apagar los leds en cada loop?, queremos que se prendan solo mientras estan apretados, no apretarlos y que queden prendidos.

porque va ese delay?


Ahora en otro tema, el delay es preciso?, si quiero llevar una cuenta de segundos muy exacta, como lo hago?


saludos
juaco


(que es pana???)

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: Microcursillo en C
« Respuesta #215 en: 11 de Enero de 2005, 18:48:00 »
jejejeje, bueno eso ya lo decides tu pana, solo corregi  unas cosas y adicione lo del delay para que encendiera todo el puerto 1 segundo(de pretexto para que vieras el uso de variables con funciones, lo que preguntabas....) . Sonrisa
Pana es un muy buen amigo Fumador .
Como puedes ver es muy sencillo y leyendo bien el manual no debes de tener grandes problemas, es importante el orden de cada linea ya que esto refleja la sintaxis del programa, y que sea mejor o peor optimizado por el compilador.
El delay es preciso hasta cierto punto..... si quieres precision, usa interrupciones siin carga en el timer y sin ir a la interrupcion(estar pendiente de que se desborde con el flag de activacion).. y por consiguiente usar otro cristal, por ahi esta posteado por el pana pocher como se hace con precision.... pero usar un micro para hacer un temporizador???? ......
Aqui hay un post referente a lo de la precision y muy bien explicado :
http://miarroba.com/foros/ver.php?foroid=6510&temaid=3132687  reviza el post del pana pocher

Salu2 !!

Desconectado mariosaul

  • PIC10
  • *
  • Mensajes: 21
RE: Microcursillo en C
« Respuesta #216 en: 11 de Enero de 2005, 19:15:00 »
saludos pana!
otra pregunta mas:
¿Solo con cambiar el nombre de la libreria al comienzo del codigo se adapta mi programa de un pic a otro?,
¿que diferencias hay que considerar al programar para uno u otro pic? (ademas del numero de pines, y frecuencia del cuarzo)

juaco

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: Microcursillo en C
« Respuesta #217 en: 12 de Enero de 2005, 12:10:00 »
Que onda mariosaul,
Eso seria lo mas importante, aparte de el leer el DS del pic a usar, para ver que cuente con los modulos hardware(ccp,a/d,mssp{spi,i2c},usart,psp,etc..) que se han usado en el codigo que piensas adaptar a tu otro proyecto, si es asi en que pines y funcionamiento,....
Recuerda que mientras mas sepas del pic, mas puedes personalizar ,optimizandolo, tu proyecto.

Salu2 pana

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Microcursillo en C
« Respuesta #218 en: 17 de Enero de 2005, 13:14:00 »
Hola a todos, les dejo un programita que lee y escribe muy básicamente la fecha y hora del ds1307. ;-)



//Programa que usa protocolo I2C para
//escribir y leer tiempo del DS1307
//saca tiempo en LCD

//migsantiago

// Conexiones de la LCD:
//     D0  enable
//     D1  rs
//     D2  rw
//     D4  D4
//     D5  D5
//     D6  D6
//     D7  D7
//
//   LCD pins D0-D3 are not used and PIC D3 is not used.

#include <16f877a.h>
#fuses xt,nowdt,noput,nobrownout,nolvp,noprotect
#use delay(clock=4000000)

#include "lcd.c"
#use standard_io (D)


#use fast_io (b)

#use i2c(MASTER, SDA=PIN_b1, SCL=PIN_b0,slow)

//Registros DS1307
#define ds_seconds 0x00
#define ds_minutes 0x01
#define ds_hours 0x02
#define ds_day 0x03
#define ds_date 0x04
#define ds_month 0x05
#define ds_year 0x06
#define ds_control 0x07

//DS1307
//Vbat a tierra

void main(void)
{

int16 retardo; //Cada cuando actualiza lectura en LCD

//Dato en registro ds, a mandar o leer
int seconds,minutes,hours,day,date,month,year,control;

retardo=250; //ms a tardar entre lectura y lectura

//Justo cuando prende circuito, la fecha que establece es la siguiente
seconds= 0x00;
minutes= 0x38;
hours  = 0x15; //modo 24 hrs
day    = 0x05; //1 es domingo
date   = 0x13;
month  = 0x01;
year   = 0x05;
control= 0x00; //OUT=0 SQWE=0 RS0-1=0 no hay onda cuadrada


//Establece fecha y hora
i2c_start(); //Inicia I2C
i2c_write(0xd0); //Direcciona DS1307 write
i2c_write(ds_seconds); //Indica que empiece en registro ds_seconds
//Aquí establece fecha y hora respecto a la puesta arriba
i2c_write(seconds);
i2c_write(minutes);
i2c_write(hours);
i2c_write(day);
i2c_write(date);
i2c_write(month);
i2c_write(year);
i2c_write(control);
i2c_stop(); //Ya puso la hora y fecha
//El RTC ya está marcando el tiempo y fecha

//Rutina LCD
lcd_init(); //Inicia LCD
lcd_putc("f"); //Limpia LCD
lcd_putc("Real Time Clock
"); //rtc
lcd_putc("     DS1307");
delay_ms(3000);

while(1)
   {

   delay_ms(retardo); //Usuario lee


   //Obtiene datos de DS1307
   i2c_start(); //Inicia I2C
   i2c_write(0xd0); //Direcciona DS1307 write
   i2c_write(ds_seconds); //Indica que ponga registro en ds_seconds
   i2c_stop();

   i2c_start();
   i2c_write(0xd1); //Lee DS1307
   seconds = i2c_read();
   minutes = i2c_read();
   hours = i2c_read();
   day = i2c_read();
   date = i2c_read();
   month = i2c_read();
   year = i2c_read(0); //no ack
   i2c_stop();

   //Representa datos en la LCD
   printf(lcd_putc,"f%2x-%2x-20%2x
",date,month,year); //dd-mm-year
   printf(lcd_putc,"%2x:%2x:%2x",hours,minutes,seconds); //23:59:59
   }
}





Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: Microcursillo en C
« Respuesta #219 en: 21 de Enero de 2005, 14:22:00 »
Muy buen programa pana Rebotado

Salu2

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: Microcursillo en C
« Respuesta #220 en: 21 de Enero de 2005, 16:15:00 »
El amigo Lager nos sorprende ahora con un buenisimo trabajo para trastear con un HD en modo LBA.

http://personal.auna.com/asencio5/Ejemplos%20C/PROYECTOS/

Gracias mil Lager

migsantiago,en cuanto me instale un compilador y pueda compilar tu código subo el tuyo.
Saludos

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Microcursillo en C
« Respuesta #221 en: 23 de Enero de 2005, 18:53:00 »
ups... ahora que lo dices se me olvidó mandarte el hex Vacilando

Pero no sé si se pueda emular en Proteus, porque cuando lo intenté me marcaba que no tenía el modelo del DS1307.

Oye Modulay, supongo que un HD es un Hard Disk y ¿LBA qué es?

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: Microcursillo en C
« Respuesta #222 en: 23 de Enero de 2005, 19:23:00 »
Creo que es el modo de acceso al disco (Large block access o address o algo asíGiño,migsantiago,aunque creo q te lo podrán explicar mejor Lager o manex.
A ver si me puedes mandar el código compilado y ya veremos como hacemos para simular en proteus

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: Microcursillo en C
« Respuesta #223 en: 24 de Enero de 2005, 00:17:00 »
Que onda panas, LBA(linear Block Addreessing), CHS( Cylinder-Head-Sector), los dos modos son utilizables, pero el mas sencillo es el LBA, con AMBOS se puede accesar al disco en FAT,FAT16 o FAT32, lo unico que cambia son las comprobaciones. El codigo para FAT32 ya esta listo, de hecho se hace el mismo acceso via LBA. Nada mas les hago una imagen de prueba(formato fat32) para simularlo con proteus  para que vean como es su funcionamiento.. y que me desocupe un poco del trabajo y se lo envio a el pana Modulay. Pero con el ejemplo de lba pueden hacer la rutina, para fat, es muy sencilla, sobre todo que solo la usaremos(por ahora,...jajaja) para escribir y leer de ahi.

Salu2 panas

Afprog

  • Visitante
RE: Microcursillo en C
« Respuesta #224 en: 03 de Febrero de 2005, 15:42:00 »
hola a todos.

soy nuevo en esto de programar micros en c pero me gusta y me interesa mucho ya he mirado varias veses y concegui un compilador diferente al css porque este no me funciono y queria averiguar sobre una libreria que ustedes usan para visualizar en lcd y me gustaria conseguirla y aprender a usarla.

les agradesco si me ayudan mi mail es aalzate86@tutopia.com.

gracias

att: andres (colombia);