TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: lolix en 13 de Abril de 2008, 16:19:30
-
Hola a todos,
Me acabo de comprar la placa entrenadora EasyPic5, que viene con el PIC 16f877a
http://www.mikroe.com/en/tools/easypic5/
Me he probado todos los ejemplos que tienen y la verdad, la placa funciona muy bien, peor ahora es donde me viene mi problemilla.
Quiero desarrollar un programilla a en lenguaje ensamblador y para empezar un programilla tonto que encienda los LEDS
Genero el *.hex con el MPLAB, y cuando lo simulo con el PIC Simulator IDE, lo veo todo correcto, pero cuando programo el micro con el PICFlash (el software que me venia) el programa no hace nada... la verdad es que no se que estoy haciendo mal.
El programa es este... es bastante facilon:
PROCESSOR 16f887a
#include <p16f887.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;***** Variable declaration *****
Cblock 0x20 ; First free RAM location
endc ; No variables
;;***** Program memory structure *****
ORG 0x00 ; Reset vector
goto Main ; After reset jump to this location
ORG 0x04 ; Interrupt vector
goto Main ; No interrupt routine
Main
bsf STATUS, RP0
movlw 0x00
movwf TRISB
bcf STATUS, RP0
movlw 0xFF ; W=FF
movwf PORTB ; Move W to port B
aLoop
goto Loop ; Jump to label Loop
End
Alguien sabe que me puede estar pasando?
No se, yo creo que el problema me viene con el MPLAB al generar el HEX, pero ya no tengo ni idea
-
Te falta la a en el include, el 16f877 no es igual al 16f877a, prueba a ver...
-
Al poner en el include el p16f877a me da este error:
Error[105] C:\PROYECTOS\EJERCICIOS\EJ1\EJ1.ASM 7 : Cannot open file (Include File "p16f887a.inc" not found)
Pero el fichero p16f877a.inc existe y esta en la misma carpeta que el p16f877
-
Que tal lolix!
Mira chequea bien lo del include que te menciona el amigo.
Lo otro es que debes revizar bien el manual de la Easypic5 ten cuidado con los switch que posee por todos lados no vaya hacer que el problema este alli :mrgreen:
Saludos
-
Si cargo un programa hecho con el mikroC si que se me iluminan los leds, del puerto que sea.... por eso no creo que sea de ningun switch de la placa, pero no se....
Alguien tiene el EasyPic o sabe si tengo que cambiar algun switch?
De todas formas revisare lo de los includes....que creo que iran por ahi lo tiros.
-
Cual es el micro? el 16F877a o el 16F887? los estas mezclando y ahí esta el problema.
Tambien debes tener presente el cristal que estas usando si es mayor a 4MHz, (por lo general los easypic vienen con uno de 8MHz), debes utilizar _HS_OSC.
Tambien pones un salto a la etiqueta Loop pero la etiqueta de arriba es aloop, tienen que ser iguales.
La cosa quedaria así: con un cristal de 4MHz:
PROCESSOR 16f877a
#include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;***** Variable declaration *****
Cblock 0x20 ; First free RAM location
endc ; No variables
;;***** Program memory structure *****
ORG 0x00 ; Reset vector
goto Main ; After reset jump to this location
ORG 0x04 ; Interrupt vector
goto Main ; No interrupt routine
Main
bsf STATUS, RP0
movlw 0x00
movwf TRISB
bcf STATUS, RP0
movlw 0xFF ; W=FF
movwf PORTB ; Move W to port B
Loop
goto Loop ; Jump to label Loop
End
Recuerda que todos los compiladores de Microchip deben terminar el código con una linea en blanco para que compilen.
-
Buenos dias, yo tambien estoy aprendiendo esto de la programacion de microcontroladores, no he escrito todavia nunca aquí, por que considero que mi nivel, no es todavia suficiente como para empezar a preguntar cosas, primero tengo que aprender algo. Respecto a tu problemilla, comprueba tambien, que en el PicFlash, estes poniendo correctamente los fuses, por que a mi me ha sucedido que despues de realizar el programa en el MPLab, comprobar que esté correcto y todo, al grabarlo, no funciona, y era de no poner los fuses correctamente, ya que si grabas algo como dices, en mikroC, este ya le pasa los parametros en perfectas condiciones al picflash.
Yo tengo la EasyPic 4 y eso era lo que a mi me pasaba.
Un saludo y suerte
-
Hola,
Al final salio.... al final tenia mal configurado los fuses del picflash...... bueno, la verdad es que ponia bien la configuracion, cargaba el HEX, con lo que me lo reconfiguraba mal y al escribir pues... eso... no me hacia nada.
Muchas gracias a tod@s
-
Eso es raro pues yo he hecho programas en mplab y luego programo en el esaypic4 sin cambiar fuses en el picflash y funciona perfecto.
-
hola, tengo la placa entrenadora easypic5, ya probe el codigo de ejemplo para el display de siete segmentos que realiza cuatro demostraciones pero solamente activa dos, necesito que alguien me ayude, como hago para activarlos todos?, este es el codigo:
#include "Display_utils.h"
unsigned short shifter, portd_index;
unsigned int digit, number;
unsigned short portd_array[4];
void interrupt() {
PORTA = 0; // Turn off all 7seg displays
PORTD = portd_array[portd_index]; // bring appropriate value to PORTD
PORTA = shifter; // turn on appropriate 7seg. display
// move shifter to next digit
shifter <<= 1;
if (shifter > 8u)
shifter = 1;
// increment portd_index
portd_index++ ;
if (portd_index > 3u)
portd_index = 0; // turn on 1st, turn off 2nd 7seg.
TMR0 = 0; // reset TIMER0 value
INTCON = 0x20; // Clear T0IF
}//~
void main() {
ANSEL = 0; // Set AN pins to Digital I/O
ANSELH = 0;
OPTION_REG = 0x80; // Timer0 settings
digit = 0;
portd_index = 0;
shifter = 1;
TMR0 = 0;
INTCON = 0xA0; // Enable GIE, T0IE
PORTA = 0;
TRISA = 0; // Set PORTA as output
PORTD = 0;
TRISD = 0; // Set PORTD as output
number = 6789; // some initial value
do {
digit = number / 1000u ; // extract thousands digit
portd_array[3] = mask(digit); // and store it to PORTD array
digit = (number / 100u) % 10u; // extract hundreds digit
portd_array[2] = mask(digit); // and store it to PORTD array
digit = (number / 10u) % 10u; // extract tens digit
portd_array[1] = mask(digit); // and store it to PORTD array
digit = number % 10u; // extract ones digit
portd_array[0] = mask(digit); // and store it to PORTD array
Delay_ms(1000); // one second delay
number++ ; // increment number
if (number > 999u)
number = 0;
} while(1); // endless loop
}