Escolar Documentos
Profissional Documentos
Cultura Documentos
,
2%-(7,92
HOPLFURFRQWURODGRU$7PHJD
,,
0$7(5,$/(6<(48,32
PyGXORGHHQWUHQDPLHQWR$YU38&30HJD5HYRSRVWHULRU
&DEOHGHFRPXQLFDFLyQVHULDO,635HYRSRVWHULRU
0yGXORGHHQWUDGDVDOLGD5HYRSRVWHULRU
&DEOHGHFRPXQLFDFLyQVHULDO56
)XHQWHGHDOLPHQWDFLyQGHYROWLRV
FRPSXWDGRUDSHUVRQDO
GLVFRGHGH0%
&DEOHVGHFRQH[LyQ
,,,+(55$0,(17$6'('(6$552//2
,9
7(0325,=$'25&217$'257,0(5
(OPyGXORGHO7LPHUHVWDEDVDGRHQHOUHJLVWUR7&17TXHHVXQFRQWDGRUGHELWV
/D IUHFXHQFLD FRQ OD TXH VH LQFUHPHQWD OD FXHQWD GH HVWH UHJLVWUR HV FRQILJXUDEOH OD VHxDO GH
UHORMSXHGHYHQLUGHOSUHHVFDODGRURSXHGHVHUXQDVHxDOH[WHUQDDOPLFURFRQWURODGRU
/D PDQHUD PDV FRP~Q GH WUDEDMDU FRQ HO 7LPHU HV PDQHMDQGR ORV &RPSDUDGRUHV GH
6DOLGD (O 7LPHU FXHQWD FRQ GRV XQLGDGHV GH FRPSDUDGRU GH VDOLGD &DGD FRPSDUDGRU GH
VDOLGD SRVHH XQ UHJLVWUR GH ELWV 2&5$ \ 2&5% &DGD YH] TXH HO 7&17 LJXDOD D XQR GH
HVWRV UHJLVWURV FRPSDUDFLyQ H[LWRVD XQ GHWHUPLQDGR ELW WRPD HO YDORU OyJLFR GH 2&)$ \
2&)%HQHOUHJLVWUR7,)5
'H HVWD PDQHUD SRGHPRV WHPSRUL]DU D XQD IUHFXHQFLD GHVHDGD &RQRFLHQGR OD
IUHFXHQFLD GH LQFUHPHQWR GH 7&17 IUHFXHQFLD FRQILJXUDEOH SRGHPRV FDOFXODU HO YDORU TXH
GHEHPRVGDUD2&5;SDUDTXHODFRPSDUDFLyQH[LWRVDVHSURGX]FDDODIUHFXHQFLDGHVHDGD
VHSURGXFHODFRPSDUDFLyQH[LWRVD
352%/(0$'(6$552//$'27LPHUBVRQGHR
(O VLJXLHQWH HMHPSOR PXHVWUD XQD FXHQWD HQ OHGV TXH VH LQFUHPHQWD FDGD PV
9DPRVDWUDEDMDUFRQHO7LPHUHQPRGR&7&&DGDYH]TXHVHSURGXFHODFRPSDUDFLyQH[LWRVD
HOELW2&)$WRPDHOYDORUGH6HYDDVRQGHDUHOHVWDGRGHHVWHELW\FDGDYH]TXHWRPHHO
YDORUOyJLFRGH LQFUHPHQWDPRV ODFXHQWD(VQHFHVDULR SRQHUHOELW2&)$HQSDUDYROYHUD
VRQGHDU3DUDTXHHVWHELWWRPHHOYDORUGHWHQHPRVTXHHVFULELUXQ
D1
R1
X1
VDD
N1
ND2
N1
N2
180
PB0 PB0 N2
D2
R2
X2
VDD
N3
ND2
N3
N4
180
PB1 PB1 N4
D3
R3
X3
VDD
N5
ND2
N5
N6
180
PB2 PB2 N6
OHGV
D4
R4
X4
VDD
N7
ND2
N7
N8
180
PB3 PB3 N8
DUFKLYR
D5
R5
X5
VDD
N9
ND2
N9
N10
180
PB4 PB4 N10
D6
R6
X6
VDD
N11
ND2
N11
N12
180
PB5 PB5 N12
D7
R7
X7
VDD
N13
ND2
N13
N14
180
PB6 PB6 N14
D8
R8
X8
VDD
N15
ND2
N15
N16
180
PB7 PB7 N16
HVWi
SRU
RFKR
FRQHFWDGRVDOSXHUWR%
$xDGLU
DO
7LPHUBVRQGHRSUMODVVLJXLHQWHVOtQHDV
'LDJUDPDGHIOXMR
Tmr1_sondeo
IN IC IO
Configurar puertos de
salida para leds
Configurar el
T em porizador
cuenta 0
S e cum pli el
tiem po ?
NO
SI
cuenta cuenta + 1
LE DS cuenta
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
********************************************************************
********************************************************************
*****
PONTIFICIA UNIVERSIDAD CATOLICA DEL PERU
*****
*****
Laboratorio de Sistemas Digitales
*****
*****
*****
***** Nombre:
timer1_sondeo.c
*****
***** Autor:
Rolando Snchez
*****
***** Fecha:
Octubre 2005
*****
*****
*****
***** Descripcin: Mostramos en ocho leds, conectados al
*****
*****
Puerto B, una cuenta que se incrementa cada
*****
*****
250ms.
*****
*****
Utilizamos para la temporizacin el Timer1
*****
*****
en modo CTC.
*****
*****
*****
********************************************************************
********************************************************************
#include <avr\io.h>
//
//
//
//
//
//
//
//
********************************************************************
*****
Funcin que Configura el TIMER1
*****
********************************************************************
***** Pin OC1A desconectado: COM1A1 COM1A0 <- 00
*****
***** Modo CTC (tope OCCR1A):
*****
*****
WGM13 WGM12 WGM12 WGM10 < - 0100
*****
***** Preescalamiento 1:1024:
CS12 CS11 CS10 <- 101
*****
********************************************************************
void configura_TMR1(void)
{
TCCR1A = (0<<COM1A1 | 0<<COM1A0 | 0<<WGM11 | 0<<WGM10);
TCCR1B = (0<<WGM13 | 1<<WGM12 | 1<<CS12 | 0<<CS11 | 1<<CS10);
OCR1AH = 0x00;
OCR1AL = 0xF3;
}
//
//
//
//
//
********************************************************************
********************************************************************
*****
PROGRAMA PRINCIPAL
*****
********************************************************************
********************************************************************
int main(void)
{
uint8_t cuenta;
DDRB = 0xFF;
PORTB = 0x00;
configura_TMR1();
// Configuramos el Timer1
cuenta = 0;
while (1)
{
while ((TIFR & 1<<OCF1A) == 0);
TIFR = 0b00010000;
cuenta = cuenta + 1;
PORTB = cuenta;
// Incrementamos "cuenta"
// y la mostramos en los leds.
}
}
,17(5583&,21(6
&XDQGR SURJUDPDPRVHQ&XWLOL]DPRVODPDFUR 6,*1$/VLJQDPHTXHVHHQFDUJDGH
LQVWDODU HO YHFWRU GH LQWHUUXSFLyQ \ HMHFXWDU XQD IXQFLyQ FXDQGR VH SURGXFH OD VROLFLWXG GH
LQWHUUXSFLyQ
(ODUJXPHQWRGH
VLJQDPHGHEHVHUXQRGHORVPRVWUDGRVHQODVLJXLHQWHWDEOD
)XHQWHGH,QWHUUXSFLyQ
$UJXPHQWRSDUD6,*1$/
VLJQDPH
,17
6,*B,17(55837
,17
6,*B,17(55837
7,0(5&203
6,*B287387B&203$5(
7,0(529)
6,*B29(5)/2:
7,0(5&$37
6,*B,1387B&$3785(
7,0(5&203$
6,*B287387B&203$5($
7,0(5&203%
6,*B287387B&203$5(%
7,0(529)
6,*B29(5)/2:
7,0(529)
6,*B29(5)/2:
63,67&
6,*B63,
86$575;&
6,*B8$57B5(&9
86$578'5(
6,*B8$57B'$7$
86$577;&
6,*B8$57B75$16
$'&
6,*B$'&
((B5'<
6,*B((3520B5($'<
$1$B&203
6,*B&203$5$725
7:,
6,*B:,5(B6(5,$/
630B5'<
6,*B630B5($'<
3DUD KDELOLWDU H LQKDELOLWDU ODV LQWHUUXSFLRQHV VH XWLOL]DQ ODV IXQFLRQHV VHL \ FOL
UHVSHFWLYDPHQWHTXHHMHFXWDQODVLQVWUXFFLRQHV6(, \&/,6(,KDFHTXHODEDQGHUD,GHO65(*
WRPHHOYDORUOyJLFRGH\FRQ&/,ODEDQGHUD,WRPDHOYDORUGH
9,
,17(5583&,21(6(;7(51$6
/DV IXHQWHV GH HVWDV LQWHUUXSFLRQHV FRPR VX QRPEUH OR LQGLFD VRQ H[WHUQDV DO
PLFURFRQWURODGRU ODV VHxDOHV TXH LQYROXFUDQ D HVWDV LQWHUUXSFLRQHV VH FRQHFWDQ ItVLFDPHQWH D
DOJ~Q SLQ GHO PLFURFRQWURODGRU (O $7PHJD SRVHH GRV IXHQWHV GH LQWHUUXSFLRQHV H[WHUQDV
,17H,17
1LYHOEDMRHQ,17\R,17
&DPELRGHQLYHOHQ,17\R,17
)ODQFRGHEDMDGDHQ,17\R,17
)ODQFRGHVXELGD,17\R,17
(OHYHQWRORFRQILJXUDPRVHQHOUHJLVWUR0&8&5
ISC11
0
0
1
1
ISC10
0
1
0
1
Descripcin
Nivel bajo en INT1 solicita interrupcin
Cambio de nivel en INT1 solicita interrupcin
Flanco de bajada en INT1 solicita interrupcin
Flanco de subida en INT1 solicita interrupcin
ISC01
0
0
1
1
ISC00
0
1
0
1
Descripcin
Nivel bajo en INT0 solicita interrupcin
Cambio de nivel en INT0 solicita interrupcin
Flanco de bajada en INT0 solicita interrupcin
Flanco de subida en INT0 solicita interrupcin
352%/(0$'(6$552//$'2,QWBH[W
(VWH HMHPSOR PXHVWUD XQD FXHQWD HQ OHGV TXH VH LQFUHPHQWD FDGD YH] TXH VH
SUHVLRQDXQSXOVDGRU/RVOHGVHVWiQFRQHFWDGRVDO3XHUWR%\HOSXOVDGRUHVWiFRQHFWDGRDOSLQ
,173'TXHUHPRVTXHODFXHQWDVHLQFUHPHQWHHQFDGDIODQFRGHVXELGDHQ,17
3DUD OD VLPXODFLyQ HQ 90/$% HQ HO DUFKLYR ,QWBH[WSUM HVFULELU ODV PLVPDV OtQHDV TXH
HQHOSUREOHPDDQWHULRUSDUDGHILQLUORVOHGV\DxDGLUORVLJXLHQWHSDUDGHILQLUHOSXOVDGRU
K0
R10
VDD
VSS
PD2
PD2
3.3K
Programa Principal
RSI Externa 0
INICIO
Configurar puertos de
salida para leds
INICIO
cuenta cuenta + 1
Configurar Interrupcin
externa
LEDS cuenta
cuenta 0
FIN
FIN
Int_ext0
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
********************************************************************
********************************************************************
*****
PONTIFICIA UNIVERSIDAD CATOLICA DEL PERU
*****
*****
Laboratorio de Sistemas Digitales
*****
*****
*****
***** Nombre:
int_ext0.c
*****
***** Autor:
Rolando Snchez
*****
***** Fecha:
Octubre 2005
*****
*****
*****
***** Descripcin: Mostramos en ocho leds, conectados al
*****
*****
Puerto B, una cuenta que se incrementa cada
*****
*****
vez que se presiona un pulsador conectado
*****
*****
a INT0 (PD2).
*****
*****
Utilizamos la interrupcin externa 0 (INT0)
*****
*****
para detectar flancos de subida en INT0.
*****
*****
*****
********************************************************************
********************************************************************
// *****
L I B R E R I A S
I N C L U I D A S
*****
G L O B A L E S
*****
#include <avr\io.h>
#include <avr\interrupt.h>
#include <avr\signal.h>
// *****
V A R I A B L E S
uint8_t cuenta;
//
//
//
//
//
//
//
//
********************************************************************
*****
Interrupcin INT0
*****
********************************************************************
*****
Configurada para que se ejecute en cada flanco
*****
*****
de subida.
*****
*****
Incrementamos el valor de "cuenta" y lo muestra *****
*****
en los leds.
*****
********************************************************************
SIGNAL(SIG_INTERRUPT0)
{
cuenta = cuenta + 1;
PORTB = cuenta;
}
//
//
//
//
//
//
********************************************************************
*****
Funcin que Configura INT0
*****
********************************************************************
*****
Flanco de subida en INT0: ISC01 ISC00 <- 11
*****
*****
Habilitamos la interrupcin INT0: INT0 <- 1
*****
********************************************************************
void configura_INT0(void)
{
MCUCR = MCUCR | 1<<ISC01 | 1<<ISC00 ;
GICR = GICR | 1<<INT0;
}
//
//
//
//
//
********************************************************************
********************************************************************
*****
PROGRAMA PRINCIPAL
*****
********************************************************************
********************************************************************
int main(void)
{
cli();
DDRB = 0xFF;
PORTB = 0x00;
cuenta = 0;
sei();
while (1);
352%/(0$'(6$552//$'27PUBLQW
9DPRVDGHVDUUROODUHOSUREOHPDXWLOL]DQGRLQWHUUXSFLRQHV
(QHOSUREOHPDVHVRQGHDHOELW2&)$SDUDGHWHUPLQDUVLHO7&17LJXDOyDO2&5$
DKRUD HVWR QR HV QHFHVDULR SRUTXH FDGD YH] TXH VH SURGX]FD OD FRPSDUDFLyQ H[LWRVD VH
SURGXFLUiXQDVROLFLWXGGHLQWHUUXSFLyQ
(VWD LQWHUUXSFLyQ VH GHQRPLQD 7,0(5 &203$ \ SDUD KDELOLWDUOD HV QHFHVDULR HVFULELU
XQHQHOELW2&,($GHOUHJLVWUR7,06.
Programa Principal
INICIO
RSI Timer 1
(cada 250ms)
Configurar puertos de
salida para leds
INICIO
Configurar Interrupcin
del temporizador
cuenta cuenta + 1
cuenta 0
FIN
LEDS cuenta
Tmr1_int
//
//
//
//
//
//
//
//
//
//
//
//
********************************************************************
********************************************************************
*****
PONTIFICIA UNIVERSIDAD CATOLICA DEL PERU
*****
*****
Laboratorio de Sistemas Digitales
*****
*****
*****
***** Nombre:
tmr1_int.c
*****
***** Autor:
Rolando Snchez
*****
***** Fecha:
Octubre 2005
*****
*****
*****
***** Descripcin: Mostramos en ocho leds, conectados al
*****
*****
Puerto B, una cuenta que se incrementa cada
*****
*****
250ms.
*****
*****
Utilizamos para la temporizacin el Timer1
*****
*****
en modo CTC. Trabajamos con la interrupcin
*****
*****
TIMER1 COMPA.
*****
*****
*****
********************************************************************
********************************************************************
// *****
L I B R E R I A S
I N C L U I D A S
*****
G L O B A L E S
*****
#include <avr\io.h>
#include <avr\interrupt.h>
#include <avr\signal.h>
// *****
V A R I A B L E S
uint8_t cuenta;
//
//
//
//
//
//
********************************************************************
*****
Interrupcin TIMER1 COMPA
*****
********************************************************************
*****
Configurada para que se ejecute cada 250ms.
*****
*****
Incrementamos el valor de "cuenta"
*****
********************************************************************
SIGNAL(SIG_OUTPUT_COMPARE1A)
{
cuenta = cuenta + 1;
}
//
//
//
//
//
//
//
//
//
********************************************************************
*****
Funcin que Configura el TIMER1
*****
********************************************************************
*****
Pin OC1A desconectado:
COM1A1 COM1A0 <- 00
*****
*****
Modo CTC (tope OCCR1A):
*****
*****
WGM13 WGM12 WGM12 WGM10 < - 0100
*****
*****
Preescalamiento 1:1024:
CS12 CS11 CS10 <- 101 *****
*****
Habilitamos interrupcin TIMER1 COMPA: OCIE1A <- 1 *****
********************************************************************
void configura_TMR1(void)
{
TCCR1A = (0<<COM1A1 | 0<<COM1A0 | 0<<WGM11 | 0<<WGM10);
TCCR1B = (0<<WGM13 | 1<<WGM12 | 1<<CS12 | 0<<CS11 | 1<<CS10);
OCR1AH = 0x00;
OCR1AL = 0xF3;
TIMSK = (TIMSK|1<<OCIE1A);
//
//
//
//
//
********************************************************************
********************************************************************
*****
PROGRAMA PRINCIPAL
*****
********************************************************************
********************************************************************
int main(void)
{
cli();
DDRB = 0xFF;
PORTB = 0x00;
cuenta = 0;
configura_TMR1();
// Configuramos el Timer1
sei();
while (1)
PORTB = cuenta;
P rograma P rincipal
IN IC IO
RS I Recepcin
Completa
C onfigurar puerto serial
(9600, 8, 0, 1)
INIC IO
C onfigurar Interrupcin
por dato recibido
C onfigurar Interrupcin
del tem porizador
dato_valido 0
dato_valido 0
dato_rx es caracter
num rico ?
NO
dato_valido = 1 ?
NO
SI
dato_valido 1
SI
dato_tx dato_rx
FIN
cnt_int 0
cnt_int < 4 ?
IN IC IO
SI
cnt_int cnt_int + 1
NO
dato_tx dato_tx - 1
F IN
dato_tx = 0 - 1
SI
NO
Tm r1 _ us a rt
10
(MHPSOR
6LVHUHFLEH
7UDQVPLWLU
5
5 4 3 2 1 0
HQLQWHUYDORVGHVHJXQGR
8WLOL]DU ODV LQWHUUXSFLRQHV 7,0(5 &203$ SDUD WHPSRUL]DU VHJXQGR \ 86$57 5;&
SDUDGHWHUPLQDUVLOOHJyXQGDWRSRUHOSXHUWRVHULDO
&XDQGR WUDEDMDPRV FRQ LQWHUUXSFLRQHV SRU GDWR UHFLELGR \D QR HV QHFHVDULR HVWDU
VRQGHDQGRHOELW5;&SDUDVDEHUVLOOHJyXQGDWRDKRUDFXDQGRHOELW5;&WRPHHOYDORUGHVH
SURGXFLUi OD VROLFLWXG GH LQWHUUXSFLyQ 3DUD KDELOLWDU OD LQWHUUXSFLyQ 86$57 5;& HV QHFHVDULR
SRQHUDHOELW5;&,(GHOUHJLVWUR8&65%
3DUDODVLPXODFLyQGHHVWHSUR\HFWRLQFOXLUHQHO7PUBXVDUWSUMORVLJXLHQWH
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
********************************************************************
********************************************************************
*****
PONTIFICIA UNIVERSIDAD CATOLICA DEL PERU
*****
*****
Laboratorio de Sistemas Digitales
*****
*****
*****
***** Nombre:
tmr1_usart.c
*****
***** Autor:
Rolando Snchez
*****
***** Fecha:
Octubre 2005
*****
*****
*****
***** Descripcin: El programa espera que le llegue un dato
*****
*****
por el puerto serial. Si este dato es el cdigo
*****
*****
ASCII de un caracter numrico ('0'...'9') lo
*****
*****
retransmite y empieza a transmitir los cdigos
*****
*****
que representan a los dgitos menores que el
*****
*****
recibido de manera decreciente hasta el '0', y
*****
*****
con un tiempo de un segundo entre ellos.
*****
*****
*****
********************************************************************
********************************************************************
// *****
L I B R E R I A S
I N C L U I D A S
*****
G L O B A L E S
*****
#include <avr\io.h>
#include <avr\interrupt.h>
#include <avr\signal.h>
// *****
V A R I A B L E S
//
//
//
//
//
//
********************************************************************
*****
Interrupcin TIMER1 COMPA
*****
********************************************************************
*****
Configurada para que se ejecute cada 250ms.
*****
*****
Incrementamos el valor de "cuenta"
*****
********************************************************************
11
********************************************************************
*****
Interrupcin USART RXC
*****
********************************************************************
*****
Se ejecuta cada vez que hay un dato recibido
*****
*****
por el puerto serial.
*****
*****
Recoge el dato recibido y verifica si est en el *****
*****
rango deseado ('0'...'9').
*****
********************************************************************
SIGNAL(SIG_UART_RECV)
{
dato_rx = UDR;
dato_valido = 0;
if ((dato_rx>='0')&&(dato_rx<='9'))
dato_valido = 1;
}
//
//
//
//
//
//
//
//
//
********************************************************************
*****
Funcin que Configura el TIMER1
*****
********************************************************************
*****
Pin OC1A desconectado:
COM1A1 COM1A0 <- 00
*****
*****
Modo CTC (tope OCCR1A):
*****
*****
WGM13 WGM12 WGM12 WGM10 < - 0100
*****
*****
Preescalamiento 1:1024:
CS12 CS11 CS10 <- 101 *****
*****
Habilitamos interrupcin TIMER1 COMPA: OCIE1A <- 1 *****
********************************************************************
void configura_TMR1(void)
{
TCCR1A = (0<<COM1A1 | 0<<COM1A0 | 0<<WGM11 | 0<<WGM10);
TCCR1B = (0<<WGM13 | 1<<WGM12 | 1<<CS12 | 0<<CS11 | 1<<CS10);
OCR1AH = 0x00;
OCR1AL = 0xF3;
TIMSK = (TIMSK|1<<OCIE1A);
//
//
//
//
//
//
//
//
//
********************************************************************
*****
Funcin que Configura el USART
*****
********************************************************************
*****
Velocidad 9600bps:
U2X <- 1, UBRR <- $000C
*****
*****
8 bits de datos:
UCSZ2 UCSZ1 UCSZ0 <- 011
*****
*****
Sin paridad:
UPM1 UPM0 <- 00
*****
*****
1 bit de parada:
USBS <- 0
*****
*****
Habilitamos la interrupcin USART RXC: RXCIE <- 1 *****
********************************************************************
void configura_USART(void)
{
UBRRH = 0x00;
UBRRL = 0x0C;
UCSRA = (1<<U2X | 0<<MPCM);
UCSRB = (1<<RXCIE | 1<<RXEN | 1<<TXEN | 0<<UCSZ2);
UCSRC = (1<<URSEL | 0<<UMSEL | 0<<UPM1 | 0<<UPM0 | 0<<USBS | 1<<UCSZ1 | 1<<UCSZ0);
}
//
//
//
//
//
********************************************************************
*****
Funcin envia_dato(dato)
*****
********************************************************************
***** Transmite por el puerto serial el parmetro de entrada *****
********************************************************************
12
//
//
//
//
//
********************************************************************
********************************************************************
*****
PROGRAMA PRINCIPAL
*****
********************************************************************
********************************************************************
int main(void)
{
uint8_t dato_tx;
cli();
configura_TMR1();
configura_USART();
// Comfiguramos el Timer 1
// Configuramos el USART
sei();
while (1)
// LAZO INFINITO
{
dato_valido = 0;
while (!dato_valido);
// Esperamos que "dato_valido" sea 1
dato_tx = dato_rx;
do
{
dato_tx = dato_tx-1;
} while (dato_tx != '0'-1);
}
}
Elaborado por:
Rolando Snchez Ponce
Email: rsanchez@pucp.edu.pe
Octubre 2005
13