Vi điều khiển là 1 lĩnh vực khá lý thú đối với chuyên ngành Điện tử-Viễn thông.
Cùng với sự phát triển của ngành điện tử thì nhiều họ vi điều khiển lần lượt được các
hãng sản xuất chip cho ra đời như: Z80 của Zilog, AT89 của Atmel, PIC của Microchip,
AVR của Atmel...
Họ vi điều khiểnAVR của Atmel Corp là 1 bước phát triển trên nền của Vi điều
khiển AT89 đã khá quen thuộc. Nếu như AT89 là vi điều khiển có CPU CISC thì AVR
là RISC, với kiến trúc Harvard do vậy tốc độ sẽ nhanh hơn (tốc độ tối đa là 16 triệu
lệnh/giây). Ngoài ra AVR cũng tích hợp sẵn ngay trong chip mạch ADC, PWM,....cũng
như hỗ trợ các chuẩn giao tiếp thông dụng như UART/USART, I2C, 2-wires,... nên việc
thiết kế và thực hiện phần cứng cho những ứng dụng rất thuận tiện, nhanh chóng, nhỏ
gọn.
Về ngôn ngữ lập trình cho AVR thì có rất nhiều: assembly, C, Basic, Pascal... Trong
đó những phần mềm miễn phí do chính Atmel cung cấp, hay những hãng khác là rất
nhiều: avrasm, winasm (hợp ngữ), CodeVisionAVR, Win-GCC(ngôn ngữ C),
BASCOM (ngôn ngữ Basic).v.v.
Hơn thế việc mô phỏng, debug cũng được hỗ trợ các từ A-Z, nhiều phần mềm
simulator, emulator như: AVRStudio (miễn phí của Atmel), Proteus, ...
Trong phạm vi cuốn báo cáo này chỉ nghiên cứu về vi điều khiển ATmega16, phần
mềm mô phỏng mạch điện Proteus 7.0 và sử dụng Proteus để thiết kế máy phát trải phổ.
Trong quá trình viết báo cáo, người viết có tham khảo datasheet của ATmega16 từ
trang web của hãng Atmel (www.atmel.com) và một số tài liệu khác.
Mục lục
ATmega16 là vi điều khiển 8 bit dựa trên kiến trúc RISC. Với khả năng thực hiện
mỗi lệnh trong vòng một chu kỳ xung clock, ATmega16 có thể đạt được tốc độ 1MIPS
trên mỗi MHz (1 triệu lệnh/s/MHz).
CPU của AVR có chức năng bảo đảm sự hoạt động chính xác của các chương trình.
Do đó nó phải có khả năng truy cập bộ nhớ, thực hiện các quá trình tính toán, điều
khiển các thiết bị ngoại vi và quản lý ngắt.
AVR sử dụng cấu trúc Harvard, tách riêng bộ nhớ và các bus cho chương trình và dữ
liệu. Các lệnh được thực hiện chỉ trong một chu kỳ xung clock. Bộ nhớ chương trình
được lưu trong bộ nhớ Flash.
2.2. ALU
ALU làm việc trực tiếp với các thanh ghi chức năng chung. Các phép toán được
thực hiện trong một chu kỳ xung clock. Hoạt động của ALU được chia làm 3 loại: đại
số, logic và theo bit.
C: Carry Flag ;cờ nhớ (Nếu phép toán có nhớ cờ sẽ được thiết lập)
Z: Zero Flag ;Cờ zero (Nếu kết quả phép toán bằng 0)
N: Negative Flag (Nếu kết quả của phép toán là âm)
V: Two’s complement overflow indicator (Cờ này được thiết lập khi tràn số bù 2)
V, For signed tests (S=N XOR V) S: N
H: Half Carry Flag (Được sử dụng trong một số toán hạng sẽ được chỉ rõ sau)
T: Transfer bit used by BLD and BST instructions(Được sử dụng làm nơi chung
gian trong các lệnh BLD,BST).
I: Global Interrupt Enable/Disable Flag (Đây là bit cho phép toàn cục ngắt. Nếu bit
này ở trạng thái logic 0 thì không có một ngắt nào được phục vụ.)
Khi chương trình phục vu ngắt hoặc chương trình con thì con trỏ PC được lưu vào
ngăn xếp trong khi con trỏ ngăn xếp giảm hai vị trí. Và con trỏ ngăn xếp sẽ giảm 1 khi
thực hiện lệnh push. Ngược lại khi thực hiện lệnh POP thì con trỏ ngăn xếp sẽ tăng 1 và
khi thực hiện lệnh RET hoặc RETI thì con trỏ ngăn xếp sẽ tăng 2. Như vậy con trỏ ngăn
xếp cần được chương trình đặt trước giá trị khởi tạo ngăn xếp trước khi một chương
trình con được gọi hoặc các ngắt được cho phép phục vụ. Và giá trị ngăn xếp ít nhất
cũng phải lơn hơn hoặc bằng 60H (0x60) vì 5FH trỏ lại là vùng các thanh ghi.
Ví dụ:
char cSREG;
EECR |= (1<<EEWE);
AVR có 2 không gian bộ nhớ chính là bộ nhớ dữ liệu vào bộ nhớ chương trình.
Ngoài ra ATmega16 còn có thêm bộ nhớ EEPROM để lưu trữ dữ liệu.
Vi điều khiểnATmega16có 32 đường vào ra chia làm bốn nhóm 8 bit một. Các
đường vào ra này có rất nhiều tính năng và có thể lập trình được. Ở đây ta sẽ xét chúng
là các cổng vào ra số. Nếu xét trên mặt này thì các cổng vào ra này là cổng vào ra hai
chiều có thể định hướng theo từng bit. Và chứa cả điện trở pull-up (có thể lập trình
được). Mặc dù mỗi port có các đặc điểm riêng nhưng khi xét chúng là các cổng vào ra
số thì dường như điều khiển vào ra dữ liệu thì hoàn toàn như nhau. Chúng ta có thanh
ghi và một địa chỉ cổng đối với mỗi cổng, đó là : thanh ghi dữ liệu cổng (PORTA,
PORTB, PORTC, PORTD), thanh ghi dữ liệu điều khiển cổng (DDRA, DDRB, DDRC,
DDRD) và cuối cùng là địa chỉ chân vào của cổng (PINA, PINB, PINC, PIND).
Tóm lại:
1. Để đọc dữ liệu từ ngoài thì ta phải thực hiện các bước sau:
Đưa dữ liệu ra thanh ghi điều khiển DDRxn để đặt cho PORTx (hoặc bit n trong
port) đó là đầu vào (xóa thanh ghi DDRx hoặc bit).
Sau đó kích hoạt điện trở pull-up bằng cách set thanh ghi PORTx ( bit).
Cuối cùng đọc dữ liệu từ địa chỉ PINxn (trong đó x: là cổng và n là bit).
2. Để đưa dữ liệu từ vi điều khiển ra các cổng cũng có các bước hoàn toàn tương tự.
Ban đầu ta cũng phải định nghĩa đó là cổng ra bằng cách set bit tương ứng của cổng
đó….và sau đó là ghi dữ liệu ra bit tương ứng của thanh ghi PORTx.
Ví dụ:
unsigned char i;
...
/* Define pull-ups and set outputs high */
/* Define directions for port pins */
PORTB = (1<<PB7)|(1<<PB6)|(1<<PB1)|(1<<PB0);
DDRB = (1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0);
/* Insert nop for synchronization*/
_NOP();
/* Read port pins */
i = PINB;
Bộ định thời (timer/counter0) là một module định thời/đếm 8 bit, có các đặc điểm
sau:
Bộ đếm một kênh
Xóa bộ định thời khi trong mode so sánh (tự động nạp)
PWM
Tạo tần số
Bộ đếm sự kiện ngoài
Bộ chia tần 10 bit
Nguồn ngắt tràn bộ đếm và so sánh
Sơ đồ cấu trúc của bộ định thời:
Phần chính của bộ định thời 8 bit là một đơn vị đếm song hướng có thể lập trình
được. Cấu trúc của nó như hình dưới đây:
Bộ so sánh 8 bit liên tục so sánh giá trị TCNT0 với giá trị trong thanh ghi so sánh
ngõ ra (OCR0). Khi giá trị TCNT0 bằng với OCR0, bộ so sánh sẽ tạo một báo hiệu.
Báo hiệu này sẽ đặt giá trị cờ so sánh ngõ ra (OCF0) lên 1 vào chu kỳ xung clock tiếp
theo. Nếu được kích hoạt (OCIE0=1), cờ OCF0 sẽ tạo ra một ngắt so sánh ngõ ra và sẽ
tự động được xóa khi ngắt được thực thi. Cờ OCF0 cũng có thể được xóa bằng phần
mềm.
Thanh ghi này chứa một giá trị 8 bit và liên tục được so sánh với giá trị của bộ đếm.
Chương 6. USART
Bộ truyền nhận nối tiếp đồng bộ và bất đồng bộ là một thiết truyền thông nối tiếp có
các chức năng chính như sau:
Hoạt động song công (các thanh ghi truyền và nhận nối tiếp độc lập với nhau).
Hoạt động đồng bộ hoặc bất đồng bộ
Bộ tạo tốc độ baud có độ chính xác cao
Hỗ trợ khung truyền nối tiếp với 5, 6, 7, 8, hoặc 9 bit dữ liệu và 1 hoặc 2 bit stop
Kiểm tra chẵn lẻ
Phát hiện tràn dữ liệu
Phát hiện lỗi khung
Lọc nhiễu, bao gồm phát hiện bit start lỗi và bộ lọc thông thấp số
Ngắt khi kết thúc truyền, thanh ghi truyền hết dữ liệu và kết thúc nhận
Chế độ truyền thông đa vi xử lý
Chế độ truyền đồng bộ tốc độ cao
Sơ đồ khối của bộ USART như sau:
USART bao gồm 3 phần chính: bộ tạo xung clock, bộ truyền và bộ nhận. Các thanh
ghi điều khiển được sử dụng chung giữa các phần này.
P: bit chẵn lẻ
Sp: bit stop (mức cao)
IDLE: không có dữ liệu truyền (mức cao trong suốt thời gian idle)
Ví dụ:
{
unsigned char status, resh, resl;
/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) )
;
/* Get status and 9th bit, then data */
/* from buffer */
status = UCSRA;
resh = UCSRB;
resl = UDR;
/* If error, return -1 */
if ( status & (1<<FE)|(1<<DOR)|(1<<PE) )
return -1;
/* Filter the 9th bit, then return */
resh = (resh >> 1) & 0x01;
return ((resh << 8) | resl);
}
Vi điều khiểnATmega16 có một bộ biến đổi ADC tích hợp trong chip với các đặc
điểm:
Độ phân giải 10 bit
Sai số tuyến tính: 0.5LSB
Độ chính xác +/-2LSB
Thời gian chuyển đổi:65-260μs
8 Kênh đầu vào có thể được lựa chọn
Có hai chế độ chuyển đổi free running và single conversion
Có nguồn báo ngắt khi hoàn thành chuyển đổi
Loại bỏ nhiễu trong chế độ ngủ
Tám đầu vào của ADC là tám chân của PORTA và chúng được chọn thông qua một
MUX.
Để điều khiển hoạt động vào ra dữ liệu của ADC và CPU chúng ta có 3 thanh ghi:
ADMUX là thanh ghi điều khiển lựa chọn kênh đầu vào cho ADC, ADCSRA là thanh
ghi điều khiển và thanh ghi trạng thái của ADC, ADCH và ADCL là 2 thanh ghi dữ
liệu.
Với 4 bit được định nghĩa là MUX3, MUX2, MUX1,và MUX0, ứng với các tổ hợp
logic ta có thể chọn kênh đầu vào. Cụ thể:
Các bit REFS1 và REFS0 dùng để chọn giá trị điện áp tham khảo cho ADC, như
sau:
Chú ý: Nếu như ta thay đổi kênh trong thời điểm mà ADC đang chuyển đổi thì khi quá
trình chuyển đổi đã hoàn thành thì kênh vào mới được thay đổi.
7.2. ADCSR-ADC control and status register
Đây là thanh ghi điều khiển và lưu trạng thái của ADC.
Bước 2: Chọn kênh tương tự vào (chọn chân vào cho ADC) thông qua thanh ghi
ADMUX (có thể thay đổi trong quá trình hoạt động).
Bước 3: Thiết lập các thông số cho ADC
Tốc độ chuyển đổi thông qua xung nhip chuyển đổi.
Chế độ chuyển đổi : đơn hoặc tự động.
Sử dụng ngắt hoặc không.
Bước 4: Bắt đầu chuyển đổi và đọc dữ liệu.
Ví dụ: (biến đổi ADC, ngõ vào analog PA2, hiển thị dữ liệu trên led ở PORTB)
#include <avr/io.h>
#include<avr/interrupt.h>
//ADC interrupt function
ISR(ADC_vect)
{PORTB=ADCH;
}
int main(void)
{
outp(0xFF, DDRB); //PORTB is output
outp(0xFF, PORTB); //all PIN’s high (LED’s off)
outp(0x22, ADMUX); //PINA2 as analog input (MUX0..2)
//left adjusted (ADLAR=1)
//AREF as reference voltage (connected to VCC 5V) (REFS0..1)
outp(0xA5, ADCSR); //ADC enable, ADC auto trigger, ADC prescaler= 32
outp((inp(SFIOR)&0x1F),SFIOR); //Trigger source = Free Running Mode
sbi(ADCSR,6);
for(;;)
{
}
return 1;
}
2. Các ưu điểm
- Dễ dàng tạo ra một sơ đồ nguyên lý đơn giản từ các mạch điện đơn giản đến các
mạch có bộ lập trình vi xử lý .
- Dễ dàng chỉnh sửa các đặc tính của linh kiện trên sơ đồ nguyên lý : chỉnh sửa số
bước của động cơ bước, chỉnh sửa nguồn nuôi cho mạch ,thay đổi tần số hoạt động
cơ bản của vi xử lý…
- Công cụ hỗ trợ kiểm tra lổi thiết kế trên sơ đồ nguyên lý . Xem và lưu lại phần báo lỗi
.
- Chạy mô phỏng và phân tích các tính chất của mạch điện cơ bản. Công cụ hỗ trợ
cho việc chạy và mô phỏng rất mạnh và chính xác. Các công cụ và đồ thị hỗ trợ
mạnh cho việc phân tích tần số, sóng, âm thanh .. không nhưng thế phần mềm còn
có thêm các máy phân tích từ đơn giản như : đồng hồ đo Vôn, Ampe, đến các máy
đo dao động ,máy tạo sóng dao động …
- Ngoài ra Proteus còn cung cấp cho người sử dụng các công cụ mạnh mà các phần
mềm khác hầu như không có. Chẳng hạn thư viện LED với các loại màu sắc khác nhau
kể cả led 7 đoạn. Nhưng phần hiển thị mạnh nhất mà Proteus cung cấp là LCD, nó có
thể mô phỏng cho rất nhiều LCD từ đơn giản đến phức tạp.
- Một cái ưu điểm nữa của Proteus là có thể mô phỏng công cụ phát và thu tín hiệu
từ các mạch giao tiếp với máy tính qua công cụ RS232. Trong đó người sử dung có thể
điếu khiển được quá trình truyền phát, tốc độ Baud … giúp cho người lập trình có thể
mô phỏng các mặt truyền phát tín hiệu .
- Một điểm mạnh khác của Proteus là cung cấp cho người sử dụng công cụ biên dịch
cho các họ vi xử lý như MSC51, AVR, HC11 … qua đó tạo ra các tập tin HEX dùng để
nạp cho vi xử lý và tập tin DSI dùng để xem và chạy kiểm tra từng bước trong chương
trình mô phỏng.
- Đối với các mạch vi xử lý Proteus không những cung cấp hình ảnh thực tế của các
linh kiện xuất mà còn cung cấp cho người lập trình rất nhiều các cửa sổ thông báo các
nội dung của bộ nhớ, con trỏ, thanh ghi, …
- Proteus có một thư viện khá lớn với hơn 6000 linh kiện các loại và càng ngày càng
được bổ sung. Ngoài ra còn có keypad (ma trận phím tạo đơn giản cho người thiết kế
khi cần thao tác trên các ma trận phím ).
Ta sẽ bắt đầu bằng việc phân tích các ví dụ. Xét mạch như hình dưới đây:
Rb
+5V
PN
U1
9 22
RESET PC0/SCL Rb
23
RV1 13
PC1/SDA
24
PN
XTAL1 PC2/TCK
12 25
XTAL2 PC3/TMS
26
PC4/TDO
40 27
PA0/ADC0 PC5/TDI
39 28
PA1/ADC1 PC6/TOSC1
38 29
PA2/ADC2 PC7/TOSC2
37
PA3/ADC3
10k 36 14
PA4/ADC4 PD0/RXD
35 15
PA5/ADC5 PD1/TXD
34 16
PA6/ADC6 PD2/INT0
33 17
PA7/ADC7 PD3/INT1 +5V
18
PD4/OC1B
1 19
PB0/XCK/T0 PD5/OC1A
2 20
PB1/T1 PD6/ICP
3
PB2/INT2/AIN0 PD7/OC2
21 R16
4 100
PB3/OC0/AIN1
5
PB4/SS
6
PB5/MOSI
7 30
PB6/MISO AVCC
8 32
PB7/SCK AREF
ATMEGA16
C22
100nF
Đây là mạch sử dụng vi điều khiển ATmega16. Ta có thể phân tích dạng sóng ngõ ra
bằng hai cách: sử dụng Oscillocope hoặc dùng đồ thị (Graph).
Nếu dùng Oscillocope thì ta thêm vào mạch như hình dưới đây:
Rb
+5V
PN
U1
9 22
RESET PC0/SCL Rb
23
RV1 13
PC1/SDA
24
PN
XTAL1 PC2/TCK
12 25
XTAL2 PC3/TMS
26
PC4/TDO
40 27
PA0/ADC0 PC5/TDI A
39 28
PA1/ADC1 PC6/TOSC1
38 29
PA2/ADC2 PC7/TOSC2 B
37
PA3/ADC3
10k 36 14
PA4/ADC4 PD0/RXD C
35 15
PA5/ADC5 PD1/TXD
34 16
PA6/ADC6 PD2/INT0 D
33 17
PA7/ADC7 PD3/INT1 +5V
18
PD4/OC1B
1 19
PB0/XCK/T0 PD5/OC1A
2 20
PB1/T1 PD6/ICP
3
PB2/INT2/AIN0 PD7/OC2
21 R16
4 100
PB3/OC0/AIN1
5
PB4/SS
6
PB5/MOSI
7 30
PB6/MISO AVCC
8 32
PB7/SCK AREF
ATMEGA16
C22
100nF
Nếu sử dụng đồ thị, chọn Graph mode, chọn Digital và vẽ một đồ thị như sau:
Rb
+5V
PN
U1
9 22
RESET PC0/SCL Rb
23
RV1 13
PC1/SDA
24
PN
XTAL1 PC2/TCK
12 25
XTAL2 PC3/TMS
26
PC4/TDO
40 27
PA0/ADC0 PC5/TDI A
39 28
PA1/ADC1 PC6/TOSC1
38 29
PA2/ADC2 PC7/TOSC2 B
37
PA3/ADC3
10k 36 14
PA4/ADC4 PD0/RXD C
35 15
PA5/ADC5 PD1/TXD
34 16
PA6/ADC6 PD2/INT0 D
33 17
PA7/ADC7 PD3/INT1 +5V
18
PD4/OC1B
1 19
PB0/XCK/T0 PD5/OC1A
2 20
PB1/T1 PD6/ICP
3
PB2/INT2/AIN0 PD7/OC2
21 R16
4 100
PB3/OC0/AIN1
5
PB4/SS
6
PB5/MOSI
7 30
PB6/MISO AVCC
8 32
PB7/SCK AREF
ATMEGA16
C22
100nF
Kéo hai ký hiệu Rb và PN vào đồ thị và nhấn phím Space bar ta có kết quả như sau:
Ta cần thiết kế sơ đồ nguyên lý máy phát trải phổ với các chức năng biến đổi A/D,
tạo dữ liệu, tạo mã trải phổ và nhân tín hiệu để tạo tín hiệu trải phổ. Để làm được điều
đó ta cần một mạch biến đổi A/D, bộ nhân và bộ tạo mã trải phổ. Với mục đích làm đơn
giản mạch thiết kế ta sử dụng vi điều khiển ATmega16 để thực hiện chức năng biến đổi
A/D, tạo mã trải phổ và tạo dữ liệu ra. Sơ đồ khối của máy phát trải phổ như hình dưới
đây:
Tạo chuỗi PN
Dữ liệu ra
R10
Out
10k +5V
4
3
Voice_in C26 R9 1
2
1k
1uF
R14
11
LM324
10k C24
4.7nF
Data_out PN_out
U2:A U3:A
22 Data_out 1 U3:A(Y)
PC0/SCL
23 3 1 2
PC1/SDA
24 2
PC2/TCK
25 PN_out
PC3/TMS 7404
26 4070
PC4/TDO
27
PC5/TDI
28
PC6/TOSC1
29
PC7/TOSC2
Tín hiệu sau khi qua mạch nhân có dạng như sau:
14
PD0/RXD
15
PD1/TXD
16
PD2/INT0
17
PD3/INT1
18
PD4/OC1B
19
PD5/OC1A
20
PD6/ICP
21
0 PD7/OC2
Start
Setup port
No
No
Processing
data
ADC
Initalize
ADC
Start ADC
Return
Processing
data
Send data
out
Send PN senquence
out
Return
#include<avr/io.h>
#include<avr/interrupt.h>
#include<util/delay.h>
//asm
inline void PN_out(int PN_sequence) //send PN sequence to PC1
{
for(int j=0;j<=6; j++)
{asm volatile( "lsr %1 " "\n\t" //logical shift right PN_sequence variable
"brcs 1f" "\n\t" //branch 1 if carry flag is set
"cbi %2, %3" "\n\t" //or else clear PC1
"rjmp 2f" "\n\t" //then jump to 2
"1:" "\n\t"
"sbi %2, %3" "\n\t" //set PC1
"2:" "\n\t"
:"=r" (PN_sequence) //output
:"0"(PN_sequence), "I" (_SFR_IO_ADDR(PORTC)), "I"
(0x01) //input
);
_delay_loop_2(7);
}
}
//sending AD result to PC0, transmision frame: 8 bits data, 1 start bit, 1 stop bit
//generate PN sequence out to PC1
//asm
inline void data_processing(uint8_t data_in)
{
out_to_PC0(0,0x35);
for(int i=0;i<=7; i++)
{if(bit_is_set(data_in,i)) out_to_PC0(1,0x35);
else out_to_PC0(0,0x35);
}
out_to_PC0(1,0x35);
void ADC_init(void)
{
ADMUX=0x40; //AD0 input, left adjusted, 5V ref
ADCSRA|=(1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
//ADC enable, interupt enabled, prescaler 128
}
void ports_init(void)
{DDRA=0x00; //input, ADC0
PORTA=0x0E;
DDRB=0x00; //input, for digital data
PORTB=0xFF;
DDRC=0xFF; //output, PN and data
PORTC=0xFF;
}
int main(void)
{
ports_init();
ADC_init();
sei(); //enable global interrupt
ADCSRA|=(1<<ADSC); //start conversion
while(1)
{out_to_PC0(1,0x35);
}
return 0;
}
Các kết quả mô phỏng khi nạp chương trình vào vi điều khiển đã được nêu ở trên. Tuy
nhiên chương trình này chỉ là chương trình demo, sẽ cần nhiều thay đổi nhằm mục đích
tối ưu hoạt động của mạch.
Cuối cùng ta có sơ đồ nguyên lý của máy phát trải phổ như sau:
C1 Data_out PN_out
+5V
22pF
X1
CRYSTAL
C2 U1 U2:A U3:A
+5V
9 22 Data_out 1 U3:A(Y)
RESET PC0/SCL
23 3 1 2
PC1/SDA
22pF 13 24 2
XTAL1 PC2/TCK
12 25 PN_out
XTAL2 PC3/TMS 7404
26 4070
START_ADC PC4/TDO
R15 40
PA0/ADC0 PC5/TDI
27
1k 39 28
PA1/ADC1 PC6/TOSC1
38 29
PA2/ADC2 PC7/TOSC2
37
D_IN 36
PA3/ADC3
14
+5V
PA4/ADC4 PD0/RXD ToRX
35 15
PA5/ADC5 PD1/TXD ToTX
34 16
SW_CODE 33
PA6/ADC6 PD2/INT0
17
PA7/ADC7 PD3/INT1 +5V
18
PD4/OC1B
SW -SPST D0 1 19
PB0/XCK/T0 PD5/OC1A
D1 2 20
PB1/T1 PD6/ICP
R10 D2 3
PB2/INT2/AIN0 PD7/OC2
21 R16
D3 4
PB3/OC0/AIN1 100 R1R2R3R4R5R6R7R8
Out D4 5
10k +5V PB4/SS 10k10k10k10k10k10k10k10k
D5 6
D6 PB5/MOSI
7 30
PB6/MISO AVCC
D7 8 32
PB7/SCK AREF
ATMEGA16
C22
R12 R13 R11 D[0..7] 100nF
D0
1k 10k U4:A 12k
D1
D2
4
D3
3 D4
Voice_in C26 R9 1 D5
2 D6
D7
1k
1uF D[0..7]
R14
11
LM324
10k C24
1
2
3
4
5
6
7
8
4.7nF
DSW1
ON
DIPSW_8
OFF
16
15
14
13
12
11
10
9
Mạch này tuy đã mô phỏng tốt nhưng vẫn còn đang trong thời gian thử nghiệm. Và
phần mềm điều khiển vẫn còn phải tối ưu bằng cách nhúng ngôn ngữ assembly vào để
thực hiện những tác vụ cần sự chính xác về thời gian. Mà điều này thực sự quan trọng,
quyết định ổn định và chính xác của mạch.