Core Modules ● ● ● ● ● Módulos pre-armados: microprocesador + RAM + flash [ + Ethernet ] [ + ... ] Recurso probado en ambientes conflictivos Económicos (no DIY MAC) De fácil implementación: pueden soldarse o conectarse con un zócalo a la placa principal. Más memoria ? ● ● Program & Debug Reemplazar el core module por uno de mayor capacidad Aplicación TCP/IP sobre Ethernet ? ● ● Conectar el patch-cord Comenzar a desarrollar la aplicación Mundo exterior Dynamic C ● Implementación de C con funciones específicas para Rabbit ● Soporte multitarea ● Manejo de memoria ● Bibliotecas de funciones ● RTC, USARTs, I2C master, SPI master/slave, GPS NMEA-0183, math, FFT, etc. ● Debugging en circuito (C o assembler) ● Soporte TCP/IP sin regalías, stack maduro (2000) ● DHCP client, HTTP server con SSI/CGI, FTP, TFTP, ICMP, POP3 client, SMTP client, etc. Criterios de Aplicación ● Control industrial ● Data logging ● Interfaces de usuario complejas ● Conexión en red (monitoreo remoto) ● Comunicaciones packet/frame-oriented ● Gran cantidad de cálculos matemáticos ● Atender varias tareas a la vez ● Tiempo de desarrollo muy reducido Ethernet Flash Program & Debug Micro ... RAM Tarjeta SD (mini) Wi-Fi Bajo costo (minicores) 5V 9 3,3V 5V-tolerant 10 Low Voltage Blue's ● 3V ↔ 5V !? ¿Qué hago? ● ● ● Entrar en crisis Contratar a un ingeniero en electrónica Usar logic-level translators – – – 74LVX3245 (sí, hay en Cika) Micro → 74HCT a 5V → periférico diseñarlo en forma discreta CPU CISC Super-clon del Z80 ● ● Registros de 32-bits: PW, PX, PY, PZ ● ● punteros tanto en memoria lógica como física puede o no usar MMU CPU CISC 8-bits con características interesantes de procesamiento en 16 y 32-bits, y un mapa de memoria física de 24-bits (16MB) ● ● Acceso a memoria tanto en un bus de 8 como de 16-bits ● Más de 400 instrucciones ● loops largos Instrucciones aritméticas, lógicas y de acceso a memoria en 16- y 32bits ● Modo usuario y modo supervisor ● ● protección de memoria y stack Instrucciones para optimizar la encripción de datos ● ● AES y SSL en 8-bits Rabbit 5000 (RCM-5xxx): características principales ● Clock de hasta 100MHz. ● 16-bit internal bus, 128KB RAM on-chip ● Core 1,8V; 3,3V I/O, no son 5V-tolerant ● Consumo del core: 0,57 mA/MHz ● Ports I/O paralelo: 48 líneas de entrada/salida ● seis ports de 8 bits (A (A, B, C, D, E y H) H) ● versatilidad de asignación de pines a periféricos. ● CPU y demás periféricos = R4000 ● Ethernet 10/100Base-T integrada y con DMA ● Wi-Fi 802.11b/g integrada y con DMA ● TECNOLOGÍA PROPIA, desde 2007 (diseñado en casa) Rabbit 6000 (RCM-6xxx): características principales ● Clock de hasta 200MHz ● Core 1,2V; 3,3V I/O, no son 5V-tolerant ● Consumo del core: 0,37 mA/MHz ● 1MB fast RAM on-chip (16-bit) + 32KB battery-backed SRAM (16-bit) ● Ports I/O paralelo: 64 líneas de entrada/salida ● ocho ports de 8 bits (A (A, B, C, D, E, F, G y H) H) ● 4 FIMs ● CPU y demás periféricos = R5000 (ADC 12-bits, 8 canales) ● Ethernet 10/100Base-T integrada y con DMA, incluye PHY ● Wi-Fi 802.11a/b/g integrada y con DMA ● USB 2.0 Host Dynamic C ● Coma flotante, funciones trigonométricas ● sin(x): 160us (basado en una CPU a 22MHz) ● suma y multiplicación: 14us ● raíz cuadrada y división: 40us ● Soporte multitarea cooperativo simple y eficiente (RTOS disponible) ● FFT, GPS NMEA-0183, Wiegand, FAT, touchscreen, etc. ● Debugging en circuito, incluido en los kits de desarrollo ● ● Web server: SSI, SSI, CGI o RabbitWeb + #ximport en vez de @#$%~ GRATIS ● no code size limit, no time limit desde 2008 ● no crack, no astalavista, no Parque Rivadavia Multitarea cooperativo en Dynamic C for(;;){ for(;;){ costate{ costate{ ... ... sentencia de control sentencia de control ... ... } } costate{ costate{ ... ... sentencia de control sentencia de control ... ... } } } } // cede la ejecución a otros costates // cede la ejecución a otros costates // cede la ejecución a otros costates // cede la ejecución a otros costates Web server en Dynamic C #ximport "index.html" #ximport "index.html" #ximport "rabbit1.gif" #ximport "rabbit1.gif" index_html index_html rabbit1_gif rabbit1_gif #use "dcrtcp.lib" #use "dcrtcp.lib" #use "http.lib" #use "http.lib" SSPEC_MIMETABLE_START SSPEC_MIMETABLE_START SSPEC_MIME(".html", "text/html") SSPEC_MIME(".html", "text/html") SSPEC_MIME(".gif", "image/gif") SSPEC_MIME(".gif", "image/gif") SSPEC_MIMETABLE_END SSPEC_MIMETABLE_END SSPEC_RESOURCETABLE_START SSPEC_RESOURCETABLE_START SSPEC_RESOURCE_XMEMFILE("/", index_html) SSPEC_RESOURCE_XMEMFILE("/", index_html) SSPEC_RESOURCE_XMEMFILE("/index.html", index_html) SSPEC_RESOURCE_XMEMFILE("/index.html", index_html) SSPEC_RESOURCE_XMEMFILE("/rabbit.gif", reabbit1_gif) SSPEC_RESOURCE_XMEMFILE("/rabbit.gif", reabbit1_gif) SSPEC_RESOURCETABLE_END SSPEC_RESOURCETABLE_END main() main() { { sock_init(); sock_init(); http_init(); http_init(); while(1){ while(1){ http_handler(); http_handler(); } } } } RabbitWeb Mandar un mail en Dynamic C #define FROM #define FROM #define TO #define TO #define SUBJECT #define SUBJECT #define BODY #define BODY "scaprile@ellie" "scaprile@ellie" "scaprile@ellie" "scaprile@ellie" "Rabbit email" "Rabbit email" "Estoy aburrido y quiero mandar un mail" "Estoy aburrido y quiero mandar un mail" #define USE_SMTP_AUTH #define USE_SMTP_AUTH #define SMTP_SERVER #define SMTP_SERVER #use "smtp.lib" #use "smtp.lib" "192.168.1.50" "192.168.1.50" smtp_setauth("myusername", "mypassword"); smtp_setauth("myusername", "mypassword"); smtp_sendmail(TO, FROM, SUBJECT, BODY); smtp_sendmail(TO, FROM, SUBJECT, BODY); while(smtp_mailtick()==SMTP_PENDING); while(smtp_mailtick()==SMTP_PENDING); Cliente FTP en Dynamic C: Data handler int ftp_datahandler(char * data, int len, longword offset, int ftp_datahandler(char * data, int len, longword offset, int flags, void * dhnd_data) int flags, void * dhnd_data) { { switch (flags) { switch (flags) { case FTPDH_IN: case FTPDH_IN: return 0; return 0; case FTPDH_OUT: case FTPDH_OUT: if(tengoquedejardemandar) // dhnd_data me lo dice o , o , etc. if(tengoquedejardemandar) // dhnd_data me lo dice o , o , etc. return 0; return 0; sprintf(data, "Lo que quiero mandar”); sprintf(data, "Lo que quiero mandar”); return(strlen(data)); return(strlen(data)); case FTPDH_END: case FTPDH_END: case FTPDH_ABORT: case FTPDH_ABORT: return 0; return 0; } } } } return -1; return -1; Cliente FTP en Dynamic C: envío ftp_client_setup(resolve(FTP_SERVER),0,USER,PASSWORD, ftp_client_setup(resolve(FTP_SERVER),0,USER,PASSWORD, FTP_MODE,FILENAME,NULL,NULL,0); FTP_MODE,FILENAME,NULL,NULL,0); ftp_data_handler(ftp_datahandler, &variabledecontrol, 0); ftp_data_handler(ftp_datahandler, &variabledecontrol, 0); while(ftp_client_tick()== FTPC_AGAIN); while(ftp_client_tick()== FTPC_AGAIN); Comunicación vía UDP en Dynamic C udp_Socket s; udp_Socket s; udp_open(&s,LOCAL_PORT,DEST_IP,DEST_PORT,NULL); udp_open(&s,LOCAL_PORT,DEST_IP,DEST_PORT,NULL); tcp_tick(&s); tcp_tick(&s); udp_send(&s,MY_STRING,strlen(MY_STRING)); udp_send(&s,MY_STRING,strlen(MY_STRING)); udp_recv(&s,buffer,size); udp_recv(&s,buffer,size); sock_close(&s); sock_close(&s); Ethernet o Wi-Fi en Dynamic C #define TCPCONFIG 0 #define TCPCONFIG 0 #define USE_ETHERNET #define USE_ETHERNET #define MY_IP_ADDRESS #define MY_IP_ADDRESS #define MY_NETMASK #define MY_NETMASK #define MY_GATEWAY #define MY_GATEWAY 1 1 "192.168.1.54" "192.168.1.54" "255.255.255.0" "255.255.255.0" "192.168.1.1" "192.168.1.1" #define TCPCONFIG 1 #define TCPCONFIG 1 #define USE_WIFI 1 #define USE_WIFI 1 #define IFC_WIFI_SSID #define IFC_WIFI_SSID #define IFC_WIFI_MODE #define IFC_WIFI_MODE #define IFC_WIFI_REGION #define IFC_WIFI_REGION #define IFC_WIFI_ENCRYPTION #define IFC_WIFI_ENCRYPTION "Cika" "Cika" IFPARAM_WIFI_INFRASTRUCTURE IFPARAM_WIFI_INFRASTRUCTURE IFPARAM_WIFI_REGION_AMERICAS IFPARAM_WIFI_REGION_AMERICAS IFPARAM_WIFI_ENCR_NONE IFPARAM_WIFI_ENCR_NONE #define MY_IP_ADDRESS "192.168.1.54" #define MY_IP_ADDRESS "192.168.1.54" #define _PRIMARY_STATIC_IP MY_IP_ADDRESS #define _PRIMARY_STATIC_IP MY_IP_ADDRESS #define MY_NETMASK "255.255.255.0" #define MY_NETMASK "255.255.255.0" #define _PRIMARY_NETMASK MY_NETMASK #define _PRIMARY_NETMASK MY_NETMASK #define MY_GATEWAY #define MY_GATEWAY "192.168.1.1" "192.168.1.1" Algo que quieran saber ? En lo posible relacionado con este tema, o de última que esté a mi alcance, no me vayan a preguntar por el sentido de la vida a menos que estén dispuestos a pagarse más de una cerveza.