69 votos

¿Cómo puede cualquier persona usar un microcontrolador que tiene sólo 384 bytes de memoria de programa?

Por ejemplo un PIC10F200T

Prácticamente cualquier código que escriba será más grande que, a menos que sea un chip de propósito único. ¿Hay alguna forma de cargar más memoria de programa de almacenamiento externo o algo? Soy solo curioso, no veo cómo esto podría ser muy útil... pero debe ser.

135voto

Mario Puntos 191

De que los niños, get off my lawn!

384 bytes es un montón de espacio para crear algo muy complejo en ensamblador.

Si usted cavar de nuevo a través de la historia para cuando las computadoras eran del tamaño de una habitación, usted encontrará algunos realmente increíbles hazañas de arte ejecutadas en <1k.

Por ejemplo, leer los clásicos de la Historia de Mel - Un Verdadero Programador. Ciertamente, los chicos tuvieron 4096 palabras de memoria para jugar con el, el decadente de los infieles.

También veremos algunos de los viejos demoscene competiciones donde el reto era para encajar un "intro" en el sector de arranque de un disquete, típico de los objetivos de 4k o 40k y, generalmente, la gestión de incluir la música y la animación.

Editar para agregar: resulta que usted puede implementar el mundo en sus primeros $100 calculadora científica en 320 palabras.

Edición para los jóvenes 'uns:

  • Floppy = disquete.
  • Sector de arranque = 1er sector del disquete leer en el arranque.
  • Demoscene = programación de competiciones entre grupos de hackers.
  • Ensamblador de = forma elegante de programación de un dispositivo si usted es demasiado suave para el uso de 8 interruptores de palanca y un botón de "tienda".

60voto

Alex Andronov Puntos 178

Los microcontroladores son lo suficientemente barato que con frecuencia son utilizados para hacer cosas muy simples que en los últimos años sería más probable que se han hecho con lógica discreta. Cosas muy simples. Por ejemplo, uno podría querer un dispositivo para activar una salida para un segundo cada cinco segundos, más precisamente de un temporizador 555 sería capaz de hacer.

  movwf OSCCON
mainLp:
  ; Set output low
  clrf  GPIO
  movlw 0xFE
  movwf TRIS
  clrwdt
  call  Wait1Sec
  clrwdt
  call  Wait1Sec
  clrwdt
  call  Wait1Sec
  clrwdt
  call  Wait1Sec
  ; Set output high
  bsf   GPIO,0
  clrwdt
  call  Wait1Sec
  goto  mainLp
Wait1Sec:
  movlw 6
  movwf count2
  movlw 23
  movwf count1
  movlw 17
  movwf count0
waitLp:
  decfsz count0
   goto   waitLp
  decfsz count1
   goto   waitLp
  decfsz count2
   goto   waitLp
  retlw  0

Que sería un verdadero, útil aplicación, en menos de 32 palabras (48 bytes) de espacio de código. Uno podría agregar fácilmente un par de opciones para que algunos terminales de e/S de control de opciones de tiempo y todavía tienen un montón de espacio de sobra, pero incluso si todos los chip hizo fue precisamente lo que se muestra por encima de él aún podría ser más barato y más fácil que cualquier otra alternativa el uso discreto de la lógica. Por CIERTO, el clrwdt instrucciones puede ser movido a la subrutina, pero hacer eso sería hacer las cosas menos robusto. Como está escrito, incluso si una falla hace que el retorno de la dirección de la pila a corromperse, el organismo de control no son alimentados hasta la ejecución vuelve al bucle principal. Si eso nunca pasa, el watchdog restablecer el chip después de un par de segundos.

29voto

Richard T Puntos 339

"SÓLO" 384 bytes?

El camino de vuelta en el día, tenía el encargo de escribir un sistema operativo completo (por mí mismo) para una computadora especializada que sirve el barco, ductos y refinería de gestión de la industria. El primer producto fue 6800 base y fue actualizado al 6809, y que querían un nuevo sistema operativo para ir junto con el 6809 para que pudieran eliminar los costos de las licencias del sistema operativo original. También estaban chocando la rom de arranque del tamaño de 64 bytes, 32. Si recuerdo bien, FUE hace unos 33 años! - Estoy convencido de que los ingenieros de darme de 128 bytes para que yo pudiera poner todo el sistema operativo, los controladores de dispositivo en la rom y por lo tanto hacer que el dispositivo más fiable y versátil. Esto incluye:

  • Controlador de teclado con la tecla de rebote
  • Controlador de vídeo
  • Unidad de disco conductor y el rudimentario sistema de archivos (Motorola "abloader formato", si mal no recuerdo), con capacidad para tratar "ahorrado" la memoria como si fuese realmente rápida de espacio en disco.
  • Controlador de módem (que consiguió el FSK hacia atrás, por lo que estos módems sólo habló con cada uno de los otros)

Sí, todos estos eran tan escueto como se pone, y de la mano-optimizado para eliminar todos los extraños ciclo, pero perfectamente útil y confiable. Sí, me metió con calzador a todos de que en la bytes disponibles - oh, es TAMBIÉN configurar el manejo de la interrupción, las diferentes pilas, y se inicializa el tiempo real / sistema operativo multitarea, se le solicitará al usuario en las opciones de arranque y arrancar el sistema.

Un amigo mío que todavía está afiliado con la compañía (su sucesor) me dijo hace un par de años que mi código está todavía en servicio!

Usted puede hacer MUCHO con 384 bytes...

21voto

whatsisname Puntos 2628

Puede usar esto para aplicaciones muy pequeñas ( PSU Comienzo retrasado, reemplazo de Temporizador 555, control basado en el triac, LED parpadeante etc...) con la huella más pequeña que necesita con puertas lógicas o con un temporizador 555.

16voto

F.X. Puntos 180

He diseñado un sensor de humedad para las plantas que realiza un seguimiento de la cantidad de agua que la planta tiene y parpadea un LED si la planta necesita agua. Usted puede hacer que el sensor de aprender el tipo de planta y por lo tanto cambiar su configuración durante el funcionamiento. Se detecta bajo voltaje en la batería. Corrí fuera de flash y ram, pero fue capaz de escribir todo en código C para que este producto funcione sin problemas.

He utilizado el pic10f que usted menciona.


Aquí está el código que he hecho para mi de Agua de la Planta del Sensor. He utilizado el pic10f220 , ya que tiene un módulo ADC, tiene la misma memoria como el pic10f200, voy a tratar de encontrar el esquema de mañana.

El código está en español, pero es muy simple y debe ser fácil de entender. Cuando el Pic10F se sale del modo de suspensión, se restablece lo que tiene que ver si fue un PowerUp o un reset y actuar en consecuencia. La planta de configuración se guarda en la memoria ram, ya que en realidad nunca se apaga.

PRINCIPAL.C

/*
Author: woziX (AML)

Feel free to use the code as you wish. 
*/

#include "main.h"

void main(void) 
{  
    unsigned char Humedad_Ref;
    unsigned char Ciclos;
    unsigned char Bateria_Baja;
    unsigned char Humedad_Ref_Bkp;

    OSCCAL &= 0xfe;             //Solo borramos el primer bit
    WDT_POST64();                   //1s
    ADCON0 = 0b01000000;
    LEDOFF();
    TRIS_LEDOFF(); 

    for(;;) 
    {  
        //Se checa si es la primera vez que arranca
        if(FIRST_RUN())
        {
            Ciclos = 0;
            Humedad_Ref = 0;
            Bateria_Baja = 0;
        }

        //Checamos el nivel de la bateria cuando arranca por primera vez y cada 255 ciclos.
        if(Ciclos == 0)
        {
            if(Bateria_Baja)
            {
                Bateria_Baja--;
                Blink(2);
                WDT_POST128();
                SLEEP();
            }       

            if(BateriaBaja())
            {
                Bateria_Baja = 100;     //Vamos a parpadear doble por 100 ciclos de 2 segundos
                SLEEP();
            }
            Ciclos = 255;
        }   

        //Checamos si el boton esta picado
        if(Boton_Picado)
        {
            WDT_POST128();
            CLRWDT();
            TRIS_LEDON(); 
            LEDON();
            __delay_ms(1000);   
            TRIS_ADOFF();
            Humedad_Ref = Humedad();
            Humedad_Ref_Bkp = Humedad_Ref;
        }   

        //Checamos si esta calibrado. Esta calibrado si Humedad_Ref es mayor a cero
        if( (!Humedad_Ref) || (Humedad_Ref != Humedad_Ref_Bkp) )
        {
            //No esta calibrado, hacer blink y dormir
            Blink(3);
            SLEEP();
        }   

        //Checamos que Humedad_Ref sea mayor o igual a 4 antes de restarle 
        if(Humedad_Ref <= (255 - Offset_Muy_Seca))
        {
            if(Humedad() > (Humedad_Ref + Offset_Muy_Seca)) //planta casi seca
            {
                Blink(1);
                WDT_POST32();
                SLEEP();    
            }       
        }

        if(Humedad() >= (Humedad_Ref))  //planta seca
        {
            Blink(1);
            WDT_POST64();
            SLEEP();    
        }   

        if(Humedad_Ref >= Offset_Casi_Seca )
        {
            //Si Humedad_Ref es menor a Humedad, entonces la tierra esta seca. 
            if(Humedad() > (Humedad_Ref - Offset_Casi_Seca))  //Planta muy seca
            {
                Blink(1);
                WDT_POST128();
                SLEEP();    
            }
        }

        SLEEP();
    }  
} 

unsigned char Humedad (void)
{
    LEDOFF();
    TRIS_ADON();
    ADON();
    ADCON0_CH0_ADON();
    __delay_us(12); 
    GO_nDONE = 1;
    while(GO_nDONE);
    TRIS_ADOFF();
    ADCON0_CH0_ADOFF();
    return ADRES;
}   

//Regresa 1 si la bateria esta baja (fijado por el define LOWBAT)
//Regresa 0 si la bateria no esta baja
unsigned char BateriaBaja (void)
{
    LEDON();                
    TRIS_ADLEDON();
    ADON();
    ADCON0_ABSREF_ADON();
    __delay_us(150);        //Delay largo para que se baje el voltaje de la bateria 
    GO_nDONE = 1;
    while(GO_nDONE);
    TRIS_ADOFF();
    LEDOFF();
    ADCON0_ABSREF_ADOFF();  
    return (ADRES > LOWBAT ? 1 : 0);
}   

void Blink(unsigned char veces)
{
    while(veces)
    {
        veces--;
        WDT_POST64();
        TRIS_LEDON(); 
        CLRWDT();
        LEDON();
        __delay_ms(18); 
        LEDOFF();
        TRIS_ADOFF();
        if(veces)__delay_ms(320);   
    }   
}   

PRINCIPAL.H

/*
Author: woziX (AML)

Feel free to use the code as you wish. 
*/

#ifndef MAIN_H
#define MAIN_H

#include <htc.h>
#include <pic.h>

 __CONFIG (MCPU_OFF  & WDTE_ON & CP_OFF & MCLRE_OFF & IOSCFS_4MHZ ); 

#define _XTAL_FREQ              4000000
#define TRIS_ADON()             TRIS = 0b1101
#define TRIS_ADOFF()            TRIS = 0b1111
#define TRIS_LEDON()            TRIS = 0b1011
#define TRIS_LEDOFF()           TRIS = 0b1111
#define TRIS_ADLEDON()          TRIS = 0b1001


#define ADCON0_CH0_ADON()          ADCON0 = 0b01000001;     // Canal 0 sin ADON
#define ADCON0_CH0_ADOFF()       ADCON0 = 0b01000000;       // Canal 0 con adON
#define ADCON0_ABSREF_ADOFF()    ADCON0 = 0b01001100;       //Referencia interna absoluta sin ADON
#define ADCON0_ABSREF_ADON()     ADCON0 = 0b01001101;       //referencia interna absoluta con ADON

//Llamar a WDT_POST() tambien cambia las otras configuracion de OPTION
#define WDT_POST1()   OPTION = 0b11001000
#define WDT_POST2()   OPTION = 0b11001001
#define WDT_POST4()   OPTION = 0b11001010
#define WDT_POST8()   OPTION = 0b11001011
#define WDT_POST16()  OPTION = 0b11001100
#define WDT_POST32()  OPTION = 0b11001101
#define WDT_POST64()  OPTION = 0b11001110
#define WDT_POST128() OPTION = 0b11001111

#define Boton_Picado    !GP3
#define FIRST_RUN()     (STATUS & 0x10) //Solo tomamos el bit TO

//Offsets
#define Offset_Casi_Seca  5
#define Offset_Muy_Seca   5

 //Low Bat Threshold
#define LOWBAT                    73
/*
Los siguientes valores son aproximados
LOWBAT  VDD
50      3.07
51      3.01
52      2.95
53      2.90
54      2.84
55      2.79
56      2.74
57      2.69
58      2.65
59      2.60
60      2.56
61      2.52
62      2.48
63      2.44
64      2.40
65      2.36
66      2.33
67      2.29
68      2.26
69      2.23
70      2.19
71      2.16
72      2.13
73      2.10
74      2.08
75      2.05
76      2.02
77      1.99
78      1.97
*/


#define LEDON()                 GP2 = 0; //GPIO = GPIO & 0b1011
#define LEDOFF()                GP2 = 1; //GPIO = GPIO | 0b0100
#define ADON()                  GP1 = 0; //GPIO = GPIO & 0b1101
#define ADOFF()                 GP1 = 1; //GPIO = GPIO | 0b0010

unsigned char Humedad (void);
unsigned char BateriaBaja (void);
void Delay_Parpadeo(void);
void Blink(unsigned char veces);

#endif

Déjeme saber si usted tiene preguntas, voy a tratar de responder a partir de lo que recuerdo. Yo codificado esto varios años atrás, por lo que no revise mis habilidades de codificación, que han mejorado :).

Nota Final. He utilizado el Hi-Tech C compilador.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X