FAQ FAQ  •  Buscar Buscar  •  Registrarse Registrarse  •  Entre para ver sus mensajes privados Entre para ver sus mensajes privados  • Login Login

Guardar datos en la EEPROM interna del PIC

Índice de los Foros Electronica Facil » FOROS ELECTRONICA » Microcontroladores PIC
Publicar nuevo tema   Responder al tema
Ver tema anteriorEntre para ver sus mensajes privadosVer tema siguiente
AutorMensaje
Meta
Asunto: Guardar datos en la EEPROM interna del PIC MensajePublicado: 27 Ago, 2009 - 02:50
Experto
Experto


Registrado: 03 Sep, 2008
Mensajes: 125

Hola:

Tengo medio hecho unos códigos del PIC16F84A-04, quiero grabar los Relay_1 al Relay_4 en la EEPROM, es decir, los últimos estados de los relés en ON o OFF. Aún así sigo intentado pero si les sale el código mejor que el mio, mejor que mejor.

Código
  1. <br />
  2. ;************************************ Meta_Control.asm **************************************
  3. <br />
  4. ;
  5. <br />
  6. ;   ===================================================================
  7. <br />
  8. ;     Del libro &quot;MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS&quot;
  9. <br />
  10. ;     E. Palacios, F. Remiro y L. López.      www.pic16f84a.org
  11. <br />
  12. ;     Editorial Ra-Ma.  <!-- w --><a href="http://www.ra-ma.es" target="_blank">www.ra-ma.es</a><!-- w -->
  13. <br />
  14. ;   ===================================================================
  15. <br />
  16. ;
  17. <br />
  18. ; SISTEMA DE GOBIERNO DESDE ORDENADOR: Desde el teclado de un ordenador se desea comandar
  19. <br />
  20. ; el movimiento de una estructura móvil, según la siguiente tabla:
  21. <br />
  22. ;
  23. <br />
  24. ;   TECLA (Por ejemplo)        MOVIMIENTO
  25. <br />
  26. ;   -------------------        ----------
  27. <br />
  28. ;         t        Adelante
  29. <br />
  30. ;         b        Atrás
  31. <br />
  32. ;         a        Izquierda
  33. <br />
  34. ;         l        Derecha
  35. <br />
  36. ;        Espacio         Parada
  37. <br />
  38. ;
  39. <br />
  40. ; La pulsación de cualquiera de estas teclas activa el estado de las salidas correspondiente
  41. <br />
  42. ; RB3 (Adelante), RB2 (Atrás), RB1 (Izquierda), RB0 (Derecha) y apaga el resto.
  43. <br />
  44. ;
  45. <br />
  46. ; El movimiento que se está realizando aparece reflejado en un mensaje en el visualizador LCD
  47. <br />
  48. ; del sistema y también en la pantalla del ordenador.
  49. <br />
  50. ;
  51. <br />
  52. ; El programa debe permitir modificar facilmente en posteriores revisiones en el hardware de
  53. <br />
  54. ; la salida. Es decir, para activar las salidas conviene utilizar el direccionamiento por bit
  55. <br />
  56. ; en lugar de por byte (utilizar instrucciones &quot;bsf&quot; y &quot;bcf&quot;, en lugar de &quot;mov..&quot;).
  57. <br />
  58. ;
  59. <br />
  60. ; ZONA DE DATOS **********************************************************************
  61. <br />
  62.  
  63. <br />
  64.     list        P=16F84A
  65. <br />
  66.     include  &lt;P16F84A.INC&gt;
  67. <br />
  68.     __CONFIG    _CP_OFF &amp;  _WDT_OFF &amp; _PWRTE_ON &amp; _XT_OSC
  69. <br />
  70.  
  71. <br />
  72.     CBLOCK   0x0C      
  73. <br />
  74.     TeclaPulsada                    ; Va a guardar el contenido de la tecla pulsada.
  75. <br />
  76.     MensajeApuntado     ; Va a guarda la dirección del mensaje apuntado.
  77. <br />
  78.     Relay_1
  79. <br />
  80.     Relay_2
  81. <br />
  82.     Relay_3
  83. <br />
  84.     Relay_4
  85. <br />
  86.     ENDC
  87. <br />
  88.  
  89. <br />
  90. #DEFINE  SalidaR1      PORTB,3    ; Define dónde se sitúan las salidas.
  91. <br />
  92. #DEFINE  SalidaR2      PORTB,2
  93. <br />
  94. #DEFINE  SalidaR3      PORTB,1
  95. <br />
  96. #DEFINE  SalidaR4      PORTB,0
  97. <br />
  98.  
  99. <br />
  100.  
  101. <br />
  102. TECLA_RELE_1_ON  EQU  'q'            ; Código de las teclas utilizadas.
  103. <br />
  104. TECLA_RELE_1_OFF    EQU 'a'
  105. <br />
  106. TECLA_RELE_2_ON  EQU  'w'
  107. <br />
  108. TECLA_RELE_2_OFF    EQU 's'
  109. <br />
  110. TECLA_RELE_3_ON  EQU  'e'
  111. <br />
  112. TECLA_RELE_3_OFF    EQU 'd'
  113. <br />
  114. TECLA_RELE_4_ON  EQU  'r'
  115. <br />
  116. TECLA_RELE_4_OFF    EQU 'f'
  117. <br />
  118. TECLA_INICIO        EQU 'z'
  119. <br />
  120. TECLA_PARADA        EQU ' '
  121. <br />
  122. TECLA_INFO      EQU 'i'            ; Código de la tecla espaciadora, (hay un espacio,
  123. <br />
  124.                                     ; tened cuidado al teclear el programa).
  125. <br />
  126. ENTER         EQU    0x0A            ; Código de tecla &quot;Enter&quot; o &quot;Retorno de Carro&quot;.
  127. <br />
  128. CAMBIO_LINEA    EQU 0x0D   ; Código para el cambio de línea.
  129. <br />
  130.  
  131. <br />
  132.     ORG 0x2100                  ; Corresponde a la dirección 0 de la zona EEPROM
  133. <br />
  134.                                     ; de datos.
  135. <br />
  136.     DE  0x00, 0x00, 0x00, 0x00
  137. <br />
  138.  
  139. <br />
  140. ; ZONA DE CÓDIGOS ********************************************************************
  141. <br />
  142.  
  143. <br />
  144.     ORG 0
  145. <br />
  146. Inicio
  147. <br />
  148.     call    LCD_Inicializa
  149. <br />
  150.     call    RS232_Inicializa
  151. <br />
  152.     bsf  STATUS,RP0            ; Configura como salidas las 4 líneas del
  153. <br />
  154.     bcf  SalidaR1   ; del Puerto B respetando la configuración del
  155. <br />
  156.     bcf  SalidaR2    ; resto de las líneas.
  157. <br />
  158.     bcf  SalidaR3
  159. <br />
  160.     bcf  SalidaR4
  161. <br />
  162.     bcf  STATUS,RP0
  163. <br />
  164.     call    Parado          ; En principio todas las salidas deben estar
  165. <br />
  166. Principal                     ; apagadas.
  167. <br />
  168.     call    RS232_LeeDato         ; Espera a recibir un carácter.
  169. <br />
  170.     call    TesteaTeclado
  171. <br />
  172.     goto    Principal
  173. <br />
  174.  
  175. <br />
  176. ; &quot;Mensajes&quot; ----------------------------------------------------------------------------
  177. <br />
  178. ;
  179. <br />
  180. Mensajes
  181. <br />
  182.     addwf   PCL,F
  183. <br />
  184. MensajeParado
  185. <br />
  186.     DT &quot;Sistema PARADO&quot;, 0x00
  187. <br />
  188. Mensaje_R1_ON
  189. <br />
  190.     DT &quot;RELE 1 ON&quot;, 0x00
  191. <br />
  192. Mensaje_R1_OFF
  193. <br />
  194.     DT &quot;RELE 1 OFF&quot;, 0x00
  195. <br />
  196. Mensaje_R2_ON
  197. <br />
  198.     DT &quot;RELE 2 ON&quot;, 0x00
  199. <br />
  200. Mensaje_R2_OFF
  201. <br />
  202.     DT &quot;RELE 2 OFF&quot;, 0x00
  203. <br />
  204. Mensaje_R3_ON
  205. <br />
  206.     DT &quot;RELE 3 ON&quot;, 0x00
  207. <br />
  208. Mensaje_R3_OFF
  209. <br />
  210.     DT &quot;RELE 3 OFF&quot;, 0x00
  211. <br />
  212. Mensaje_R4_ON
  213. <br />
  214.     DT &quot;RELE 4 ON&quot;, 0x00
  215. <br />
  216. Mensaje_R4_OFF
  217. <br />
  218.     DT &quot;RELE 4 OFF&quot;, 0x00
  219. <br />
  220. Mensaje_Info
  221. <br />
  222. ;   DT 0xC9, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xBB
  223. <br />
  224. ;   DT ENTER, CAMBIO_LINEA
  225. <br />
  226.     DT 0xBA, &quot; FirmWare v1.00     &quot;, 0xBA
  227. <br />
  228.     DT ENTER, CAMBIO_LINEA
  229. <br />
  230.     DT 0xBA, &quot; PIC16F84A          &quot;, 0xBA
  231. <br />
  232.     DT ENTER, CAMBIO_LINEA
  233. <br />
  234.     DT 0xBA, &quot; 4 MHz              &quot;, 0xBA
  235. <br />
  236. ;   DT ENTER, CAMBIO_LINEA
  237. <br />
  238. ;   DT 0xCC, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xB9
  239. <br />
  240.     DT ENTER, CAMBIO_LINEA
  241. <br />
  242.     DT &quot;  <!-- e --><a href="mailto:metaconta@gmail.com">metaconta@gmail.com</a><!-- e -->&quot;, 0x00
  243. <br />
  244. Mensaje_Activar
  245. <br />
  246.     DT &quot;Todos activos&quot;, 0x00
  247. <br />
  248.  
  249. <br />
  250. ; Subrutina &quot;TesteaTeclado&quot; -------------------------------------------------------------
  251. <br />
  252. ;
  253. <br />
  254. ; Testea el teclado y actúa en consecuencia.
  255. <br />
  256.  
  257. <br />
  258. TesteaTeclado
  259. <br />
  260.     movwf   TeclaPulsada         ; Guarda el contenido de la tecla pulsada.
  261. <br />
  262.     xorlw   TECLA_RELE_1_ON            ; ¿Es la tecla del movimiento hacia adelante?
  263. <br />
  264.     btfsc   STATUS,Z
  265. <br />
  266.     goto    R1_ON            ; Sí, se desea movimiento hacia adelante.
  267. <br />
  268. ;
  269. <br />
  270.     movf    TeclaPulsada,W      ; Recupera el contenido de la tecla pulsada.
  271. <br />
  272.     xorlw   TECLA_RELE_1_OFF         ; ¿Es la tecla del movimiento hacia atrás?
  273. <br />
  274.     btfsc   STATUS,Z
  275. <br />
  276.     goto    R1_OFF          ; Sí, se desea movimiento hacia atrás.
  277. <br />
  278. ;
  279. <br />
  280.     movf    TeclaPulsada,W      ; Recupera el contenido de la tecla pulsada.
  281. <br />
  282.     xorlw   TECLA_RELE_2_ON                ; ¿Es la tecla del movimiento hacia la izquierda?
  283. <br />
  284.     btfsc   STATUS,Z
  285. <br />
  286.     goto    R2_ON            ; Sí, se desea movimiento hacia la izquierda.
  287. <br />
  288. ;
  289. <br />
  290.     movf    TeclaPulsada,W      ; Recupera el contenido de la tecla pulsada.
  291. <br />
  292.     xorlw   TECLA_RELE_2_OFF            ; ¿Es tecla del movimiento hacia la derecha?
  293. <br />
  294.     btfsc   STATUS,Z
  295. <br />
  296.     goto    R2_OFF        ; Sí, se desea movimiento hacia la derecha.
  297. <br />
  298. ;
  299. <br />
  300.     movf    TeclaPulsada,W     
  301. <br />
  302.     xorlw   TECLA_RELE_3_ON               
  303. <br />
  304.     btfsc   STATUS,Z
  305. <br />
  306.     goto    R3_ON            
  307. <br />
  308. ;
  309. <br />
  310.     movf    TeclaPulsada,W     
  311. <br />
  312.     xorlw   TECLA_RELE_3_OFF            
  313. <br />
  314.     btfsc   STATUS,Z
  315. <br />
  316.     goto    R3_OFF       
  317. <br />
  318. ;
  319. <br />
  320.     movf    TeclaPulsada,W     
  321. <br />
  322.     xorlw   TECLA_RELE_4_ON               
  323. <br />
  324.     btfsc   STATUS,Z
  325. <br />
  326.     goto    R4_ON            
  327. <br />
  328. ;
  329. <br />
  330.     movf    TeclaPulsada,W     
  331. <br />
  332.     xorlw   TECLA_RELE_4_OFF            
  333. <br />
  334.     btfsc   STATUS,Z
  335. <br />
  336.     goto    R4_OFF         
  337. <br />
  338. ;
  339. <br />
  340.     movf    TeclaPulsada,W     
  341. <br />
  342.     xorlw   TECLA_INICIO            
  343. <br />
  344.     btfsc   STATUS,Z
  345. <br />
  346.     goto    Activar     
  347. <br />
  348. ;
  349. <br />
  350.     movf    TeclaPulsada,W     
  351. <br />
  352.     xorlw   TECLA_INFO    
  353. <br />
  354.     btfsc   STATUS,Z
  355. <br />
  356.     goto    Info                   
  357. <br />
  358. ;
  359. <br />
  360.     movf    TeclaPulsada,W      ; Recupera el contenido de la tecla pulsada.
  361. <br />
  362.     xorlw   TECLA_PARADA         ; ¿Es la tecla de parada?.
  363. <br />
  364.     btfss   STATUS,Z
  365. <br />
  366.     goto    Fin      ; No es ninguna tecla de movimiento. Sale.
  367. <br />
  368. Parado
  369. <br />
  370.     bcf  SalidaR1   ; Como se ha pulsado la tecla de parada se
  371. <br />
  372.     bcf  SalidaR2    ; desactivan todas las salidas.
  373. <br />
  374.     bcf  SalidaR3
  375. <br />
  376.     bcf  SalidaR4
  377. <br />
  378.     movlw   MensajeParado
  379. <br />
  380.     goto    Visualiza
  381. <br />
  382. R1_ON
  383. <br />
  384.     bsf  SalidaR1
  385. <br />
  386.     movlw   Mensaje_R1_ON
  387. <br />
  388.     goto    Visualiza
  389. <br />
  390. R1_OFF
  391. <br />
  392.     bcf  SalidaR1
  393. <br />
  394.     movlw   Mensaje_R1_OFF
  395. <br />
  396.     goto    Visualiza
  397. <br />
  398. R2_ON
  399. <br />
  400.     bsf  SalidaR2
  401. <br />
  402.     movlw   Mensaje_R2_ON
  403. <br />
  404.     goto    Visualiza
  405. <br />
  406. R2_OFF
  407. <br />
  408.     bcf  SalidaR2
  409. <br />
  410.     movlw   Mensaje_R2_OFF
  411. <br />
  412.     goto    Visualiza
  413. <br />
  414. R3_ON
  415. <br />
  416.     bsf  SalidaR3
  417. <br />
  418.     movlw   Mensaje_R3_ON
  419. <br />
  420.     goto    Visualiza
  421. <br />
  422. R3_OFF
  423. <br />
  424.     bcf  SalidaR3
  425. <br />
  426.     movlw   Mensaje_R3_OFF
  427. <br />
  428.     goto    Visualiza
  429. <br />
  430. R4_ON
  431. <br />
  432.     bsf  SalidaR4
  433. <br />
  434.     movlw   Mensaje_R4_ON
  435. <br />
  436.     goto    Visualiza
  437. <br />
  438. R4_OFF
  439. <br />
  440.     bcf  SalidaR4
  441. <br />
  442.     movlw   Mensaje_R4_OFF
  443. <br />
  444.     goto    Visualiza
  445. <br />
  446. Activar
  447. <br />
  448.     bsf  SalidaR1   ; Como se ha pulsado la tecla de parada se
  449. <br />
  450.     bsf  SalidaR2    ; desactivan todas las salidas.
  451. <br />
  452.     bsf  SalidaR3
  453. <br />
  454.     bsf  SalidaR4
  455. <br />
  456.     movlw   Mensaje_Activar
  457. <br />
  458.     goto    Visualiza
  459. <br />
  460. Info
  461. <br />
  462.     movlw   Mensaje_Info
  463. <br />
  464.  
  465. <br />
  466. ; Según el estado de las salidas visualiza el estado del sistema en el visualizador LCD y en
  467. <br />
  468. ; el monitor del ordenador.
  469. <br />
  470.  
  471. <br />
  472. Visualiza
  473. <br />
  474.     movwf   MensajeApuntado            ; Guarda la posición del mensaje.
  475. <br />
  476.     call    LCD_Borra            ; Borra la pantalla del modulo LCD.
  477. <br />
  478.     movf    MensajeApuntado,W      ; Visualiza el mensaje en la pantalla
  479. <br />
  480.     call    LCD_Mensaje    ; del visualizador LCD.
  481. <br />
  482.     call    RS232_LineasBlanco    ; Borra la pantalla del ordenador.
  483. <br />
  484.     movf    MensajeApuntado,W
  485. <br />
  486.     call    RS232_Mensaje         ; Lo visualiza en el HyperTerminal.
  487. <br />
  488.     call    RS232_LineasBlanco
  489. <br />
  490. Fin return
  491. <br />
  492.  
  493. <br />
  494.     include  &lt;RS232.INC&gt;
  495. <br />
  496.     include  &lt;RS232MEN.INC&gt;
  497. <br />
  498.     include  &lt;LCD_4BIT.INC&gt;
  499. <br />
  500.     include  &lt;LCD_MENS.INC&gt;
  501. <br />
  502.     include  &lt;RETARDOS.INC&gt;
  503. <br />
  504.     include  &lt;EEPROM.INC&gt;
  505. <br />
  506.     end
  507. <br />


Un cordial saludo.

EDITO:
Lo estoy intentado en esta parte:
Código
  1. R1_ON
  2. <br />
  3.     clrw
  4. <br />
  5.     call    EEPROM_LeeDato
  6. <br />
  7.     movwf   Relay_1
  8. <br />
  9.  
  10. <br />
  11.     movf    Relay_1,W
  12. <br />
  13.     call    EEPROM_EscribeDato
  14. <br />
  15.  
  16. <br />
  17.     bsf  SalidaR1
  18. <br />
  19.     movlw   Mensaje_R1_ON
  20. <br />
  21.     goto    Visualiza


La idea es que si en el PORTB hay en la salida b'10100100', que se guarde ese valor del puerto B en la EEPROM. El motivo es por si se apaga la luz, se queda sin batería o cualquier otra cosa, al reiniciar el PIC de nuevo, lea los últimos valores que estaban antes de quedarse sin pilas.
 
 Ver perfil de usuario Enviar mensaje privado  
Responder citando Volver arriba
colgau
Asunto:  MensajePublicado: 31 Ago, 2009 - 10:23
Habitual
Habitual


Registrado: 06 Feb, 2009
Mensajes: 75
Ubicación: xixon
hola, pos la verdad esque nunca me habia planteao este problema, y supongo que el problema esta en la linea 3. Declaras a DE 0x00; asi debes poner el resto de variables relay que declaras en CBLOCK, cada uno con una direccion de lqa eeprom. Como no he leido el codigo porque entre librerias y ese programa me raya un poco(yo no uso MPLAB sino el block de notas), no se para que usas el DE, supongo que era con este objetivo, que almacenase los estados.Aún asi es solo una idea,esperemos que los expertos digan algo.
Un saludo
 
 Ver perfil de usuario Enviar mensaje privado  
Responder citando Volver arriba
Meta
Asunto:  MensajePublicado: 31 Ago, 2009 - 10:53
Experto
Experto


Registrado: 03 Sep, 2008
Mensajes: 125

Hola:

Te dejo el proyecto completo.

Saludo.



META_CONTROL.zip
 Descripción:
OpenSource

Descargar
 Nombre del archivo: META_CONTROL.zip
 Tamaño: 53,61 KB
 Descargado: 689 veces

 
 Ver perfil de usuario Enviar mensaje privado  
Responder citando Volver arriba
colgau
Asunto:  MensajePublicado: 01 Sep, 2009 - 04:56
Habitual
Habitual


Registrado: 06 Feb, 2009
Mensajes: 75
Ubicación: xixon
no visualizo el archivo, ya te conmenté que no uso ningun programa para desarrollar codigo, pero no te preocupes, creo que no me has entendido. Vamos por partes:
los Relay1 relay2,relay3 y relay4 los tienes declarados en CBLOCK, no?, pues creo que los tienes que quitar de ahí y ponerlos a continuacion de DE:
DE 00h
Relay1 01h
relay2 02h
etc
de esta manera deberia registrar en la eeprom. Aunque como te comenté nunca se me habia presentado esta cuestion, es solo una conjetura. Suerte y un saludo.
 
 Ver perfil de usuario Enviar mensaje privado  
Responder citando Volver arriba
Mostrar mensajes anteriores:     
Cambiar a:  
Todas las horas son GMT
Publicar nuevo tema   Responder al tema
Ver tema anteriorEntre para ver sus mensajes privadosVer tema siguiente
 Índice de los Foros Electronica Facil » FOROS ELECTRONICA »  Microcontroladores PIC
powered by phppowered by MySQLPOWERED BY APACHEPOWERED BY CentOS© 2004 - 2025Información Legalpoliticas de cookiesipv6 ready