Autor Tema: Portar un programa de Arduino a un PIC 16f648A  (Leído 3541 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado riscking

  • PIC10
  • *
  • Mensajes: 2
Portar un programa de Arduino a un PIC 16f648A
« en: 03 de Mayo de 2011, 21:16:55 »
Hola soy nuevo por aquí, pero a ver si me podeis hechar una mano a portar un programa a este mundillo de los PIC, el caso esque yo uso arduino pero ha caido en mis manos este PIC 16f648A y el programa que es para controlar un display a traves de un 74HC595, creo q con este pic es mas q suficiente para el proyecto, el programa es mas caompleto pero lo he reducido para ir aprendiendo, tampoco quiero que me lo deis hecho quiero aprender de donde salen las cosas.

Con la declaracion de las variables y pins me lio, creo q en el PIC solo con declarar los puertos vale, entonces serian 3 salidas y una entrada q es un boton.
digitalwrite cuando esta en HIGH seria por lo que he leido como output_high(pin) y cuando esta en LOW output_low(pin).
Código: [Seleccionar]


byte nArray[10];
byte nArray2[10];
byte estadoboton1=0;
int d=7;

void setup() {
 pinMode(pin9, OUTPUT);
 pinMode(pin4, OUTPUT);
 pinMode(pin10, OUTPUT);
 pinMode(pin3,INPUT);
  nArray2[0] = 0x40; // 0
  nArray2[1] = 0x79; // 1
  nArray2[2] = 0x24; // 2
  nArray2[3] = 0x30; // 3
  nArray2[4] = 0x19; // 4
  nArray2[5] = 0x12; // 5
  nArray2[6] = 0x02; // 6
  nArray2[7] = 0x58; // 7
  nArray2[8] = 0x00; // 8
  nArray2[9] = 0x10; // 9
  digitalWrite(latchPin, 0);
  shiftOut(dataPin, clockPin,MSBFIRST, nArray2[7]);
  digitalWrite(latchPin, 1);
}

void loop() {
estadoboton1 = digitalRead(boton1);  
    
    if(estadoboton1 == HIGH) {
      
      if(d>0){ d--;
      
        digitalWrite(latchPin, 0);
  shiftOut(dataPin, clockPin,MSBFIRST, nArray2[d]);
  digitalWrite(latchPin, 1);
  
   delay(500);
  
      }
      else{d=9;}
      
      }
  
    }

}

Segun mis casi nulos conocimientos el incio de la portacion seria algo así:

Código: [Seleccionar]
#include <16f628a.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
#use fast_io(b)

byte nArray[10]={0x40, 0x79, 0x24, 0x30, 0x19,0x12,0x02, 0x58, 0x00,0x10}
byte estadoboton1=0;
int d=7;

void main(void)
{
set_tris_b(0x00001000); //puertos rb0-2 como salida y rb3 como entrada
disable_interrupts(GLOBAL); //todas interrupciones desactivadas lo he leido por ahi pero no se para que sirve

estadoboton1 = input_state(PIN_B3)    
    if(estadoboton1 == HIGH) {
      
      if(d>0){ d--;
      output_low(PORT_B2)
  shiftOut(PORT_B0, PORT_B1,MSBFIRST, nArray2[d]); // la funcion esta creo q si existe pero no se si funciona igual
  output_high(PORT_B2)
  
   delay(500); //esto no se si existe en ccs o es de otra forma  
      }
      else{d=9;}      
      }  
    }

Seguro que  he metido varios hachazos pero a ver que os parece o como mejorarlo.
« Última modificación: 03 de Mayo de 2011, 22:28:01 por riscking »

Desconectado Alcaparrones

  • PIC10
  • *
  • Mensajes: 17
Re: Portar un programa de Arduino a un PIC 16f648A
« Respuesta #1 en: 04 de Mayo de 2011, 14:06:03 »
Buenas

A ver si te puedo echar una mano. Supondré que usas el compilador de CCS. El caso es que de vez en cuando porto algún código desde arduino, ya que la gran popularidad que está consiguiendo esa plataforma entre los aficionados (tu y yo, por ejemplo) hace que practicamente todos los proyectos interesantes a gran escala que se hacen estén programados para la susodicha plataforma. Pero yo sigo fiel a los PIC, ya sea porque me gusta montar mi propio hardware o porque no me apetece lidiar con otro compilador.

Bueno, vamos al grano.

Código: [Seleccionar]
byte nArray[10]={0x40, 0x79, 0x24, 0x30, 0x19,0x12,0x02, 0x58, 0x00,0x10}
byte estadoboton1=0;
Defines esas variables como de tipo "byte". Eso no existe en este compilador. Existe #Byte (refierete a la ayuda de CCS para lo que no te explique, es muy completa). Define la tabla como int, variables numericas de 8 bits, y estado boton como boolean, o short, varible de 1 bit.

Código: [Seleccionar]
set_tris_b(0x00001000); //puertos rb0-2 como salida y rb3 como entrada
Esta linea creo que está bien. De todas formas en CCS ya no es común, salvo en ocasiones donde necesites el máximo rendimiento, usar set_tris puesto que el propio compilador se encarga de averiguar si los pines que vas a usar son de entrada o salida. En tu código te puedes ahorrar esta linea (y el #FAST_IO).

Código: [Seleccionar]
disable_interrupts(GLOBAL); //todas interrupciones desactivadas lo he leido por ahi pero no se para que sirve Como su propio nombre indica, este comando desactiva todas las interrupciones, tales como los timers por ejemplo. ¿En arduino no existen las interrupciones? supongo que si...

Código: [Seleccionar]
    if(estadoboton1 == HIGH) {No estoy seguro de que HIGH equivalga a 1, que es lo que creo que buscas. En todo caso yo pondría TRUE, o directamente 1.

Código: [Seleccionar]
shiftOut(PORT_B0, PORT_B1,MSBFIRST, nArray2[d]); // la funcion esta creo q si existe pero no se si funciona igualSi compilas esto CCS creerá que le hablas en egipcio antiguo. Por lo que he averiguado el 74HC595 es un registro de desplazamiento que usa SPI. Supongo que este comando intenta enviar la tabla a través de SPI. Pues bien, primero tienes que configurar la conexión y después usar los comandos adecuados. Todo está en la ayuda.

Código: [Seleccionar]
delay(500); //esto no se si existe en ccs o es de otra forma En CCS tienes que decirle al compilador si el delay es en microsegundos o milisegundos. En este caso serían milisegundos: delay_ms(500);


Por otro lado veo que defines la variable "d" como variable global. Eso consume más memoria, como es simplemente una varible para el for definela localmente en el main(). Además, usas "PORT_B2" para referirte al pin B2, en CCS se usaría "PIN_B2", "PIN_B1", "PIN_B0"...

Y por tiquismiquis...
Código: [Seleccionar]
else{d=9;}Aquí los corchetes sobran, este else solo tiene un comando.

Hasta aquí. Ahora que lo pienso, la mayoría de cosas que te he advertido te lo hubiera señalado sin problema el compilador. Qué barbaridad, lo que hace el aburrimiento  :D

Un saludo.



Desconectado riscking

  • PIC10
  • *
  • Mensajes: 2
Re: Portar un programa de Arduino a un PIC 16f648A
« Respuesta #2 en: 07 de Mayo de 2011, 14:29:33 »
Hola Alcaparrones, he conseguido hacer el shifout en una funcion y en arduino me funciona bien pero aqui no hay manera, me da un warning en un for q dice q siempre esta a TRUE y no se si entra y no sale de ahi, pongo el codigo. POr lo demas ya le voy cogiendo el triquillo a esto.

Código: [Seleccionar]
int nArray[10]={0x40, 0x79, 0x24, 0x30, 0x19,0x12,0x02, 0x58, 0x00,0x10};
//int estadoboton1=0;
//int d=7;
void shiftout2(int myDataOut);
void main()
{   
  shiftout2( nArray[7]);
  delay_ms(1000);   
    }

void shiftOut2(int myDataOut)
{
output_low(PIN_B2);
  //internal function setup
  int i=0;
  int pinState;

  //clear everything out just in case to
  //prepare shift register for bit shifting
  //digitalWrite(myDataPin, 0);
  //digitalWrite(myClockPin, 0);
output_low(PIN_B0);
output_low(PIN_B1);
  //for each bit in the byte myDataOut?
  //NOTICE THAT WE ARE COUNTING DOWN in our for loop
  //This means that %00000001 or "1" will go through such
  for (i=7; i>=0; i--)  {       //AQUI ES DONDE DA EL ERROR
    //digitalWrite(myClockPin, 0);
output_low(PIN_B1);
    //if the value passed to myDataOut and a bitmask result
    // true then... so if we are at i=6 and our value is
    // %11010100 it would the code compares it to %01000000
    // and proceeds to set pinState to 1.
    if ( myDataOut & (1<<i) ) {
      pinState= 1;
    }
    else {   
      pinState= 0;
    }

    //Sets the pin to HIGH or LOW depending on pinState
    //digitalWrite(myDataPin, pinState);
   if (pinState==1){output_high(PIN_B0);}else{ output_low(PIN_B0);}
    //register shifts bits on upstroke of clock pin 
    //digitalWrite(myClockPin, 1);
    output_high(PIN_B1);
    //zero the data pin after shift to prevent bleed through
   // digitalWrite(myDataPin, 0);
    output_low(PIN_B0);
  }

  //stop shifting
  //digitalWrite(myClockPin, 0);
  output_low(PIN_B1);
  output_high(PIN_B2);
}

Desconectado Alcaparrones

  • PIC10
  • *
  • Mensajes: 17
Re: Portar un programa de Arduino a un PIC 16f648A
« Respuesta #3 en: 08 de Mayo de 2011, 09:30:24 »
Hola

No sé cual es el problema en ese for, yo lo veo bien. La verdad es que no recuerdo si por defecto una variable int en PIC C es signed o unsigned (usa o no usa números negativos). Define la variable i como signed por si acaso, o directamente cambia el for para que en vez de restar sume, por ejemplo:

for (i=0; i<=7; i++)  {  }

Un saludo.