Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - Meta

#406
Hardware / Portatil pantalla negra.
23 Octubre 2010, 13:38 PM
Hola:



Tengo un portatil HP Compaq nc6120. Me lo regalaron roto. Antes encendía que se podía ver la BIOS pero no se sabe si el fallo era el disco duro o otra cosa. Como no hay manera de probarlo porque no encuentro otro disco duro ni otro portatil me tendré que buscar la vida así.

Sin motivo y sin desarmarlo la panatlla está negra. A veces funciona si lo muevo brusco adrede. Lo desarmé, miré hasta la última esquina de cada pieza. Lo purebo con o disco duro y nada. Antes puse El disco de Ubuntu y me arrancaba con buen funciomiento. No se que pasó, al final pude instalar Windwos XP y sus driver. DEspués se bloqueó Windows y se ve negro, desde ahí ya no salgo, ni BIOS ni nada, todo negro.

También limpié bien el microprocesador y le puso silicona térmica bien hecho, estas cosas hay que hacerlas bien. He probado la RAM por si falla alguna, piniendo una, quitando otra. No tiene nada que ver.

Aquí bajé los Driver y todo bien.
http://h20000.www2.hp.com/bizsupport/TechSupport/SoftwareIndex.jsp?lang=es&cc=ar&prodNameId=447347&prodTypeId=321957&prodSeriesId=447346&swLang=35&taskId=135&swEnvOID=1093

Características.
http://www.pc-portatil.com/info/pdf/ordenador-portatil-hp-compaq-NC6120.pdf

Pienso en buscar a más gente a ver si consigo uno viejo a este estilo. Comprar uno nuevo es más rentable siempre que tenga el presupuesto adecuado que en estos momentos estoy en crisis.

He estado siguiento haste este videotutorial para desmontarlo.
http://www.youtube.com/watch?v=SUVWpJB0l5s

¿Alguna idea?

Un cordial saludo.
#407
Que vaya leyendo números y mostrarlos por pantalla hasta que la persona introduzca un número negativo. En ese momento, el programa mostrará un mensaje de despedida y finalizará su ejecución.

Código (python) [Seleccionar]
# Variables.
comienzo = 0
fin = 100
# Introducir datos a la variable.
numero = int(raw_input("introduce un número: "))

for i in range(comienzo, fin):
   if numero > 0:
       print 'El número', numero,  'es positivo.'
       break
   else:
       print 'El número', numero, 'es negativo.'
       break


Me parece que hay que usar While y sigo investigando.

Código (python) [Seleccionar]
# Variables.
comienzo = 0
fin = 100
# Introducir datos a la variable.
numero = int(raw_input("introduce un número: "))

while numero < 0:
   for i in range(comienzo, fin):
       if numero > 0:
           print 'El número', numero,  'es positivo.'
           break
       else:
           print 'El número', numero, 'es negativo.'
           break


Me sale un bucle infinito cuando introduzco un número negativo, y positivo no hace nada.

Supuestamente hay que hacer algo de esto:

- Introduzca un número.
- Cada vez que introduzca un número positivo se va mostrando en pantalla y luego te pide que vuelvas a introducir otro número positivo.
- Si introduces un número negativo, muestra un mensaje de despedida y sales del programa.


Por lo que entiendo es alg así.
#408
Scripting / [Python] - mdc
20 Octubre 2010, 09:59 AM

Partiendo de este ejemplo.

http://www.subeimagenes.com/img/129-130-4950.gif

Código (python) [Seleccionar]
num = int(raw_input('Agrega un número: '))

creo_que_es_primo = True
divisor = 2
while divisor < num and creo_que_es_primo:
   if num % divisor == 0:
       creo_que_es_primo = False
   divisor += 1

if creo_que_es_primo:
   print 'El número', num, 'es primo'
else:
   print 'El número', num, 'no es primo'


Hablando del ejercicio 129, por lo que entiendo, parece que hay que hacer cálculos de dos números enteros y luego dividirlo. El primero está así como indica arriba. ¿Cómo hago el otro en el mismo programa?
#409
 :D

Ver imagen de los ejercicios

Ver libro del Python en pdf página 113.


123)

Código (python) [Seleccionar]
n = int(raw_input('Introduce un número: '))
m = int(raw_input('Introduce un número: '))

sumatorio = 0
for i in range(n, m, 2):
   sumatorio += i
print sumatorio


CitarIntroduce un número: 0
Introduce un número: 10
20

¿Realmente es así lo que pide el ejercicio 123?

Por si acaso lo hago como lo creo de otra manera ya que pide el resultado n+i por lo que he entendido hasta ahora el ejercicio 123.

Código (python) [Seleccionar]
n = int(raw_input('Introduce un número: '))
m = int(raw_input('Introduce un número: '))

sumatorio = 0
for i in range(n, m, 2):
   sumatorio += i
   n = i
print n


CitarIntroduce un número: 0
Introduce un número: 10
8

Como podrán ver, dan resultados diferentes. He hecho dos ejercicios del 123. ¿Tengo alguno hecho bien o ninguno?

Edito 1:


Ahora creo que es este:
Código (python) [Seleccionar]
n = int(raw_input('Introduce un número: '))
m = int(raw_input('Introduce un número: '))

sumatorio = 0
for i in range(n, m):
   sumatorio += i
   n = i
print n










124)


¿Me pueden confirmar si lo hice como he entendido?

Código (python) [Seleccionar]
n = int(raw_input('Introduce un número: '))
m = int(raw_input('Introduce un número: '))

sumatorio = 0
for i in range(n, m**2, 2):
   sumatorio += i
   n = i
print n


Resultado del ejercicio 124).
CitarIntroduce un número: 0
Introduce un número: 10
98

Edito 2:

Ahora creo el 124) es este:
Código (python) [Seleccionar]
n = int(raw_input('Introduce un número: '))
m = int(raw_input('Introduce un número: '))

sumatorio = 0
for i in range(n, m**2):
   sumatorio += i
   n = i
print n


CitarIntroduce un número: 0
Introduce un número: 10
99







125)

Código (python) [Seleccionar]
n = int(raw_input('Introduce un número: '))
m = int(raw_input('Introduce un número: '))

sumatorio = 0
for i in range(n, m, 2):
    sumatorio += i
print sumatorio


CitarIntroduce un número: 0
Introduce un número: 10
20

:)
#410
 :D

En un archivo de texto.py tengo en su interior este simple código.

range(2, 5, 1)

No me lo ejecuta si en el terminal pongo: python texto.py. No hace nada, se queda en blanco. Tampoco con el netbeans 6.8 del openSUSE 11.3.

Si me funciona si lo abro python en el terminal y lo escribo directamente.

¿Qué es lo que ocurre?

;)
#411
Scripting / [Python] raíz n ésima
15 Octubre 2010, 10:40 AM
Buenas:



¿Se refiere que haga algo parecido a esto?

sqrt(variable)

No tengo idea, me la juego que tiene que ver con for in ya que se trata en este tema.

Saludo.
#412
Scripting / [Python] - Menú con While.
15 Octubre 2010, 06:10 AM
Buenas:

Por fin llegamos a la parte final de While con un pezado de menú.



Por ahora estoy en el inicio.
Código (python) [Seleccionar]
# Importar arcoseno.
from math import acos

vector1 = float(raw_input('Introduce el primer vector: '))
vector2 = float(raw_input('Introduce el segundo vector: '))

opcion = ''
while opcion < 'a' or opcion > 'g':
   print 'Selecciona una opción: \n'
   print 'a) Calcular la suma.'
   print 'b) Calcular la diferencia.'
   print 'c) Calcular el producto escalar.'
   print 'd) Calcular el producto vectorial.'
   print 'e) Calcular el ángulo (en gastos) entre ellos.'
   print 'f) Calcular la longitud.'
   print 'g) Finalizar. '
   opcion = raw_input('Pulsa a, b, c, d, e, f o g, luego pulsa retorno de carro: ')
   if opcion == 'a':
       x1 = float(raw_input('Introduce el primer vector: '))


Estoy trabado en hacer esta suma.

¿Dónde saco los x1, y1 y z1?

Pensé que es al introducir los vectores que te pone al principio pero no.

Saludo.

Edito:

Quiero ver un ejemplo de cómo hacen la suma. No se si los vectrres introducidos hay que hacer algo con ellos o pongo desde cero otra vez crear variables con raw_input y poder hacer los cácluos.

Código (python) [Seleccionar]

# Importar arcoseno.
from math import acos

vector1 = float(raw_input('Introduce el primer vector: '))
vector2 = float(raw_input('Introduce el segundo vector: '))

opcion = ''
while opcion < 'a' or opcion > 'g':
   print 'Selecciona una opción: '
   print 'a) Calcular la suma.'
   print 'b) Calcular la diferencia.'
   print 'c) Calcular el producto escalar.'
   print 'd) Calcular el producto vectorial.'
   print 'e) Calcular el ángulo (en gastos) entre ellos.'
   print 'f) Calcular la longitud.'
   print 'g) Finalizar. '
   opcion = raw_input('Pulsa a, b, c, d, e, f o g, luego pulsa retorno de carro: ')
   if opcion == 'a':

       print 'Suma.'
   elif opcion == 'b':

       print 'algo'
   elif opcion == 'c':

       print 'algo'
   elif opcion == 'd':

       print 'algo'
   elif opcion == 'e':

       print 'algo'
   elif opcion == 'f':

       print 'algo'
   elif opcion == 'g':
       print 'Sólo hay sietes opciones: a, b, c, d, e, f o g. Usted has tecleado', opcion
print 'Gracias por usar el programa.'

#413
Muy buenas gente:

Intentando calcular el ejercicio de abajo lo he hecho a mi manera y se que no tiene nada que ver y tampoco funciona. Hay que hacerlo con While.



Código (python) [Seleccionar]
n = float(raw_input('Añade n: ')
m = float(raw_input('Añade m: ')

f = (n / ((n - m) * m))
print f


CitarIntroduce un valor n: 15
Introduce un valor m: 10
0.3

¿Cómo voy hacer esto con while?
#414
Hay un ejercicio que no se que hay que hacer, no entiendo mucho.

Citar
Gacer un programón que calcule el factorial de un número entero positivo. El factorial de n se denota con n!, pero no existe ningún operador Python que permita efectuar este cálculo directamente. Sabiendo que n! = 1 · 2 · 3 · . . . · (n − 1) · n y que 0! = 1, haz un programa que pida el valor de n y muestre por pantalla el resultado de calcular n!.

Hay que usar while, no for.

Por lo que he entendido he hecho esto hasta el momento pero no se si se refiere a esto:

Código (python) [Seleccionar]
n = int(raw_input('Introduce un valor n: '))

sumatorio = 0
i = 0
while i < n:
    i += 1
    sumatorio *= i
    (n - 1) * n
print sumatorio
#415
Scripting / [Python] - while
13 Octubre 2010, 05:38 AM
Hola:

Por fin estoy con los while, ya va siendo hora. Este PDF de Python enseña muy bien, aún así hay ejercicios que uno se queda pescando...

CitarHacer un programa que muestre todos los múltiplos de 6 entre 6 y 150, ambos inclusive.

Muchas veces no me deja claro que es lo que ha que hacer. Por lo que entiendo arriba, hay que hacer un bucle while. Haber como hay que hacer el múltiplo que piden.

Por ahora empecé así:

Código (python) [Seleccionar]
i = 1
while i <= 150:
    i *= 6
    print i


Citar6
36
216

Esto suena a raro, no creo que sea así lo que me está pidiendo.

Código (python) [Seleccionar]

i = 1
while i <= 150:
    i += 6
    print i


Citar7
13
19
25
31
37
43
49
55
61
67
73
79
85
91
97
103
109
115
121
127
133
139
145
151

Saludo.
#416
Scripting / Raíz
11 Octubre 2010, 16:37 PM
Hola:

Quiero calcular esta raíz y me sale este error.

Código (python) [Seleccionar]

from math import sqrt


x1 = float(raw_input('Ingrese el primer numero con decimal: '))
x2 = float(raw_input('Ingrese el segundo numero con decimal: '))
y1 = float(raw_input('Ingrese el tercer numero con decimal: '))
y2 = float(raw_input('Ingrese el cuarto numero con decimal: '))

var1 = sqrt((x1 - x2) * 2 + (y1 - y2) * 2)


Ingrese el primer numero con decimal: 3.0
Ingrese el segundo numero con decimal: 4.0
Ingrese el tercer numero con decimal: 5.0
Ingrese el cuarto numero con decimal: 6.0
Traceback (most recent call last):
  File "/home/acaymo/NetBeansProjects/tema4e2a7/src/tema4e2a7.py", line 31, in <module>
    var1 = sqrt((x1 - x2) * 2 + (y1 - y2) * 2)
ValueError: math domain error

En realidad la raíz es sin los asteriscos.
sqrt((x1 - x2)2 + (y1 - y2)2)
Tampoco funciona.

Saludo.
#417
Scripting / [Python] - Número cerca.
10 Octubre 2010, 20:45 PM
Buenas:

Programa que, dados cinco números enteros, determine cuál de los cuatro últimos nº es más cercano al primero. (Por ejemplo, si el usuario introduce los números 2, 6, 4, 1 y 10, el programa responderá que el número más cercano al 2 es el 1.).

Se me resiste hacer este ejercicio. Lo hice así pero no me funciona, ¿una ayudita?

Código (python) [Seleccionar]
n1 = int(raw_input('Ingresa el primer número: '))
n2 = int(raw_input('Ingresa el segundo número: '))
n3 = int(raw_input('Ingresa el tercer número: '))
n4 = int(raw_input('Ingresa el cuarto número: '))
n5 = int(raw_input('Ingresa el quinto número: '))

z2 = n2 - n1
z3 = n3 - n1
z4 = n4 - n1
z5 = n5 - n1

numero = abs(z2)

if abs(numero) == abs(z2):
   numero = abs(n2)
if abs(numero) == abs(z3):
   numero = abs(n3)
if abs(numero) == abs(z4):
   numero = abs(n4)
if abs(numero) == abs(z5):
   numero = abs(n5)

print "El número %d es más cercano al %d." % (n1, numero)

# En el Cap-2 del PDF, 2.6. Funciones predefinidas explica abs(-3).


Saludo.
#418
Scripting / [Python] Vocales y carácteres
7 Octubre 2010, 19:09 PM
Hola:

Un programa que, dado un carácter que desees, lo identifique como vocal mayúscula, vocal minúscula,  consonante minúscula, consonante mayúscula o otro tipo de carácter.

Por lo que entiendo. ¿Hay que introducir cualquier carácter como estos !"·$%&&/ y que te salga lo que te pide arriba?

A veces me cuesta entender que hay que hacer en ciertos ejercicios.

Saludo.
#419
Scripting / [Python] Ordenar palabras
6 Octubre 2010, 19:19 PM
Hola:

Quiero entender exactamente que es lo que hay que hacer. El problema hay que hacerlo en Python 2.x (no el 3.x).

CitarCalcule la < de cinco palabras, es decir, la primera palabra
de las cinco en orden del abecedario. No se acepta que las mayúsculas sean ((alfabéticamente))
menores que las minúsculas. O sea, 'juanita' es menor que 'Juanito'.

En la parte que dice:
CitarDiseña un programa que calcule la menor de cinco palabras

Por ejemplo, no se si es lo que creo. Debo hacer un programa que deba escribir 5 palabras, no letras, que puede ser:

mesa, Silla, nevera, Cuadro, alfombra.

(Fijarse que Silla y Cuadro tiene la primera letra mayúscula).

A veces creo que se refiere a una palabra con 5 letras y que hay que resolver las letras de la palabra en orden alfabeto.

Creyendo más en lo primero. Introduzco las 5 palabras como indiqué arriba. Guardo en a = raw_input("Introduce la primera palabra: ") así hasta llegar e = raw_input("Introduce la quinta palabra: ").

¿Supuestamente el resultado debe quedar así en orden alfabético de "a" hasta la "z"?

alfombra
Cuadro
mesa
nevera
Silla

Sin contar lo otro que te cuenta el problema.
CitarNo aceptaremos que las mayúsculas sean ((alfabéticamente))
menores que las minúsculas. O sea, 'pepita' es menor que 'Pepito'.

Aquí tendré que hacer más cosas. Lo qu eme interesa es lo primero entender que es lo que hay que hacer exactamente. Ya me encargaré si me sale ese problema. Estoy aprendiendo a programar con Python.

http://3.bp.blogspot.com/_p10GWKDC_aw/TCLE4jzQMMI/AAAAAAAABq8/v7MhUMTcGcA/s1600/ASCII1.GIF
http://2.bp.blogspot.com/_p10GWKDC_aw/TCLE7eUw4HI/AAAAAAAABrE/UaKf7iMsczQ/s1600/ascii2.gif

Saludo.
#420
Software / VirtualBox
4 Octubre 2010, 19:36 PM
Hola:

Uso como base el Windows 7 y tengo instalado el VirtualBox para probar el openSUSE 11.3.

No puedo usar el teclado numérico cuando uso openSUSE. ¿Hay solución para ello?

Saludo.
#421
Scripting / [python] Cadena de códigos
4 Octubre 2010, 14:03 PM
Hola gente:

Quiero poner de una pasada en el compilador netbeans una fila muy larga de código.

if a == 125 or b != 45 or c <= 345 or c == 175 or d >= 4578 or e <= 35:

Para reducir e intentado ponerlo de esta manera.

if a == 125 or b != 45 or c <= 345 or
c == 175 or d >= 4578 or e <= 35:

No funciona.

if a == 125 or b != 45 or c <= 345 +
or c == 175 or d >= 4578 or e <= 35:

No funciona.

if a == 125 or b != 45 or c <= 345,
or c == 175 or d >= 4578 or e <= 35:

Tampoco funciona.

¿Existe algún método para que funcione?

Saludo.
#422
Scripting / [python] Calcular billetes
3 Octubre 2010, 23:45 PM
Hay un programa que se me resiste.

un programa que calcule el desglose en billetes y monedas de una cantidad exacta de euros. Hay billetes de 500, 200, 100, 50, 20, 10 y 5 euros y monedas de 2 y 1 euros. Por ejemplo, si deseamos conocer el desglose de 434 euros, el programa mostrará por pantalla el siguiente resultado:
2 billetes de 200 euros.
1 billete de 20 euros.
1 billete de 10 euros.
2 monedas de 2 euros.


He guardado todos los billetes y moneda en cada variable. He intentado y sigo con ello usando los if-else con sus operadores ==, !=, <=, and, or, etc, etc, etc.

Este tipo de ejercicio es mucho para mi. Aún así sigo para aprender aunque sea un tocho de código que haga y ustedes muy pequeño. Sigo experimentando pero necesito ideas.

Código (python) [Seleccionar]
# Introducir datos a la variable.
E = int(raw_input('Ingresar Capital: '))

# Variables Billetes.
a = 500
b = 200
c = 100
d = 50
e = 20
f = 10
g = 5

# Variables Monedas.
h = 2
i = 1

#R = (a / 500 != 0) or (b / 200 != 0) or (c / 100 != 0) or (d / 50 != 0) or (e / 20 != 0) or (f / 10 != 0) or (g / 5 != 0) or (h / 2 != 0) or (i / 1 != 0)

#print R

if (E / a) == 0:
   a1 = E
   print a1
if (a1 / b) == 0:
   a2 = a1
   print a2
   
   etc.


print '%d billetes de 500 €uros.' % a1
print '%d billetes de 200 €uros.' % a2
print '%d billetes de 100 €uros.' % a3
print '%d billetes de 50 €uros.' % a4
print '%d billetes de 20 €uros.' % a5
print '%d billetes de 10 €uros.' % a6
print '%d billetes de 5 €uros.' % a7
print '%d monedas de 2 €uros.' % a8
print '%d monedas de 1 €uros.' % a9
   
#423
Scripting / [python] Disenar este programa.
3 Octubre 2010, 02:00 AM
Hola:

No entiendo el concepto de lo que me habla.

"El segundo es el cuadrado exacto del primero."

"El segundo es menor que el cuadrado del primero."

"El segundo es mayor que el cuadrado del primero."

CitarHaz un programa con Python que, dados dos números enteros, muestre por pantalla uno de estos mensajes: "El segundo es el cuadrado exacto del primero.", "El segundo es menor que el cuadrado del primero." o "El segundo es mayor que el cuadrado del primero.", dependiendo
de la verificación de la condición correspondiente al significado de cada mensaje.

Saludo.
#424
Scripting / [python] calcular impar y su doble.
2 Octubre 2010, 15:12 PM
Buenas:

¿Cómo hago con Python 2.6, al introducir un número, determine si éste es el doble de un número impar?

Por ahora he hecho esto:
Código (python) [Seleccionar]
# Introducir un valor.
a = raw_input('introduce un número: ')



if a % 2 == 0 and a * 2:
    print 'El número es par.'
    print a


Me da este error:
raceback (most recent call last):
  File "/home/acaymo/NetBeansProjects/tema4a6/src/tema4a6.py", line 25, in <module>
    if a % 2 == 0 and a * 2:
TypeError: not all arguments converted during string formatting


Saludo.
#425
Scripting / [python] Linea de salto.
1 Octubre 2010, 23:18 PM
Hola:

En C puedo poner un texto que al final ponga \n. Salta hacia la  línea de abajo. En Python debo usar dos veces print.

print 'Hola.'
print ' '
print '¿Qué tal?'

¿Hay una manera de hacerlo que no sea a mi manera?

Saludo.
#426
Hola:

Estoy con Python 2.6 en Ubuntu 10.04. Al ejecutar cualquier comentario con tildes y la letra ñ me sale error en el Terminal de linux.

¿Hay alguna forma que te acepten tildes y la ñ?

Saludo.
#427
Scripting / Números de decimales en Python.
30 Septiembre 2010, 22:33 PM
Hola:

En Python 2.6 con Ubuntu 10.04 tengo un valor de 2143.4652893452934. Quiero sólo que me muestre siempre 2 decimales con lo que queda de esta menera:

2143.4652893452934

2143.46

¿Es posible realizarlo en Python?

Saludo.
#428
Scripting / Calcular la raíz cuadrada
30 Septiembre 2010, 17:11 PM
Buenas:

Estoy intentando calcular la raíz cuadrada de un triángulo y no me sale con Python. Sigo esta Web.
http://concurso.cnice.mec.es/cnice2006/material098/geometria/geoweb/area5.htm

Hay que calcular todos los lados de un triángulo que es el perímetro. La altura no lo se. Por ejemplo: sus lados en cm es 3, 5 y 7 cm de del triángulo. La altura no lo se pero debo seguir esta fórmula para ver el resultado final con print el perímetro y con otro print el área.

Saludo.
#429
Scripting / [python] cm2 centimetros cuadrado.
30 Septiembre 2010, 14:40 PM
Hola:

Al usar el Python 2.6 con Ubuntu 10.04. Con print debo usar algo similar a esto.

print 'Su Área es:', A, 'centímetros cuadrados.'

Quiero usarlo de esta manera: cm2. En este foro no lo puedo hacer, si con dibujo para que vea que el 2 es un superíndice.



Saludo.
#430
GNU/Linux / Quitar protector de Ubuntu.
30 Septiembre 2010, 11:23 AM
Hola.

Cada vez que dejo Ubuntu 10.04 unos  minutos sin usar se me pone la pantalla negra. Al mover el ratón siempre me pide que introduzca la contraseña para entrar y entro.

¿Hay algún modo de quitar lo de la contraseña?

Es decir, que al estar la pantalla en negro y al mover el ratón vuelva al escritorio sin que me pida la contraseña. Estar todo el día así cansa.

Saludo.
#431
Scripting / Gráficos Python
30 Septiembre 2010, 11:13 AM
Hola:



Quiero hacer con un programa Python que me dibuje un círculo. Se que hay IDE que lo pueden hacer. Lo que no se si se podrá hacer con netbeans 6.8. He instalado los plugins para Python y funciona lo normal, pero en gráficos ni idea.

Saludo.
#432
Desarrollo Web / Flash protegido
24 Septiembre 2010, 23:33 PM
Hola:

Supongamos que tienes una Web completa hecha con Flash CS5 por poner un ejemplo. Si se lo entrega a alguien que espera pagarte y al fin al no te paga, has entregado un trabajo por el cual no has cobrado. Hacer un trabajo de este tipo para una empresa y que no te paguen lo pasas fatal  a parte de sentitse idiota.

He pensado en hacer algo como que en un cierto tiempo, la Web flash que he hecho se bloquee, se ponga todo en blanco y diga:

BLOQUEADO: Consulte al servicio técnico por e-mail@corrreo.com

Al ejecutar la Web en Flash, que sea capaz de que sólo dure unos 30 minutos. Se que se puede programar en ActionScript 3. Puede hacer otra cosa conectado a MySQL por poner un ejemplo y dependiendo de lo que lea o envíe esté bloqueado  o no. No se me ocurre gran cosa como hacerlo.

Si tienes alguna idea de como proteger como una demo la Web completa que le entragas, al menos hacer algo como entregarle un serial y se active toda la Web, cosas así.

¿Cuál es tu mejor idea?

Un cordial saludo.
#433
Electrónica / Temporizador para insoladora
8 Septiembre 2010, 01:20 AM
Hola:

Quiero hacer un temporizador para una insoladora. Me he puesto con el famoso PIC16F84A pero tiene sus limitaciones.



Usa vez que lo usas sólo puedes ejecutar la cuenta atrás como máximo 4:15. (4 minutos, 15 segundos). Usa el Timer de 8 Bits. He pensarlo en adaptarlo del 16F84A al 16F88 ya que tiene un Timer de 16 bit que significa mejor tiempo.

Quiero saber ya que saben mucho más que yo en temas de temporizadores, si el Timer de 16 bits puede lograr algo. Por ejemplo: Quiero saber cuánto tiempo máximo me deja poner en el LCD y que funcione. Prefiero algo así: 99:99. Con 20 minutos está bien. Que lo vaya a usar para insoladora es mucho tiempo, el mismo circuito lo montaré para otras cosas, por eso quiero saber lo del temporizador.

Estaba pensando es unsar un reloj-calendario en tiempo real llamado DS1307. Muy preciso, pero lleva más electrónica, más caro y complicado de usar en asm.


; Programa de control para un temporizador digital de precisión. La programación del tiempo
; de temporización se realiza mediante dos pulsadores: "AJUSTE" y "ON/INCREM". Funcionamiento:
;     -    En estado de reposo la salida del temporizador está apagada y el pantalla aparece el
;        tiempo deseado para la próxima temporización.
;     - Si se pulsa "ON/INCREM" comienza la temporización.
;     - Cuando acaba la temporización pasa otra vez a reposo.
;     -    Si pulsa "AJUSTE" antes que haya acabado el tiempo de temporización actúa como pulsador
;        de paro: interrumpe la temporización, apaga la carga y pasa al estado de reposo.
;
; Para ajustar la temporización al tiempo deseado.
;     -    Pulsa "AJUSTE" y ajusta el tiempo deseado mediante el pulsador "ON/INCREM".
;     -    Se vuelve a pulsar "AJUSTE" y pasa a modo de reposo.
;
; Al apagar el sistema debe conservar el tiempo de temporización deseado para la próxima vez
; que se encienda.
;
; ZONA DE DATOS **********************************************************************

    LIST        P=16F84A
    INCLUDE        <P16F84A.INC>
    __CONFIG    _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

    CBLOCK  0x0C
    TiempoDeseado                ; El tiempo deseado de temporización.
    Tiempo                        ; Tiempo que resta de temporización.
    FlagsModos                    ; Guarda los flags con los diferentes
    ENDC                        ; modos de funcionamiento.

    ORG    0x2100                    ; Corresponde a la dirección 0 de la zona
                                ; EEPROM de datos. Aquí se va a guardar el
    DE    0x00                    ; tiempo de temporización deseado.

#DEFINE  F_Temporizador_ON        FlagsModos,2
#DEFINE  F_Temporizador_Ajuste    FlagsModos,1
#DEFINE  F_Temporizador_OFF        FlagsModos,0

#DEFINE  SalidaTemporizador     PORTB,1        ; Salida donde se conecta la carga.
#DEFINE  Zumbador                 PORTB,2        ; Salida donde se conecta el zumbador.
#DEFINE  AjustePulsador            PORTB,7        ; Los pulsadores están conectados a estas
#DEFINE  IncrementarPulsador    PORTB,6        ; líneas del Puerto B.

; ZONA DE CÓDIGOS ********************************************************************

    ORG     0
    goto    Inicio
    ORG    4
    goto    ServicioInterrupcion

Mensajes
    addwf    PCL,F
Mensaje_ON
    DT "   En MARCHA", 0x00
Mensaje_Ajuste
    DT "Tiempo  deseado:", 0x00
Mensaje_OFF
    DT "     PARADO", 0x00

; Instrucciones de inicialización. ------------------------------------------------------
;
Inicio
    call    LCD_Inicializa
    bsf        STATUS,RP0
    movlw    b'10000111'                    ; Prescaler de 256 asignado al TMR0.
    movwf    OPTION_REG
    bsf        AjustePulsador                ; Configurados como entradas.
    bsf        IncrementarPulsador
    bcf        SalidaTemporizador            ; Configurados como salidas.
    bcf        Zumbador
    bcf        STATUS,RP0
    clrw                                ; Lee la posición 0x00 de memoria EEPROM de datos
    call    EEPROM_LeeDato                ; donde se guarda el tiempo deseado de la última vez
    movwf    TiempoDeseado                ; que se ajustó.
    call    ModoTemporizador_OFF        ; Modo de funcionamiento inicial.
    movlw    b'10001000'                    ; Activa interrupciones RBI.
    movwf    INTCON
Principal
    goto    Principal

; Subrutina "ServicioInterrupcion" ------------------------------------------------------
;
; Detecta qué ha producido la interrupción y ejecuta la subrutina de atención correspondiente.

ServicioInterrupcion
    btfsc    INTCON,T0IF
    call    Temporizador
    btfss    INTCON,RBIF                    ; Si es una interrupción RBI lee los pulsadores.
    goto    FinInterrupcion
    btfss    AjustePulsador                ; ¿Está presionado el pulsador de "AJUSTE"?.
    call    CambiarModo                    ; Sí, pues salta a la subrutina correspondiente.
    btfsc    IncrementarPulsador            ; ¿Pulsado "ON/INCREM"?.
    goto    FinInterrupcion                ; No, pues salta al final y sale.
;
    call    Retardo_20ms                ; Espera que se estabilice el nivel de tensión.
    btfsc    IncrementarPulsador            ; Si es un rebote del pulsador "ON/INCREM" sale fuera.
    goto    FinInterrupcion
    btfsc    F_Temporizador_OFF            ; ¿Estaba en reposo cuando pulsó "ON/INCREM"?
    call    ModoTemporizador_ON            ; Sí, pues comienza la temporización.
    btfsc    F_Temporizador_Ajuste        ; ¿Estaba ajustando tiempo?
    call    IncrementarTiempoDeseado    ; Sí, pues pasa a incrementar el tiempo deseado.
FinInterrupcion
    bcf        INTCON,RBIF                    ; Limpia los flags de reconocimiento.
    bcf        INTCON,T0IF
    retfie

; Subrutinas "CambiarModo" y todas las de MODO de funcionamiento ------------------------
;
; Subrutina de atención a la interrupción producida al presionar el pulsador "AJUSTE" que
; cambia el modo de funcionamiento.

; Hay identificados tres modos de funcionamiento que se diferencian mediante los tres flags:
;    A)    Modo "Temporizador_OFF" o estado inicial. A él se pasa en el estado inicial cada vez
;        que termina una temporización o cuando se aborta la temporización sin esperar a que
;        finalice. Reconocido por el flag F_Temporizador_OFF, bit 0 del registro FlagsModos.
;         una temporización  o cada vez que se aborta la temporización sin esperar a que finalice.
;    B)    Modo "Temporizador_Ajuste", donde se ajusta la temporización deseada cuando funcione
;        como temporizador. Reconocido por el flag F_Temporizador_Ajuste, bit 1 del FlagsModos.
;    C)    Modo "Temporizador_ON", la salida está activada mientras dure la temporización.
;        Reconocido por el flag F_Temporización_ON, que es el bit 2 del registro FlagsModos.
;
; El programa consigue que esté activado uno sólo de los flags anteriores.

; El contenido del registro (FlagsModos) diferencia los siguientes modos de funcionamiento:
; - (FlagsModos)=b'00000001'. Está en el modo "Temporizador_OFF", en reposo.
; - (FlagsModos)=b'00000010'. Está en el modo "Temporizador_Ajuste", ajustando tiempo deseado.
; - (FlagsModos)=b'00000100'. Está en el modo "Temporizador_ON", activa la carga y temporizador.
;
; Al pulsar "AJUSTE" pueden darse tres casos:
; - Si estaba en modo "Temporizador_OFF", pasa a modo "Temporizador_Ajuste".
; - Si estaba en modo "Temporizador_Ajuste", pasa a modo "Temporizador_OFF", pero antes salva
;   el tiempo de temporización deseado en la EEPROM de datos.     
; - Si estaba en modo "Temporizador_ON", pasa a modo "Temporizador_OFF". (Interrumpe la
;   temporización).

CambiarModo
    call    PitidoCorto                    ; Cada vez que pulsa origina un pitido.
    btfsc    AjustePulsador                ; Si es un rebote sale fuera.
    goto    EsperaDejePulsar
    btfsc    F_Temporizador_OFF            ; ¿Está en reposo?
    goto    ModoTemporizador_Ajuste        ; Sí, pues pasa a ajustar la temporización.
    btfss    F_Temporizador_Ajuste        ; ¿Está ajustando?
    goto    ModoTemporizador_OFF        ; No, pues pasa a reposo.
                                        ; Sí, pues antes de pasar a reposo salva en la
    clrw                                ; posición 00h de memoria EEPROM de datos el tiempo
    movwf    EEADR                        ; de temporización deseado. Se conserva aunque se
    movf    TiempoDeseado,W                ; apague la alimentación.
    call    EEPROM_EscribeDato
ModoTemporizador_OFF
    bcf        SalidaTemporizador            ; Apaga la carga y resetea tiempo deseado.
    call    Pitido
    movlw    b'00000001'                ; Actualiza el registro FlagsModos pasando al
    movwf    FlagsModos                ; modo inicial "Temporizador_OFF".
    bcf        INTCON,T0IE                ; Prohíbe las interrupciones del TMR0.
    movf    TiempoDeseado,W            ; Repone otra vez el tiempo que se desea para la
    movwf    Tiempo                    ; próxima temporización.
    call    LCD_Borra                ; Borra la pantalla.
    movlw    Mensaje_OFF                ; En pantalla el mensaje correspondiente.
    goto    FinCambiarModo

ModoTemporizador_Ajuste
    bcf        SalidaTemporizador        ; Apaga la carga
    movlw    b'00000010'                ; Actualiza el registro FlagsModos pasando al
    movwf    FlagsModos                ; modo "Temporizador_Ajuste".
    clrf    Tiempo                    ; Resetea el tiempo.
    clrf    TiempoDeseado
    bcf        INTCON,T0IE                ; Prohíbe las interrupciones del TMR0.
    call    LCD_Borra
    movlw    Mensaje_Ajuste            ; En pantalla el mensaje correspondiente.
    goto    FinCambiarModo

ModoTemporizador_ON
    movf    TiempoDeseado,W            ; Si el tiempo deseado es cero pasa a modo
    btfsc    STATUS,Z                ; de trabajo "Temporizador_OFF".
    goto    ModoTemporizador_OFF
    movwf    Tiempo
    call    PitidoCorto
    movlw    b'00000100'                ; Actualiza el registro FlagsModos pasando al
    movwf    FlagsModos                ; modo "Temporizador_ON".
    movlw    TMR0_Carga50ms            ; Carga el TMR0.
    movwf    TMR0
    movlw    CARGA_1s                ; Y el registro cuyo decremento contará los
    movwf    Registro50ms            ; segundos.
    bsf        INTCON,T0IE                ; Autoriza las interrupciones de TMR0.
    call    LCD_Borra
    bsf        SalidaTemporizador        ; Enciende la carga.
    movlw    Mensaje_ON                ; En pantalla el mensaje correspondiente.
FinCambiarModo
    call    LCD_Mensaje
    call    VisualizaTiempo
EsperaDejePulsar
    btfss    AjustePulsador            ; Espera deje de pulsar.
    goto    EsperaDejePulsar
    return

; Subrutina "Temporizador" ----------------------------------------------------------------
;
; Esta subrutina va decrementando el tiempo de temporización y visualizándolo en la pantalla.
; Se ejecuta debido a la petición de interrupción del Timer 0 cada 50 ms exactos, comprobado
; experimentalmente con la ventana "Stopwatch" del simulador del MPLAB.

    CBLOCK
    Registro50ms                    ; Guarda los incrementos cada 50 ms.
    ENDC

TMR0_Carga50ms    EQU    d'256'-d'195'            ; Para conseguir la interrupción cada 50 ms.
CARGA_1s        EQU    d'20'            ; Leerá cada segundo (20 x 50ms = 1000 ms).   

Temporizador
    call    Retardo_50micros        ; Ajuste fino de 71 microsegundos para
    call    Retardo_20micros        ; ajustar a 50 milisegundos exactos.
    nop
      movlw    TMR0_Carga50ms            ; Carga el Timer0.
    movwf    TMR0
    decfsz    Registro50ms,F            ; Decrementa el contador.
    goto    FinTemporizador            ; No ha pasado 1 segundo y por tanto sale.
    movlw    CARGA_1s                ; Repone el contador nuevamente.
    movwf    Registro50ms
    btfss    F_Temporizador_ON        ; Si no está en modo "Temporizador_ON" sale
    goto    FinTemporizador            ; fuera.
    decfsz    Tiempo,F
    goto    VisualizaContador        ; Visualiza el tiempo restante.
    bcf        SalidaTemporizador        ; Apaga la salida
    call    VisualizaTiempo            ; Visualiza cero segundos en la pantalla.
    call    Pitido                    ; Tres pitidos indican final de la temporización.
    call    Retardo_500ms
    call    Pitido
    call    Retardo_500ms
    call    PitidoLargo
    call    Retardo_500ms
    call    ModoTemporizador_OFF    ; Acabó la temporización.
    goto    FinTemporizador
VisualizaContador
    call    VisualizaTiempo
FinTemporizador
    return

; Subrutina "VisualizaTiempo" -----------------------------------------------------------------
;
; Visualiza el registro Tiempo en formato "Minutos:Segundos". Así por ejemplo, si
; (Tiempo)=124 segundos en la segunda línea de la pantalla visualiza " 2:04", ya que 124
; segundos es igual a 2 minutos más 4 segundos.
;
VisualizaTiempo
    movlw    .5                        ; Para centrar visualización en la
    call    LCD_PosicionLinea2        ; segunda línea.
    movf    Tiempo,W                ; Convierte el tiempo deseado (y expresado sólo en
    call    MinutosSegundos            ; segundos) a minutos y segundos.
    movf    TemporizadorMinutos,W    ; Visualiza los minutos.
    call    BIN_a_BCD                ; Lo pasa a BCD.
    call    LCD_Byte
    movlw    ':'                        ; Visualiza dos puntos.
    call    LCD_Caracter
    movf    TemporizadorSegundos,W    ; Visualiza los segundos.
    call    BIN_a_BCD                ; Lo pasa a BCD.
    goto    LCD_ByteCompleto
    return

; Subrutina "MinutosSegundos" -----------------------------------------------------------
;
; Una cantidad expresada exclusivamente en segundos y contenida en el registro W es
; convertida a minutos y segundos. El resultado se guarda en dos posiciones de memoria
; llamadas TemporizadorMinutos y TemporizadorSegundos.
;
; El máximo número a convertir será el 255 que es el máximo valor que puede adquirir el
; número binario de entrada de 8 bits. (255 segundos = 4 minutos + 15 segundos)
;
; El procedimiento utilizado es mediante restas de 60 tal como se explica en el siguiente
; ejemplo que trata de la conversión del 124 segundos a minutos y segundos.
; 124 segundos = 2 minutos + 4 segundos.
;
; Minutos        Segundos     ¿(Segundos)<60?
; -------        --------    ------------------------------------------------
;     0              124        NO. Resta 60 a (Segundos) e incrementa (Minutos).
;     1               64         NO. Resta 60 e (Segundos) e incrementa (Minutos).
;     2                4        Sí, se acabó.
;
; Entrada:    En el registro W el número de segundos a convertir.
; Salidas:    En (TemporizadorMinutos) y (TemporizadorSegundos) el resultado.

    CBLOCK
    TemporizadorMinutos
    TemporizadorSegundos
    ENDC
;
MinutosSegundos
    movwf    TemporizadorSegundos    ; Carga el número de segundos a convertir.
    clrf    TemporizadorMinutos        ; Carga los registros con el resultado inicial.
Resta60
    movlw    .60                        ; Resta 60 en cada pasada.
    subwf    TemporizadorSegundos,W    ; (W)=(TemporizadorSegundos)-60.
    btfss    STATUS,C                ; ¿(W) positivo?, ¿(TemporizadorSegundos)>=60?.
    goto     FinMinutosSegundos        ; No, es menor de 60. Acabó.
    movwf    TemporizadorSegundos    ; Sí, por tanto, recupera lo que queda por restar.
    incf    TemporizadorMinutos,F    ; Incrementa los minutos.
    goto    Resta60                    ; Y vuelve a dar otra pasada.
FinMinutosSegundos
    return

; Subrutina "IncrementarTiempoDeseado" --------------------------------------------------
;
; Subrutina de atención a la interrupción por cambio de la línea RB6 a la cual se ha
; conectado el pulsador "INCREMENTAR".
; Estando en el modo "Temporizador_Ajustar" incrementa el valor del tiempo deseado
; expresado en segundos en intervalos de 5 segundos y hasta un máximo de 255 segundos.
;
SALTO_INCR    EQU    .5

IncrementarTiempoDeseado
    call    PitidoCorto                ; Cada vez que pulsa se oye un pitido.
    movlw    SALTO_INCR                ; Incrementa el tiempo deseado de temporización
    addwf    Tiempo,F                ; saltos de SALTO_INCR segundos.
    btfsc    STATUS,C                ; Si pasa del valor máximo lo inicializa.
    clrf    Tiempo
    call    VisualizaTiempo            ; Visualiza mientras espera que deje de pulsar.
    call    Retardo_200ms
    btfss    IncrementarPulsador        ; Mientras permanezca pulsado,
    goto    IncrementarTiempoDeseado ; incrementa el dígito.
    movf    Tiempo,W                ; Actualiza el tiempo deseado.
    movwf    TiempoDeseado            ; Este es el tiempo deseado.
    return
   
; Subrutinas "PitidoLargo", "Pitido" y "PitidoCorto" -------------------------------------
;
PitidoLargo
    bsf        Zumbador
    call    Retardo_500ms
Pitido
    bsf        Zumbador
    call    Retardo_200ms
PitidoCorto
    bsf        Zumbador
    call    Retardo_20ms
    bcf        Zumbador
    return
;
    INCLUDE  <RETARDOS.INC>
    INCLUDE  <BIN_BCD.INC>
    INCLUDE  <LCD_4BIT.INC>
    INCLUDE  <LCD_MENS.INC>
    INCLUDE  <EEPROM.INC>
    END


Un cordial saludo.
#434


- Multiplataforma (Windows, Linux, Mac)
- Tecnología Netbeans
- Y como lo acabo de instalar... solo decir que es muuuuucho más bonito
- Ah sí y lo más importante, todo cambiado de sitio XD

http://devupdates.microchip.com/mplab/
#435
Electrónica / Resolver problemas con tablas 6 bits.
3 Septiembre 2010, 07:32 AM
Hola:

Quiero hacer la tabla de 6 bits y me parece el error de los 256 bits usados. ¿Hay alguna manera de resolverlo?



; ZONA DE DATOS **********************************************************************

    TITLE        "LCD Sensor PS2"
    SUBTITLE    "Revisión 1.00"
    LIST        P=16F886
    INCLUDE        <P16F886.INC>
    __CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
    __CONFIG    _CONFIG2, _WRT_OFF & _BOR21V

    CBLOCK    0x20
    CONTADOR
    ENDC

#DEFINE        RESET_RC0    PORTC,0
#DEFINE        EJECT_RC1    PORTC,1
#DEFINE        OPEN_RC2    PORTC,2
#DEFINE        CLOSE_RC3    PORTC,3
#DEFINE        GREEN_RC4    PORTC,4
#DEFINE        RED_RC5        PORTC,5
#DEFINE        Auxiliar_6    PORTC,6
#DEFINE        Auxiliar_7    PORTC,7

; ZONA DE CÓDIGOS ********************************************************************

    ORG     0                        ; El programa comienza en la dirección 0.

Inicio
    call    LCD_Inicializa
    BANKSEL    TRISC                    ; Banco 1.
    bsf        RESET_RC0                    ; Se configura como entradas.
    bsf        EJECT_RC1
    bsf        OPEN_RC2
    bsf        CLOSE_RC3                   
    bsf        GREEN_RC4
    bsf        RED_RC5
    bsf        Auxiliar_6
    bsf        Auxiliar_7
    BANKSEL    PORTC                    ; Banco 0.
    clrw

Principal
    movf    PORTC,W                ; Lee los sensores.
    andlw    b'00111111'            ; Máscara para quedarse con el valor de los sensores.
    addwf    PCL,F                ; Salta a la configuración adecuada.
    goto    Configuracion0        ; 0 0 0 0 0 0
    goto    Configuracion1        ; 0 0 0 0 0 1
    goto    Configuracion2        ; 0 0 0 0 1 0
    goto    Configuracion3        ; 0 0 0 0 1 1
    goto    Configuracion4        ; 0 0 0 1 0 0
    goto    Configuracion5        ; 0 0 0 1 0 1
    goto    Configuracion6        ; 0 0 0 1 1 0
    goto    Configuracion7        ; 0 0 0 1 1 1
    goto    Configuracion8        ; 0 0 1 0 0 0
    goto    Configuracion9        ; 0 0 1 0 0 1
    goto    Configuracion10        ; 0 0 1 0 1 0
    goto    Configuracion11        ; 0 0 1 0 1 1
    goto    Configuracion12        ; 0 0 1 1 0 0
    goto    Configuracion13        ; 0 0 1 1 0 1
    goto    Configuracion14        ; 0 0 1 1 1 0
    goto    Configuracion15        ; 0 0 1 1 1 1
    goto    Configuracion16        ; 0 1 0 0 0 0
    goto    Configuracion17        ; 0 1 0 0 0 1
    goto    Configuracion18        ; 0 1 0 0 1 0
    goto    Configuracion19        ; 0 1 0 0 1 1
    goto    Configuracion20        ; 0 1 0 1 0 0
    goto    Configuracion21        ; 0 1 0 1 0 1
    goto    Configuracion22        ; 0 1 0 1 1 0
    goto    Configuracion23        ; 0 1 0 1 1 1
    goto    Configuracion24        ; 0 1 1 0 0 0
    goto    Configuracion25        ; 0 1 1 0 0 1
    goto    Configuracion26        ; 0 1 1 0 1 0
    goto    Configuracion27        ; 0 1 1 0 1 1
    goto    Configuracion28        ; 0 1 1 1 0 0
    goto    Configuracion29        ; 0 1 1 1 0 1
    goto    Configuracion30        ; 0 1 1 1 1 0
    goto    Configuracion31        ; 0 1 1 1 1 1
    goto    Configuracion32
    goto    Configuracion33
    goto    Configuracion34
    goto    Configuracion35
    goto    Configuracion36
    goto    Configuracion37
    goto    Configuracion38
    goto    Configuracion39
    goto    Configuracion40
    goto    Configuracion41
    goto    Configuracion42
    goto    Configuracion43
    goto    Configuracion44
    goto    Configuracion45
    goto    Configuracion46
    goto    Configuracion47
    goto    Configuracion48
    goto    Configuracion49
    goto    Configuracion50
    goto    Configuracion51
    goto    Configuracion52
    goto    Configuracion53
    goto    Configuracion54
    goto    Configuracion55
    goto    Configuracion56
    goto    Configuracion57
    goto    Configuracion58
    goto    Configuracion59
    goto    Configuracion60
    goto    Configuracion61
    goto    Configuracion62
    goto    Configuracion63
Configuracion0                       
    goto    ActivaSalida
Configuracion1                       
    goto    ActivaSalida
Configuracion2                   
    goto    ActivaSalida
Configuracion3                   
    goto    ActivaSalida
Configuracion4
    goto    ActivaSalida
Configuracion5
    goto    ActivaSalida
Configuracion6
    goto    ActivaSalida
Configuracion7
    goto    ActivaSalida
Configuracion8
    goto    ActivaSalida
Configuracion9
    goto    ActivaSalida
Configuracion10
    goto    ActivaSalida
Configuracion11
    goto    ActivaSalida
Configuracion12
    goto    ActivaSalida
Configuracion13
    goto    ActivaSalida
Configuracion14
    goto    ActivaSalida
Configuracion15
    goto    ActivaSalida
Configuracion16
    goto    ActivaSalida
Configuracion17
    goto    ActivaSalida
Configuracion18
    goto    ActivaSalida
Configuracion19
    goto    ActivaSalida
Configuracion20
    goto    ActivaSalida
Configuracion21
    goto    ActivaSalida
Configuracion22
    goto    ActivaSalida
Configuracion23
    goto    ActivaSalida
Configuracion24
    goto    ActivaSalida
Configuracion25
    goto    ActivaSalida
Configuracion26
    goto    ActivaSalida
Configuracion27
    goto    ActivaSalida
Configuracion28
    goto    ActivaSalida
Configuracion29
    goto    ActivaSalida
Configuracion30
    goto    ActivaSalida
Configuracion31
    goto    ActivaSalida
Configuracion32
    goto    ActivaSalida
Configuracion33
    goto    ActivaSalida
Configuracion34
    goto    ActivaSalida
Configuracion35
    goto    ActivaSalida
Configuracion36
    goto    ActivaSalida
Configuracion37
    goto    ActivaSalida
Configuracion38
    goto    ActivaSalida
Configuracion39
    goto    ActivaSalida
Configuracion40
    goto    ActivaSalida
Configuracion41
    goto    ActivaSalida
Configuracion42
    goto    ActivaSalida
Configuracion43
    goto    ActivaSalida
Configuracion44
    goto    ActivaSalida
Configuracion45
    goto    ActivaSalida
Configuracion46
    goto    ActivaSalida
Configuracion47
    goto    ActivaSalida
Configuracion48
    goto    ActivaSalida
Configuracion49
    goto    ActivaSalida
Configuracion50
    goto    ActivaSalida
Configuracion51
    goto    ActivaSalida
Configuracion52
    goto    ActivaSalida
Configuracion53
    goto    ActivaSalida
Configuracion54
    goto    ActivaSalida
Configuracion55
    goto    ActivaSalida
Configuracion56
    goto    ActivaSalida
Configuracion57
    goto    ActivaSalida
Configuracion58
    goto    ActivaSalida
Configuracion59
    goto    ActivaSalida
Configuracion60
    goto    ActivaSalida
Configuracion61
    goto    ActivaSalida
Configuracion62
    goto    ActivaSalida
Configuracion63
    goto    ActivaSalida
ActivaSalida
;    movwf    PORTB               
    goto     Principal

;
; "Mensajes" ----------------------------------------------------------------------------
;
Mensajes
    addwf    PCL,F
Mensaje1
    DT    "      STAND BY      ", 0x00
Mensaje2
    DT    "MEnsaje             1.", 0x00
Mensaje3
    DT     "Mensaje 2            ", 0x00
Mensaje4
    DT    "Mensaje 3             ", 0x00
Mensaje5
    DT     "     Msm             ", 0x00
Mensaje6
    DT    "Motor girando...", 0x00
Mensaje7
    DT     "marca", 0x00
Mensaje8
    DT    "Mensaje 4-2     ", 0x00
FinTabla
;MensajeAnuncio
;    DT " anuncio---       ", 0x00   

    IF (FinTabla > 0xFF)
        ERROR    "¡CUIDADO!: La tabla ha superado el tamaño de la página de los"
        MESSG    "primeros 256 bytes de memoria ROM. NO funcionará correctamente."
    ENDIF

    INCLUDE  <LCD_4BIT.INC>
    INCLUDE  <LCD_MENS.INC>
    INCLUDE  <RETARDOS.INC>
    END


Saludo.
#436
Electrónica / Tablas indexado de 8 bits.
28 Agosto 2010, 06:52 AM
Hola:

Como pueden ver el código de abajo. Se utiliza 3 bits de entrada para una tabla de la verdad. 8 Configuraciones en total. Está muy bien para hacer un decoder. Viendo que quiero hacer uno de 8 bits, 8 entradas para la tabla de la verdad, obtiene 256 Configuraciones. Tardaría años en configurarlas todas. No quiero usar TTL decoder a parte, sólo con PIC.

¿Existe una manera de hacer esta tabla sin tardar demasiado tiempo en hacer 256 configuraciones?

El ejemplo de abajo son de 8 configuraciones y no me parece mucho, pero 256 es la eternidad.




; Controla el nivel de un depósito de líquido. Utiliza (entre paréntesis las líneas del
; microcontrolador a la que se han conectado):
; -    Tres sondas detectoras: SV, Sonda de Vacío (RA0); SLL, Sonda de LLenado (RA1);
;    SR, Sonda de Rebose (RA2).
; -    Dos bombas de agua: B1 (RB5), B2 (RB6).
; - Cinco indicadores: Vacio (RB0), Llenandose (RB1), Lleno (RB2), Rebose (RB3),
;    Alarma (RB4).
;
; Su funcionamiento:
; -    Cuando ninguna de las sondas está mojada se entiende que el depósito está vacío y
;    se accionarán las dos bombas. El indicador "Vacio" se iluminará .
; -    Cuando el nivel del líquido toque la sonda de vacío "SV" seguirá llenándose el
;     depósito con las dos bombas. El indicador "Llenandose" se ilumina.
; -    Cuando el nivel del líquido toca la sonda de llenado "SLL", para la bomba B2, quedando
;    B1 activada en modo mantenimiento. El indicador "Lleno" se ilumina.
; -    Si el nivel del líquido moja la sonda de rebose "SR" se apaga también la bomba B1,
;    quedando las dos bombas fuera de servicio. El indicador "Rebose" se enciende.
; -    Cuando se produce un fallo o mal funcionamiento en las sondas de entrada (por
;    ejemplo que se active la sonda de rebose y no active la de vacío) se paran
;    las dos bombas. El indicador "Alarma" se ilumina.
;
; Según el enunciado del problema, teniendo en cuenta las conexiones citadas y poniendo la
; salida no utilizada (RB7) siempre a cero, la tabla de verdad resultante es:
;
; RA2.. RA0 | RB7 ...          ... RB0
; ------------|--------------------------------
;  0   0   0  |  0   1   1   0   0   0   0   1    (Configuración 0. Estado "Vacio").
;  0   0   1  |  0   1   1   0   0   0   1   0    (Configuración 1. Estado "Llenandose").
;  0   1   0  |  0   0   0   1   0   0   0   0    (Configuración 2. Estado "Alarma").
;  0   1   1  |  0   0   1   0   0   1   0   0    (Configuración 3. Estado "Lleno").
;  1   0   0  |  0   0   0   1   0   0   0   0    (Configuración 4. Estado "Alarma").
;  1   0   1  |  0   0   0   1   0   0   0   0    (Configuración 5. Estado "Alarma").
;  1   1   0  |  0   0   0   1   0   0   0   0    (Configuración 6. Estado "Alarma").
;  1   1   1  |  0   0   0   0   1   0   0   0    (Configuración 7. Estado "Rebose").
;
; ZONA DE DATOS **********************************************************************

    LIST        P=16F84A
    INCLUDE        <P16F84A.INC>
    __CONFIG    _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

; ZONA DE CÓDIGOS ********************************************************************

    ORG     0                    ; El programa comienza en la dirección 0.
Inicio
    clrf    PORTB                ; Debe estar a cero cuando el puerto se configure como salida.
    bsf        STATUS,RP0            ; Acceso al Banco 1.
    clrf    TRISB                ; Las líneas del Puerto B se configuran como salida.
    movlw    b'00011111'            ; Las 5 líneas del Puerto A se configuran como entrada.
    movwf    TRISA
    bcf        STATUS,RP0            ; Acceso al Banco 0.
Principal
    movf    PORTA,W                ; Lee los sensores.
    andlw    b'00000111'            ; Máscara para quedarse con el valor de los sensores.
    addwf    PCL,F                ; Salta a la configuración adecuada.
    goto    Configuracion0
    goto    Configuracion1
    goto    Configuracion2
    goto    Configuracion3
    goto    Configuracion4
    goto    Configuracion5
    goto    Configuracion6
    goto    Configuracion7
Configuracion0
    movlw     b'01100001'            ; Estado "Vacio" (configuración 0).
    goto    ActivaSalida
Configuracion1
    movlw     b'01100010'            ; Estado "Llenándose" (configuración 1).
    goto    ActivaSalida
Configuracion2
    movlw     b'00010000'            ; Estado "Alarma" (configuración 2).
    goto    ActivaSalida
Configuracion3
    movlw     b'00100100'            ; Estado "Lleno" (configuración 3).
    goto    ActivaSalida
Configuracion4
    movlw     b'00010000'            ; Estado "Alarma" (configuración 4).
    goto    ActivaSalida
Configuracion5
    movlw     b'00010000'            ; Estado "Alarma" (configuración 5).
    goto    ActivaSalida
Configuracion6
    movlw     b'00010000'            ; Estado "Alarma" (configuración 6).
    goto    ActivaSalida
Configuracion7
    movlw     b'00001000'            ; Estado "Rebose" (configuración 7).
ActivaSalida
    movwf    PORTB                ; Visualiza por el puerto de salida.
    goto     Principal

    END


Un cordial saludo.
#437
Electrónica / Hacer algo con la PS2 vieja.
27 Agosto 2010, 08:47 AM
Hola:



Tengo una PS2 FAT y quiero hacerle un poco de experimento con ella aunque sea inútil. Mi idea principal es usar un LCD 16x2 HD44780 de Hitachi que al introducir el juego sea capaz de detectar que juego he instertado. El DVD del juego tiene un ID que la PS2 sabe el título introducido, solo que no se como obtenerlo. En la EEPROM externa 24LC256 de un PIC16F88 por poner un ejemplo, tiene los ID obtenidos por cada juego que tengo original y sus títulos, es decir, que en la EEPROM están guardados los datos, el PIC16F88 o otro está conectado entre el lector y la placa de la PS2 de una manera que detecte los id del juego al introducir un DVD.

También detecta cuando le falta un juego, cuando has introducido un juego, cuando expulsa un juego, cuando enciende o reinicia la consola, etc.

Si pueden o los que sepan, pueden ponerme cualquier información sobre las PS2 y sus placas bases más lectores. Mi modelo de PS2 es el SCPH-39004. Pueden poner el que quieran. Sólo encuentro poner chip pero eso no me interesa.

Para que se hagan una idea, la 360 se puede extraer datos del lector como la Key, pero no he probado si con ella se puede leer los id de los discos para hacer esta funcióny obtener los títulos del juego.

Un cordial saludo.
#438
Hacking / .Lnk en USB
30 Julio 2010, 01:42 AM
Hola:

Leyendo esta noticia. ¿Alguien sabe como hacer tu propio .Lnk trapichoso en PenDrive USB para que luego se infecte el PC? Quiero hacer pruebas en mi propio PC virtual y PenDrive que ejecute un Hola mundo.

Saludo.
#439
¿Cómo hablo con la máquina?

Pongamos que, un buen día, ante tus ojos, tienes una maravillosa máquina que la gente llama ordenador.

La miras con cautela (¿morderá?), y lo primero que tus ojos observan, es que consta de varios trozos. Uno de ellos, de verdad, es clavado a la tele de la salita (¿podré ver la peli de la 2 desde aquí?). Otro de esos trozos recuerda a las máquinas de escribir de nuestra infancia (¿le podré mandar una carta a mi abuela?; ¿y por dónde meto el papel?).

Sin embargo, en un ordenador "medio", suele haber algo más, que lo primero que recuerda es a una caja grande de zapatos, con la diferencia de que no tiene zapatos dentro.

Se le suele llamar "torre" (pues yo no veo ningún castillo) o, simplemente, caja. Si la abrimos, entre todo el maremágnum de cables existente, podemos ver unas plaquitas muy finas. Un consejo: no las rompas. Tienes ante ti, al cerebro pensante (es un decir) de la máquina, y a todos sus súbditos.

Entonces, como eres una persona emprendedora, te preguntas, "¿y cómo demonios le convenzo para que se ponga la peli de la 2?", "¿sabrá hacer ganchillo?", "¿podremos hacernos amigos?". Esto último depende de ti, y sólo de ti. Porque, lo primero que tienes que tener pero que muy claro es que la máquina hará única y exclusivamente lo que tú le digas. Lo segundo, es saber que tu máquina tiene limitaciones (lo siento mucho, pero sin brazos dudo mucho que pueda hacerte la comida) y que está diseñada para unas tareas concretas ("¡pero bueno, ¿puedo o no puedo ver la peli de la 2?!"). Lo tercero: tienes que aprender el lenguaje de la máquina. Porque, claro, si le recitas algún poema, nadie te salvará de su gesto de indiferencia: no te entiende. La pregunta lógica, pues, ¿y cuál es el idioma de la máquina? ("¿que no sabrá ruso y mira cómo se lo calla?").

Si eres despierto, habrás observado con especial atención cuando he dicho que hay un maremágnum de cables en alguna parte. No importa tanto lo de la parte como lo de los cables. Bien, veamos: cables. ¿Y yo para qué quiero un cable? Bueno, sí, puedo querer estrangular al perro de la vecina, vale, pero eso no me ayuda a saber cómo hablarle a mi máquina (ni siquiera al perro de la vecina). ¿Por dónde íbamos? Ah, sí... CABLES. Bueno, ahora que lo pienso, por los cables pasa la corriente. Uuummm... CORRIENTE, sí, vamos bien.

¿Y qué le pasa a la corriente? ("ah, yo no sé, pregúntale a ver"). Pues que, como el dinero, *está* o *no está*. Vale, vamos progresando.

Si te fijas más aún, en esas placas que te he sugerido que no rompas, hay dibujitos como los de las "pelis" futuristas con un montón de líneas, y hay como una cajita negra grandota con un montón de patitas ("¡Agh, por Diox, una cucaracha!, ¡Traedme el insecticida!") ¡Vaya, pero si de esas patitas salen más de esas líneas!

No te engañes: esas líneas son cables, y la cucaracha grande es la que manda. Esa cucarachita está preparada para entender un idioma (no tan rico como el castellano) que le permite hacer sus cuentas, encargarle a alguien que las haga por ella ("¿tiene una calculadora?"), y, lo más importante, por medio de esos cables, dar órdenes a diestro y siniestro a sus súbditos y recibir las respuestas de los mismos.

Tiene muchas responsabilidades encima, para ser una cosa tan chica. Y suele responder al nombre de "procesador" (aunque no se gira cuando le llamas).

Sus colaboradores se encargan (si están todos lo cables enchufados como toca, cosa que presuponemos) de hacer cuentas, de enviar señales de vídeo a esa cosa "clavada a la tele de la salita" para que puedas ver desde unas tristes letras blancas en fondo negro (aunque tienen su encanto) a la última novedad en 3D con muchos colorines, de permitirnos que al pulsar una tecla aparezca por esa pantalla, en fin... ¡todo un mundo!

Y el procesador, para que le hablen, simplemente necesita que le digas: "0" o "1". ("¡Pero bueno, ¿y para esto tanto rollo con que si lenguajes de programación que si historias?"). ¿Qué significa esto? ¿Por qué, de entre todas las posibles formas de comunicación, ha ido a elegir la más estúpida?

Bueno, en realidad no lo es tanto. Lo que quiere decir es, "0": ausencia de corriente. "1": presencia de corriente. Es la manera más fácil. Pero esto no acaba aquí. Como podrás imaginar, los 0 y 1 pueden aparecer de muchas maneras. Ah, ahí has dado con la clave de todo: 0 y 1 son "el alfabeto", pero todas las formas en que pueden aparecer son sus "palabras" (aunque no te recomendaría que asociaras palabra con esto).

Ya está claro: tengo que saber hablar en 0 y 1 si quiero tener algún tipo de relación con mi ordenador. Pero no es nada "humano", digamos intuitivo. Lo ideal sería que pudiera hablarle de forma que se parezca más a mi manera de hablar, puesto que no estamos ahora para ir aprendiendo idiomas tan "exóticos".

Y entonces llega el ser humano con su ingenio, y decide inventarse un lenguaje más sencillo con el que hablarle a la máquina: y nació el ensamblador. Pero, para una persona cuyo objetivo más ambicioso (por ahora) es escribir un "Hola Mundo", resulta demasiado complicado. ¿Por qué? Pues porque requiere conocer a la máquina como a uno mismo, y si uno mismo no llega a conocerse bien, qué me direis de su máquina.

Así, en un alarde de ingenio, el ser humano repite jugada, y se inventa otros lenguajes que, ahora sí, son más parecidos a nuestra forma de pensar.

Estos lenguajes, como todo, hay que aprendérselos, pero tienen una ventaja, y es que hay varios puntos en común.

Todos constan de unos determinados tipos de variables. Una variable es como una caja, donde ahora puedo meter un zapato y mañana un tomate. Ahora, yo puedo haber etiquetado mis cajas y decir "aquí sólo fruta": será una variable de tipo FRUTA. O, "aquí sólo legumbres": será una variable de tipo LEGUMBRE. Esto es interesante, porque en el momento en que yo vea FRUTA, ya sé que dentro no hay cerveza (y tendré que buscar en otro sitio, jo, qué sed...). Pero no sólo eso: yo sé que tengo muchas cajas para frutas, pero puedo querer bautizarlas ("tú serás la caja de frutas Juana"), y así llamarlas por su nombre. Podré cambiar (o no) su contenido (hoy Juana tiene un melón pero mañana le pondré ciruelas), pero NO lo que puede contener: FRUTA.

Esto también lo tiene en común los lenguajes de programación. Sólo que sus variables son de otro TIPO. Pueden ser enteros (sí, como los números que nos enseñaron en la infancia), números con decimales, cadenas de caracteres (no es más que un caracter detrás de otro) y otros que ahora no comentamos (quedan para más adelante).

Lo normal es declarar las variables al principio de un programa. Declarar no es más que decir "mira, yo quiero tres variables enteras, y quiero que una se llame Pepi, otra Juani y otra Yoli". A partir de este momento, podrás meter un -4 en Pepi, un 2 en Yoli, y hacer Pepi+Yoli. El resultado será -2.

Vaya, esto se pone interesante. ¿Qué más cosas me permite hacer un lenguaje de programación? Pues me permite hacer operaciones conocidas por todos como sumar, restar, multiplicar y dividir.

Los lenguajes de programación, cuentan todos en su haber con un juego de "instrucciones". Una instrucción no es más que una orden que nosotros le damos a la máquina.

Y es que, al fin y al cabo, un PROGRAMA no es más que una secuencia de instrucciones (escritas en algún lenguaje de programación) pensado para RESOLVER algún tipo de PROBLEMA. Si no sabemos resolver este problema, no podremos escribir el programa.

A ti se te puede ocurrir una manera de resolverlo. A tu vecino, otra. Este METODO con el que resolveis el problema, es lo que se llama ALGORITMO, y es lo que vamos a ver en este cursito cómo se hacen.

Un algoritmo no es más que una secuencia de pasos que, seguidos uno a uno, me permiten resolver un problema.

Por ejemplo, cuando quiero ver una película de vídeo, podría hacer:

   1. Elijo una película de las de mi colección.
   2. Compruebo SI TV y vídeo están conectados a la red (y procedo).
   3. SI la TV está apagada, la enciendo, SI NO, pues no. Y lo mismo con el vídeo.
   4. Abro el estuche de la película.
   5. Saco la película de su estuche.
   6. Introduzco la película en el vídeo. Dejo el estuche sobre el vídeo.
   7. SI la TV no está en el canal adecuado, la cambio, SI NO, pues no.
   8. Cojo los mandos a distancia (el del TV y el del vídeo).
   9. Me pongo cómodo.
  10. Pulso PLAY en el mando del vídeo.


¿A qué no se os había ocurrido?

Fijaos bien en unos detalles que son fundamentales y que aparecen en este algoritmo:

   1. La descripción de cada paso no me lleva a ambigüedades: los pasos son absolutamente explícitos y no inducen a error.
   2. El número de pasos es finito.

Y es que no puedes tener eternamente pensando a la máquina si pretendes que te dé algún resultado en algún momento.

Podría poner una definición rigurosa de lo que es un algoritmo, pero me parece que con esto se coge la idea.

Notar también que he escrito en mayúsculas las palabras SI y SI NO. Como podeis imaginar, formar parte de la manera en que se escriben algoritmos.

Por ahora, os invito a que describais algorítmicamente situaciones cotidianas de vuestra vida. En la próxima entrega haré un resumencito escribiendo las cosas de forma algo más rigurosa (al principio lo que importa es que se entiendan las ideas), completaré lo dicho sobre las variables, y seguiremos por esos pecaminosos senderos del mundo de la programación: las instrucciones de control de un programa.

Fuente:
http://www.programacion.com/articulo/introduccion_a_la_programacion_205
#440
Manual tutorial Interfaz puerto paralelo LPT Visual Studio Express

Presento manual pensado para personas nóveles para los que quieran aprender hacer una interfaz con Visual C#, C++ o el VB .net Express (Gratuito) y poder controlar el puerto paralelo con casi cualquier disposivo, Leds, LCD, display, motores paso a paso, etc...

Se incluye código fuente incluido en el manual por cada tema.

Ver visor.
Descargar manual.
Descargar programa final con instalador incluido (LPT).

Un cordial saludo.
#441
Ayer hablando en el coche con un compañero de trabajo, estuvimos hablando de los diferentes tipos de personas que te puedes encontrar en el mundo de la informática, dentro de una empresa.

Es totalmente abierto a cualquier otro tipo de opinión y distinto punto de vista.

Seré lo más objetivo posible. De menos a más:

Fase Inicial.

    * Personas que empiezan en el mundo de la informática y que están empezando a ser/intentar ser profesionales.
    * Personas que empiezan y que van de enteradillos y sabelotodo y que están empezando a ser/intentar ser profesionales. Estos más tarde evolucionan en enteradillos y sabelotodo senior. Lo veremos más adelante.
    * Personas que empiezan, controlan algo del tema pero son cautos. Estos más tarde evolucionan en posibles cracks y bastante sensatos con ellos mismos.

Fase Intermedia.

    * Personas que han visto que esto no es lo suyo y lo dejan.
    * Personas que para bien o desgracia de los demás se les da bien esto de la informática e intentan demostrar día a día que saben más que el resto. Si tienen que pisar pisan a los demás.
    * Personas que les gusta la informática, se les da bien y tienen la oportunidad de trabajar y vivir de lo que al principio era un hobby y se ha convertido en una vocación.

Fase Final.

    * Personas prepotentes, miran por encima del hombro al resto. Tienen un punto a favor que es el de ser unos cracks (muy buenos) en su área.
    * Personas prepotentes, miran por encima del hombro al resto y la relación entre el resto es bastante distante. No tienen ni p**a idea de informática, pero cada día se empeñan en demostrar a los demás que son los que más saben.
    * Personas a las que se les da muy bien lo que hacen (cracks), comparten lo que saben con mucho gusto y el trato con el resto es exepcional.

Entre las distintas fases se pueden transformar en distintos tipos de profesionales y a la hora de evolucionar normalmente suelen acabar tal como empezaron.

Por ejemplo, nos podemos encontrar la peor calaña que ha evolucionado así:

Fase Inicial.

    * Personas que empiezan y que van de enteradillos y sabelotodo y que están empezando a ser/intentar ser profesionales. Estos más tarde evolucionan en enteradillos y sabelotodo senior. Lo veremos más adelante.

Fase Intermedia.

    * Personas que para bien o desgracia de los demás se les da bien esto de la informática e intentan demostrar día a día que saben más que el resto. Si tienen que pisar pisan a los demás.

Fase Final.

    * Personas prepotentes, miran por encima del hombro al resto y la relación entre el resto es bastante distante. No tienen ni p**a idea de informática, pero cada día se empeñan en demostrar a los demás que son los que más saben. Los peores.

Hace bastante que no escribia un post tan personal, pero bueno como informáticos seguro que vosotros reconocéis a algún tipo de personas así. ¿No?

Otro día que este más inspirado hablaré de los distintos tipos de jefe que nos podemos encontrar en el mundo de la informática. ;)

Y con esto y un bizcocho hasta mañana a las ocho....

Fuente:
http://helektron.com/tipos-de-personas-que-se-dedican-a-la-informatica-profesionalmente/
#442
¿Por qué el programador no es la estrella?

«Hace unos días el periódico Público.es presentaba una entrevista a un programador de Microsoft. Con un titular llamativo el artículo ha ido dando algunas vueltas centrándose únicamente en ese aspecto: en España, el programador es "el escalafón más bajo", en USA es "la estrella" [...] El origen de todo está en que la industria que tenemos en España es muy diferente a la que existe en USA. En su caso, existe una industria de producción, una industria que genera capital a través de la venta de productos[...] Aquí ese tipo de industria apenas existe, y la que existe, casi casi la ignoramos. En España, la industria informática es fundamentalmente una industria de servicios. Como tal, el objetivo principal de una empresa española de informática no es producir y vender un producto, sino dar un servicio de desarrollo. La forma de hacer esto es completamente diferente. De lo que se trata es de conseguir un contrato a largo plazo. Es decir, es básicamente una industria de mantenimiento. Primero para conseguir el contrato lo fundamental es que el precio inicial sea el más bajo posible. Así que lo que necesitas aquí es tener los menores costes posibles. Necesitas programadores baratos, y te da igual la calidad de lo que hagan. Es más, la calidad baja te garantiza futuras necesidades: ampliaciones y mantenimiento.» ¿Hay relación entre el software como servicio y su calidad? ¿Estáis de acuerdo con esta visión del desarrollo en España?

Fuente:
http://espana.barrapunto.com/article.pl?sid=10/06/16/217253
#443
Buenas:

Tengo imágenes .gif en un pictureBox que lo cambio al pulsar un botón. Lo curisoso es que se borra o desaparace la iamgen cuando cambio de imagen y no se porque es.

Tiene que funcioinar así.

Si pulso botón ON, se ve una imagen de una luz encendida. Si pulso el otro botón OFF, se ve la otra imagen del mismo pictureBox pero con la imgen de la luz apagada, así de sencillo.



Descargar proyecto completo de Visual C# 2010 Espress


Código (csharp) [Seleccionar]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

using PicParallel_WPF.Properties; // No olvidar.

// http://social.msdn.microsoft.com/Forums/es-ES/wpfes/thread/924e79ae-3c84-4f28-bb6d-f97022942717/
// http://social.msdn.microsoft.com/Forums/es-ES/wpfes/thread/3a647448-313e-4da1-84d1-d3f25504309e#f22663da-6251-484f-ae4e-4eccb00bbef2

namespace PicParallel_WPF
{
  /// <summary>
  /// Interaction logic for MainWindow.xaml
  /// </summary>
  public partial class MainWindow : Window
  {
    // No olvidar estas variables.
    public int i = 0, j = 0, adress = 888;
    public int D7, D6, D5, D4, D3, D2, D1, D0;

    public MainWindow()
    {
      InitializeComponent();
    }

    private void Reset_LEDs() // Resetea todos los Led al iniciar el programa.
    {
      try
      {
        PicParallel_WPF.PortInterop.Output(adress, 0);
        PicParallel_WPF.PortInterop.Input(adress);
      }
      catch (DllNotFoundException)
      {
        Alerta_1();
      }
      //Reset_LEDs();
      image_D0.Source = new BitmapImage() { UriSource = new Uri(@"/img/off.gif", UriKind.Relative) };
      image_D1.Source = new BitmapImage() { UriSource = new Uri(@"/img/off.gif", UriKind.Relative) };
      image_D2.Source = new BitmapImage() { UriSource = new Uri(@"/img/off.gif", UriKind.Relative) };
      image_D3.Source = new BitmapImage() { UriSource = new Uri(@"/img/off.gif", UriKind.Relative) };
      image_D4.Source = new BitmapImage() { UriSource = new Uri(@"/img/off.gif", UriKind.Relative) };
      image_D5.Source = new BitmapImage() { UriSource = new Uri(@"/img/off.gif", UriKind.Relative) };
      image_D6.Source = new BitmapImage() { UriSource = new Uri(@"/img/off.gif", UriKind.Relative) };
      image_D7.Source = new BitmapImage() { UriSource = new Uri(@"/img/off.gif", UriKind.Relative) };
    }

    #region Opciones
    public void opciones()
    {
      int value = 0;

      if (D0 == 1)
      {
        value += (int)Math.Pow(2, 0);
        LoadNewPict_D0();
      }
      else
        LoadOldPict_D0();
      value += 0;

      if (D1 == 1)
      {
        value += (int)Math.Pow(2, 1);
        LoadNewPict_D1();
      }
      else
        LoadOldPict_D1();
      value += 0;

      if (D2 == 1)
      {
        value += (int)Math.Pow(2, 2);
        LoadNewPict_D2();
      }
      else
        LoadOldPict_D2();
      value += 0;

      if (D3 == 1)
      {
        value += (int)Math.Pow(2, 3);
        LoadNewPict_D3();
      }
      else
        LoadOldPict_D3();
      value += 0;

      if (D4 == 1)
      {
        value += (int)Math.Pow(2, 4);
        LoadNewPict_D4();
      }
      else
        LoadOldPict_D4();
      value += 0;

      if (D5 == 1)
      {
        value += (int)Math.Pow(2, 5);
        LoadNewPict_D5();
      }
      else
        LoadOldPict_D5();
      value += 0;

      if (D6 == 1)
      {
        value += (int)Math.Pow(2, 6);
        LoadNewPict_D6();
      }
      else
        LoadOldPict_D6();
      value += 0;

      if (D7 == 1)
      {
        value += (int)Math.Pow(2, 7);
        LoadNewPict_D7();
      }
      else
        LoadOldPict_D7();
      value += 0;

      try
      {
         PicParallel_WPF.PortInterop.Output(adress, value);
      }
      catch (DllNotFoundException)
      {
        Alerta_1();
      }

    }

    #endregion

    static void Alerta_1()
    {
      MessageBox.Show(@"No se escuentra la dll especificada.

Asegúrate que la dll 'inpout32.dl' esté al lado del ejecutable principal.
La reinstalación puede resolver el problema.", "Aviso:",
    MessageBoxButton.OK, MessageBoxImage.Stop);
    }

    #region Cargando los Led de la imagen.

    private void LoadNewPict_D0()
    {
      image_D0.Source = new BitmapImage() { UriSource = new Uri("/img/on.gif", UriKind.Relative) };
    }

    private void LoadNewPict_D1()
    {
      image_D1.Source = new BitmapImage() { UriSource = new Uri("/img/on.gif", UriKind.Relative) };
    }

    private void LoadNewPict_D2()
    {
      image_D2.Source = new BitmapImage() { UriSource = new Uri("/img/on.gif", UriKind.Relative) };
    }

    private void LoadNewPict_D3()
    {
      image_D3.Source = new BitmapImage() { UriSource = new Uri("/img/on.gif", UriKind.Relative) };
    }

    private void LoadNewPict_D4()
    {
      image_D4.Source = new BitmapImage() { UriSource = new Uri("/img/on.gif", UriKind.Relative) };
    }

    private void LoadNewPict_D5()
    {
      image_D5.Source = new BitmapImage() { UriSource = new Uri("/img/on.gif", UriKind.Relative) };
    }

    private void LoadNewPict_D6()
    {
      image_D6.Source = new BitmapImage() { UriSource = new Uri("/img/on.gif", UriKind.Relative) };
    }

    private void LoadNewPict_D7()
    {
      image_D0.Source = new BitmapImage() { UriSource = new Uri("/img/on.gif", UriKind.Relative) };
    }


    private void LoadOldPict_D0()
    {
      image_D0.Source = new BitmapImage() { UriSource = new Uri("/img/off.gif", UriKind.Relative) };
    }

    private void LoadOldPict_D1()
    {
      image_D1.Source = new BitmapImage() { UriSource = new Uri("/img/off.gif", UriKind.Relative) };
    }

    private void LoadOldPict_D2()
    {
      image_D2.Source = new BitmapImage() { UriSource = new Uri("/img/off.gif", UriKind.Relative) };
    }

    private void LoadOldPict_D3()
    {
      image_D3.Source = new BitmapImage() { UriSource = new Uri("/img/off.gif", UriKind.Relative) };
    }

    private void LoadOldPict_D4()
    {
      image_D4.Source = new BitmapImage() { UriSource = new Uri("/img/off.gif", UriKind.Relative) };
    }

    private void LoadOldPict_D5()
    {
      image_D5.Source = new BitmapImage() { UriSource = new Uri("/img/off.gif", UriKind.Relative) };
    }

    private void LoadOldPict_D6()
    {
      image_D6.Source = new BitmapImage() { UriSource = new Uri("/img/off.gif", UriKind.Relative) };
    }

    private void LoadOldPict_D7()
    {
      image_D7.Source = new BitmapImage() { UriSource = new Uri("/img/off.gif", UriKind.Relative) };
    }
    #endregion */

    private void button_Enviar_Click(object sender, RoutedEventArgs e)
    {
      try
      {
        PicParallel_WPF.PortInterop.Output(adress, Int32.Parse(textBox_byte.Text));
      }
      catch (DllNotFoundException)
      {
        Alerta_1();
      }
    }

    private void button_Address_Click(object sender, RoutedEventArgs e)
    {
      if (textBox_port_adress.Text == "378")
      {
        adress = 888;
      }
      else
      {
        adress = 632;
      }
    }

    private void button_Reset_Leds_Click(object sender, RoutedEventArgs e)
    {
      j = 0; i = 0;
      Reset_LEDs();
      D7 = 0;
      D6 = 0;
      D5 = 0;
      D4 = 0;
      D3 = 0;
      D2 = 0;
      D1 = 0;
      D0 = 0;
    }

    #region Bontones de control.
    private void button_D0_ON_Click(object sender, RoutedEventArgs e)
    {
      D0 = 1;
      opciones();
    }

    private void button_D0_OFF_Click(object sender, RoutedEventArgs e)
    {
      D0 = 0;
      opciones();
    }

    private void button_D1_ON_Click(object sender, RoutedEventArgs e)
    {
      D1 = 1;
      opciones();
    }

    private void button_D1_OFF_Click(object sender, RoutedEventArgs e)
    {
      D1 = 0;
      opciones();
    }

    private void button_D2_ON_Click(object sender, RoutedEventArgs e)
    {
      D2 = 1;
      opciones();
    }

    private void button_D2_OFF_Click(object sender, RoutedEventArgs e)
    {
      D2 = 0;
      opciones();
    }

    private void button_D3_ON_Click(object sender, RoutedEventArgs e)
    {
      D3 = 1;
      opciones();
    }

    private void button_D3_OFF_Click(object sender, RoutedEventArgs e)
    {
      D3 = 0;
      opciones();
    }

    private void button_D4_ON_Click(object sender, RoutedEventArgs e)
    {
      D4 = 1;
      opciones();
    }

    private void button_D4_OFF_Click(object sender, RoutedEventArgs e)
    {
      D4 = 0;
      opciones();
    }

    private void button_D5_ON_Click(object sender, RoutedEventArgs e)
    {
      D5 = 1;
      opciones();
    }

    private void button_D5_OFF_Click(object sender, RoutedEventArgs e)
    {
      D5 = 0;
      opciones();
    }

    private void button_D6_ON_Click(object sender, RoutedEventArgs e)
    {
      D6 = 1;
      opciones();
    }

    private void button_D6_OFF_Click(object sender, RoutedEventArgs e)
    {
      D6 = 0;
      opciones();
    }

    private void button_D7_ON_Click(object sender, RoutedEventArgs e)
    {
      D7 = 1;
      opciones();
    }

    private void button_D7_OFF_Click(object sender, RoutedEventArgs e)
    {
      D7 = 0;
      opciones();
    }
    #endregion
  }
}

#444
Hola:

Me metí en CFGS DAI, Desarrollo de Aplicaciones Informáticas. He visto que el sustituto del DAI es el DAM, Técnico Superior en Desarrollo de Aplicaciones Multiplataforma (DAM)

Por lo  que tengo entendido DAM será el sustituto del DAI. ¿Quiere decir que el DAI con el tiempo tiene poco valor? ¿Las empresas mirarán mejor DAM que DAI? Claro que si, DAI es obsoleto desde que pase unos 5 años.

Lo mismo pasa con ASI, ahora es ASIR.

Lo curioso que hay otro ciclo superior que se llama Técnico Superior en Desarrollo de Aplicaciones Web (DAW) Todo de páginas Web, son completamente nuevos.

Ni se que pensar, seguir con DAI y hacer algo para entrar en DAM con sus correspondientes convalidaciones o meterme cuando acaba DAI al nuevo ASIR. También hay opción de la UNED.

Eso si, tengo un cabreo impresionante, no se que futuro tendrá DAI cuando sea eleiminado por DAM. Sólo estarán de aplicaciones DAM y DAW.

Un cordial saludo.
#445
Electrónica / Compresor de neveras
11 Junio 2010, 19:03 PM
Hola:

Una nevera puede dejar de funcionar, claro que su compresor funcionará del 10. ¿Se le puede sacar alguna utilidad solo el compresor de nevera?

Por ejemplo, no tengo ejemplos para ellos. Lo que no se si funcionará al menos para mover agua de un punto a otro, aceite, etc.



En cuestión de electrónica, ya me encargaré de usar PIC.

Un cordial saludo.
#446
Hola:

Quiero saber a gente que sabe hacer aplicaciones o programas com puede ser esta Interfaz que la he visto vendiendo por 40 €. Por lo que veo, hay programadores que vende su propio software a medida.

Si haces un programa a un cliente como puede ser un controladore de 8 relés por puerto serie, paralelo o USB, ¿a qué precio lo harías? (En España).

Por ejemplo este programa: (En este caso lo entrego gratis con manual y código fuente que aún estoy haciendo para los tres lenguajes de VS .net 2010 Express). Supongamos que tiene un precio.



Sólo quiero saber sus experiencias y precios que hacen sus programas para clientes, conocidos, amigos, etc.

Otra cosa, que normas es recomendable, ya que hay clientes quejicas, se quejan, se quejan pero le cuesta pagar o simplemente no pagan.

El hardaware se que es a parte. De hecho me encargo sobre ello.


Un cordial saludo.
#447
Programación C/C++ / Código a C++
9 Junio 2010, 16:59 PM
Buenas:

Quiero pasar este pedazo de código de C# a C++ 2010. ¿Cómo es?

Código (csharp) [Seleccionar]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Runtime.InteropServices; // No olvidar aqui.

namespace Puerto_paralelo
{
    class PortInterop
    {
        [DllImport("inpout32.dll", EntryPoint = "Out32")]
        public static extern void Output(int adress, int value);
        [DllImport("inpout32.dll", EntryPoint = "Inp32")]
        public static extern int Input(int adress);
    }
}


He creado una clase como indica abajo.







A partir de aquí se me crearon el .h y el .cpp. Por aquí estoy perdido y no se como pasarlo de C# a C++ con Visual C++ 2010.





Saludo.
#448
GNU/Linux / Control de puertos en Linux
3 Junio 2010, 12:54 PM
Hola:



Uso como Sistema Operativo Linux el Ubuntu y el openSUSE. Quiero saber como controlar el puerto paralelo en Linux.

Si alguien lo sabe, ponen información por aquí. Quiero controlar diodos Led a sus salidas con un programa que pueda crear en cualquier lengueje se a C/C++, etc. Muchas gracias.

Saludo.
#449
Buenas amistades:

Quiero saber como controlar el puerto paralelo bajo Linux y si es posible, también con MAC. Quiero saber con qué programa o compilador se pueden trabajar para hacer una interfaz Visual como Windows.



Por ahora estoy haciendo un manual en PDF sobre el puerto LPT para Windows sobre los tres lenguajes del Visual Studio 2010 Express. Haré manuales con Linux y otro para MAC.

Ver imagen.

Si alguien ha hecho su propio circuito impreso sobre control de relés mediante puerto paralelo, me pasan aquí una iumagen bien tomada para publicarlo en el manual.

Un abraso.
#450
Electrónica / Pila desbordada.
29 Mayo 2010, 09:44 AM
uenas:

Tengo las 8 pilas usadas del PIC16F887 y me sale este mensaje.

CORE-E0001: Stack over flow error occurred from instruction at 0x000324

¿Cómo corrigo ese error?

Un abrazo.

PD: A ver si sacan al mercado los nuevos PIC que tienen 16 niveles de Stack.
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2692&redirects=enhanced