desktop

Preguntas de Arduino y C para tal micro

En el 8052 que es el que mejor conozco se puede usar el bit de carry como "acumulador de 1 bit" y hacer transferencias etc bit a bit a las posiciones de memoria direccionables por bit que creo recordar que son 128, los otros 128 se reservan para registros de la uart, timers etc que también se pueden pilotar por bit.
Así puedo leer un pin de un puerto, moverlo al carry y guardarlo en un bit de memoria interna con dos instrucciones sin necesidad de emplear máscaras ni nada:

mov c,pin ; El valor del pin del puerto se copia al carry
mov variable,c ; el valor del carry se copia al bit de la memoria interna

y ya está.
Si otro micro no puede hacer esas operaciones directamente; tengo que leer el puerto, extraer el bit con una máscara y guardarlo con otra, tiene mas sentido usar variables de tamaño byte. Algo así, suponiendo que el bit donde almaceno la variable no está en la misma posición en la que lo leo:
pseudocódigo:
mov a,puerto ; leo los 8 bits del puerto
and a,00000100 ;leo el bit que me interesa
si es 1 ; compruebo si es 0 o 1
or memoria, 1000000 ; si es 1 activo un bi de la memoria
Si es 0 ; y si no lo es
and memoria,01111111 ; borro un bit de la memoria
Lo cual lleva a 6 instrucciones, con un condicional o dos y bastantes líos. Eso podría suponer que mejor guardar un byte entero aunque solo se use un bit.
Quedarían tres instrucciones:
mueve a acumulador el puerto
and acumulador con 0000000100
guarda acumulador en memoria

De todos modos en el 8052 las variables de bit se agotan rápido así que "hay que cuidarlas"


En cualquier otro compilador, como siempre, hay que leer los detalles del compilador, y si por defecto INT son 16 bits pues ya lo sabemos y actuamos en consecuencia. Otros compiladores de C que conozco por defecto INT son 8 bits. El motivo; pues el que programó el compilador sabrá por que
 
Similar, la palabra subrutina es bastante antigua,
Una función tiene bastantes particularidades respecto de una subrutina; variables locales, devuelve un valor...
 
Es parecido. Básicamente una función devuelve un valor, una subrutina no.
Aunque esto no es estricto en absoluto, tanto se puede no asignar a nada el valor de retorno de una función como modificar valores accesibles por el programa principal desde dentro de la subrutina

En C casi no hay diferencia , es en otros lenguajes donde es mas marcada.
 
Pues mira, refloto el tema y luego haré un hilo nuevo, detallando lo que he averiguado.
Estaba intentando usar unas tiras del leds RGB inteligentes para hacer una pantalla pero tenía el problema de que saturaba la RAM por culpa de las librerías que básicamente consumen RAM como si no hubiera un mañana.
Así que intenté acceder a las tiras de leds sin usar las librerías.
Mirando con un analizador lógico resulta que usando las instrucciones de la capa arduino con digitalWrite(pin, estado) lo mas rápido que se podía hacer era a 4us por cambio y claro, leyendo como están hechas las librerías, todas tiran de ensamblador porque se necesita generar un tren de pulsos a 400kHz
Después de varios intentos se me ocurrió usar C sin mas con PORTC = B00001000 lo que fuera, total que no es una ni dos ni diez veces mas rápido, no, es como cincuenta veces mas rápido. De hecho he tenido que retardar la ejecución escribiendo varias veces en el puerto para ensanchar el pulso.

Total, que recomiendo comprarse un analizador lógico de los de 14€ y cuando sea crítico el tiempo analizar que es lo que tardan según que funciones.
 
Hola a todos , la cuestión es la siguiente :Vivo en Cuba y no se si lo sabrán pero en mi país no se venden componentes electrónicos o placas o materiales afines a nivel general , al menos no oficialmente , aunque siempre podemos conseguirlo a través de personas que viajan al exterior o a través de encargos , y mi duda es la siguiente , para mis proyectos de ingeniería necesito un microcontrolador versatil y con buenas prestaciones (No importa el precio) y como el arduino esta de moda , decidí que quizá la marca en sí sea la mejor opción , pero .... de toda la gama cual podría ser el de mejor prestaciones para proyectos en general , es decir , el que mejor memoria tenga , mayor capacidad , mayor cantidad de pines , etc , porque necesito un arduino para todos mis proyectos , es decir, no puedo destinar una placa a cada proyecto que haga , así que.... , alguien que me pueda ayudar??? Gracias
 
personalmete no me gusta arduino, (quiero decir la placa como tal), ese avr es muuyyyy lento, te recomiendo el esp32, es economico y puedes hacer infinidades de cosas con el, posee DOS nucleos a 240MHz :eek:. WiFi, bluetooth, sensor hall, i2s, i2c, cam, interface SD, interface Ethernet, sensores touch, etc, buscalo que te va a encantar, y lo "mejor" es que se puede programar en la misma plataforma de arduino.
 
Sencillo, TODO va en el loop, lo mínimo imprescindible va en la interrupción.
En la interrupción no hay bucles ni por supuesto retardos.
Si la interrupción tiene una instrucción, mejor que si son dos.
ha , buenisimo esa "universalidad" .
si, he visto que incluso con C programan "cosas graficas"

PRGUNTA 1 :
entonces, yo programando un "arduino 1 " ese mismo programa lo meto en un chip ATMEL con el mismo codigo directo ??

si vi que hay una pagina en ARDUINO que me coloca para programar, o sea llenar el

void setup()

y el void loop ()

pero claro, eso es para el ARDUINO que tiene ya especificado por ejemplo el oscilador y otros como el PWM , ahora si quiero trabajar directo con el chip , eso me obliga a aprender a tener que definir con instrucciones de C ( ojo, esto supongo yo) todas esas cosillas que ARDUINO me simplifica o directamente no me da la opcion.
PREGUNTA 2 :
debe haber una pagina, no ?? que explique, y de el lugar para escribir el programa y ver si corre o tengo errores de sintaxis y eso, para atmel y para pic o para uno, no se.
y explique las instrucciones en C pero para el chip.

Si tienes pensado usar AVR, el Atmel Studio es una buena plataforma de programación, y si ya decidistes que es un AVR, lo primero es aprender cuál es la arquitectura de esos microcontroladores.
Para mí esa es la mejor opción.
 
Atrás
Arriba