Documente Academic
Documente Profesional
Documente Cultură
C (entradas analgicas)
Los registros DDR y PORT pueden ser ambos, escritos y ledos. El registro
PIN corresponde al estado de las entradas as que solo puede ser ledo.
El PORTD mapea los pines digitales del 0 al 7
El PORTB mapea los pines digitales del 8 al 13. Se debe recordar que Los
bits altos (6 & 7) estn mapeados a los pines del cristal de cuarzo y no
pueden ser usados. Estos son solamente accesibles en el Arduino Mini.
Cada bit de estos registros corresponden con un solo pin; por ejemplo el bit
menos significativo de los registros DDRB, PORTB, y PINB hace referencia al
pin PB0 (pin digital 8)
Normalmente antes para declarar un pin lo hacamos de la
siguiente manera:
void setup(){
Serial.begin(9600);
pinMode(2,INPUT);
pinMode(3,OUTPUT);
void setup(){
Serial.begin(9600);
pinMode(2,INPUT);
pinMode(3,OUTPUT);
}
Entonces si quisiramos declarar 7 pines (desde el digital 0 al digital 7),
tendramos que repetir pinMode 7 veces. Al igual que escribir tendramos
que poner digitalWrite(pin,estado) pin 0 estado alto, pin 1 estado bajo, etc.
Al utilizar Registros PORT (Puerto) tenemos la ventaja de que con solo
una instruccin podemos declarar el pin como entrada o salida y tambin
podemos escribir, si lo queremos, como estado HIGH o LOW.
Para controlar cualquiera de los tres puertos, debemos usar dos
instrucciones.
Dato Importante:
Los pines 0 y 1 son la transmisin serial (RX y TX respectivamente). Si
utilizas Serial.begin en alguno de esos 2 puertos; no tendrs
comunicacin serial. Cuidado con eso.
Ejemplo:
1 = OUTPUT
0 = INPUT
DDRX = B11111110;
donde X es la letra del puerto a usar (BCD). Sin embargo si queremos tener
comunicacin Serial tendramos que hacer esto:
Ubicaci 7
n del
pin en
Arduino
.
Ejemplo:
1 =HIGH
0 = LOW
PORTX= B11111110;
En este ejemplo los pines del 1 al 7 permanecern encendidos (HIGH) y el
pin 0 LOW. Veamos un ejemplo aplicando estos conceptos:
En este ejemplo lograremos que durante dos segundos todos los leds
enciendan, durante dos segundos ms alumbren los impares y durante dos
ms todos se apaguen. Veamos:
Configuracin Utilizada:
void setup(){
DDRD= B11111100;//Utilizamos D porque es del 0 al 7 y B porque es
Binario.
//En este ejemplo no utilic los pines 0 y 1 del Arduino.
/*Esta instruccin es lo mismo que hacer esto:
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT); */
}
void loop(){
for (contador=0; contador <3; contador ++){//establecemos contador
menor que 3 porque solo son 3 casos.
switch(contador){
case 0:
PORTD= B11111111;//aqu encenderemos todos los leds
delay(2000);
case 1:
PORTD= B10101010;//aqu encenderemos solo los impares.
delay(2000);
case 2:
PORTD= B00000000;//aqu los apagaremos todos.
delay(2000);
}
}
}
Para ver otro ejemplo utilizando Registro PORT (Puerto), visitemos el
siguiente post:
Ventajas:
{ . }
El mtodo deber ir tomando cada bit de la posicin del valor pasado como
variable Leds a la funcin y mapear directamente su valor al Port que
corresponda y en la posicin que corresponda. Por ejemplo si Leds
=0b100.., el Led1 est en ON y por lo tanto dicho 1 deber ser
escrito en el PortD en el tercer bit = PD2.
Si observamos el PortD es un Byte (8bits), al igual que el PortB, aunque
este ltimo solo usa 5 bits. En la siguiente tabla vamos a representar la
variable leds (16 bits), el PORTD(8bits), PORTB(5 bits) y una variable
auxiliar (aux) tipo byte de 8 bits
Se puede apreciar el MSB o byte ms significativo que es la parte alta o
Nible Alto de la variable leds y el LSB o byte menos significativo o Nible
Bajo de la variable leds. El MSB de los PortD/B no existen.
d= PIND; esta es una macro con acceso directo solo a la lectura del
PortD. En el tutorial mencionado antes El registro PORT (puerto)
Arduino , se describe muy bien. Para resumir, cada puerto del
Arduino B,C y D, existen macros para su acceso directo de la forma:
Como ven este otro enfoque es mas sinttico e incluso se podra optimizar
usando vectores ya que los desplazamientos son impares, entonces se
podra usar una variable ndice que incrementara en forma impar, pero esa
es otra historia. La idea aunque parece rebuscada fue la mejor manera de
explicar que encontr para mostrar el tema de las posiciones en variables y
puertos de diferente tamao.
void escribirLed2( unsigned int
{
/*
/*
Esta funcion mapea los pines del 2 al 10 que son Led 1 al 10 en los puertos
PORTD y PORTD
PORTD =dp7,dp6,dp5,dp4,dp3,dp2,tx,rx
=L6, L5, L4,L3, L2, L1, x, x
L11,
L10, L9 , L8 , L7
*/
byte led1,led2,led3,led4,led5,led6,led7,led8,led9,led10,led11,led12;
// variables que van a mapear el estado en los puertos D y B
byte puertoD=0;
byte puertoB=0;
byte aux;
byte d; // la lectura del byte del puerto D
aux=leds>>8; // BLSB del int tiene la info de los leds 2 al 8
led1= (aux >>5) & 0b00000100;
led2=(aux>>3) & 0b00001000;
led3=(aux>>1) & 0b00010000;
led4= (aux<<1) & 0b00100000;
led5=(aux <<3) & 0b01000000;
led6=(aux<<5) & 0b10000000;
//Serial.println(aux,BIN);
led7=(aux>>1) & 0b00000001;
led8=(aux<<1) & 0b00000010;
// hasta aqui se mapearon del led 1 al 8 donde se desplazo el MSB de leds
al LSB de aux
// nuevo
aux=leds; // aux tiene el LSB de leds : L9,L10,L11,L12,x,x,x,x
led9=(aux>>5) & 0b00000100;
led10=(aux>>3) & 0b00001000;
led11=(aux>>1) & 0b00010000;
led12=(aux<<1) & 0b00100000;
puertoD=puertoD | led1|led2|led3|led4|led5|led6;
puertoB=puertoB|led7|led8|led9|led10|led11|led12;
d=PIND; // d lee el puertoD esto es para no afectar la escritura de rx/tx bit
1y0
d=d&0b00000011;
puertoD=puertoD|d;
PORTD = puertoD; // escritura al puerto D
PORTB = puertoB & 0b00111111;