Используются технологии uCoz

Часть 2
Home Up Часть 2 Фото и Видео

Микроконтроллеры фирмы ATMEL - ATMegaXX

схемы, программы, исходники

Программирование микроконтроллеров:

Открываем FastAVR4 и начинаем программировать AT90S2313, для чего загоняем в FastAVR4 следующий текст:

'/////////////////////////////////////////////////////////
'/// FastAVR Basic Compiler for AVR by MICRODESIGN ///
'/// RC5 test program ///
'/// RC5.bas www.FastAVR.com ///
'/////////////////////////////////////////////////////////
' Command displays on LEDs on PORTB
' LEDs are btw PORTB and Vcc via 1k resistors
$Device= 2313            ' used device
$Stack = 32                 ' stack depth
$Clock = 4                 ' used cristal
$RC5=PORTD.3

Declare Interrupt Int1()

Dim i As Byte, an As Byte
Dim a As Byte, b As Byte, c As Byte, d As Byte, e As Byte, f As Byte
Dim g As Byte, h As Byte, ha As Byte, hb As Byte, hd As Byte, hc As Byte, he As Byte
Dim SysAdr As Byte, Command As Byte
Dim n As Byte
'Open Com=PORTD.0, 19200 For Input As #1
Open Com=PORTD.1, 19200 For Output As #1
PORTB=&hff     ' Leds OFF
DDRB =&hff                 ' PORTB is output
Print #1, "Waiting for RC5..."
an=10
a=0
b=0
c=0
d=0
e=0
f=0
g=0
h=0
ha=0
hb=0
hc=0
hd=0
he=0
Enable Int1
Enable Ovf0
Enable Timer0            ' needs by RC5
Enable Interrupts





Do



Loop

'///////////////////////////////////////////////////

Interrupt Int1(), Save 2
Disable Int1            ' because of consecutive toggles
Enable Interrupts        ' because of Ovf0
RC5(SysAdr, Command)            ' do RC5 receiving
Select Case SysAdr
Case 20 'left forv
If a=0 Then
Print #1, "e" '"left forv"
End If
a=1
b=0
c=0
d=0
e=0
f=0
g=0
h=0
ha=0
hb=0
hc=0
hd=0
he=0
Case 53 'left back
If b=0 Then
Print #1, "r" '"left back"
End If
a=0
b=1
c=0
d=0
e=0
f=0
g=0
h=0
ha=0
hb=0
hc=0
hd=0
he=0
Case 43 'full forv
If c=0 Then
Print #1, "o" '"full forv"
End If
a=0
b=0
c=1
d=0
e=0
f=0
g=0
h=0
ha=0
hb=0
hc=0
hd=0
he=0
Case 11 'right forv
If d=0 Then
Print #1, "w" '"right forv"
End If
a=0
b=0
c=0
d=1
e=0
f=0
g=0
h=0
ha=0
hb=0
hc=0
hd=0
he=0
Case 58 'full back
If e=0 Then
Print #1, "p" '"full back"
End If
a=0
b=0
c=0
d=0
e=1
f=0
g=0
h=0
ha=0
hb=0
hc=0
hd=0
he=0
Case 3 'right forv
If d=0 Then
Print #1, "w" '"right forv"
End If
a=0
b=0
c=0
d=1
e=0
f=0
g=0
h=0
ha=0
hb=0
hc=0
hd=0
he=0
Case 37 'right back
If f=0 Then
Print #1, "q" '"right back"
End If
a=0
b=0
c=0
d=0
e=0
f=1
g=0
h=0
ha=0
hb=0
hc=0
hd=0
he=0
Case 27 'sound
If g=0 Then
Print #1, "0" '"sound"
End If
a=0
b=0
c=0
d=0
e=0
f=0
g=1
h=0
ha=0
hb=0
hc=0
hd=0
he=0
Case 45 'stop
If h=0 Then
Print #1, "0" ' "stop"
End If
a=0
b=0
c=0
d=0
e=0
f=0
g=0
h=1
ha=0
hb=0
hc=0
hd=0
he=0
Case 5 'speed max
If ha=0 Then
Print #1, "1" '"speed max"
End If
a=0
b=0
c=0
d=0
e=0
f=0
g=0
h=0
ha=1
hb=0
hc=0
hd=0
he=0
Case 13 'speed max
If ha=0 Then
Print #1, "1" '"speed max"
End If
a=0
b=0
c=0
d=0
e=0
f=0
g=0
h=0
ha=1
hb=0
hc=0
hd=0
he=0
Case 33 'speed norm
If hb=0 Then
Print #1, "2" '"speed norm"
End If
a=0
b=0
c=0
d=0
e=0
f=0
g=0
h=0
ha=0
hb=1
hc=0
hd=0
he=0
Case 54 'speed norm
If hb=0 Then
Print #1, "2" '"speed norm"
End If
a=0
b=0
c=0
d=0
e=0
f=0
g=0
h=0
ha=0
hb=1
hc=0
hd=0
he=0
Case Else
an=10
End Select
Reset Int1                 ' reset Int0 flag
Enable Int1                 ' enable again fo next receive
End Interrupt

В программе ничего сложного нет. Interrupt - это прерывание по порту B.3 (та ножка, куда подключен IR Detector). Экспирементально установлено, что программа работает ТОЛЬКО на AT90S2313 (возможно еще на ATTiny2313). Другие контроллеры роддерживать RC5 не хотят. После компиляции получится .hex - файл. Особо ленивым можно скачать поссылке:

image004.gif (498 bytes)

После пишем прогу для ATMega8:

'/////////////////////////////////////////////////////////
'/// FastAVR Basic Compiler for AVR by MICRODESIGN ///
'/// Name of Your project
'/////////////////////////////////////////////////////////
$Device= m8                     ' used device
$Stack = 32                 ' stack depth
$Clock = 4.0000            ' adjust for used crystal
$Def RTX=PORTD.0
$Baud=19200
$Sound = PORTC.0


Declare Interrupt Urxc()
Declare Interrupt Int0()

Dim TXbuff(12) As Byte, TXlen As Byte, TXn As Byte, Char As Byte, x As Byte
Dim i As Byte
Dim TT As Byte
Dim t As Byte
Dim t1 As Byte
Dim Adr As Byte, Comm As Byte
Dim n As Byte



DDRD = &hFB ' PORTC to be output
PORTD = &h00
DDRB = &hFF ' PORTC to be output
PORTB = &h00
Open Com=PORTD.0, 19200 For Input As #1
Open Com=PORTD.1, 19200 For Output As #1
Print "System Ready"
Print "R-reverce E-normal"
Print "Q-PORTD.2&3=norma W-PORTD.2&3=0"
t1=40
i=8
t=8
InputBin #1,TT
t=TT
Print t

Int0 Falling
Enable Urxc
Enable Interrupts


Do                         ' place your code in next line


Select Case i
Case 0 'motor A forw
PORTB.2=1
PORTD.3=1
PORTD.4=0
PORTD.5=0
WaitMs t1
PORTB.2=0
PORTD.3=1
PORTD.4=1
PORTD.5=0
WaitMs t1
PORTB.2=0
PORTD.3=0
PORTD.4=1
PORTD.5=1
WaitMs t1
PORTB.2=1
PORTD.3=0
PORTD.4=0
PORTD.5=1
WaitMs t1

Case 1 'motor A back
PORTB.2=1
PORTD.3=1
PORTD.4=0
PORTD.5=0
WaitMs t1
PORTB.2=1
PORTD.3=0
PORTD.4=0
PORTD.5=1
WaitMs t1
PORTB.2=0
PORTD.3=0
PORTD.4=1
PORTD.5=1
WaitMs t1
PORTB.2=0
PORTD.3=1
PORTD.4=1
PORTD.5=0
WaitMs t1

Case 2 'motor B back
PORTD.6=1
PORTD.7=1
PORTB.0=0
PORTB.1=0
WaitMs t
PORTD.6=0
PORTD.7=1
PORTB.0=1
PORTB.1=0
WaitMs t
PORTD.6=0
PORTD.7=0
PORTB.0=1
PORTB.1=1
WaitMs t
PORTD.6=1
PORTD.7=0
PORTB.0=0
PORTB.1=1
WaitMs t

Case 3 ' motor B forw
PORTD.6=1
PORTD.7=1
PORTB.0=0
PORTB.1=0
WaitMs t
PORTD.6=1
PORTD.7=0
PORTB.0=0
PORTB.1=1
WaitMs t
PORTD.6=0
PORTD.7=0
PORTB.0=1
PORTB.1=1
WaitMs t
PORTD.6=0
PORTD.7=1
PORTB.0=1
PORTB.1=0
WaitMs t

Case 4 '2 motor forv
PORTD.6=1
PORTD.7=1
PORTB.0=0
PORTB.1=0
WaitMs t
PORTB.2=1
PORTD.3=1
PORTD.4=0
PORTD.5=0
PORTD.7=0
PORTB.1=1
WaitMs t
PORTD.6=0
PORTB.0=1
WaitMs t
PORTB.2=0
PORTD.4=1
PORTD.7=1
PORTB.1=0
WaitMs t
PORTD.6=1
PORTB.0=0
WaitMs t
PORTD.3=0
PORTD.5=1
PORTD.7=0
PORTB.1=1
WaitMs t
PORTD.6=0
PORTB.0=1
WaitMs t
PORTD.7=1
PORTB.1=0
PORTB.2=1
PORTD.4=0
WaitMs t

Case 5 '2 motor back
PORTD.6=1
PORTD.7=1
PORTB.0=0
PORTB.1=0
WaitMs t
PORTB.2=1
PORTD.3=1
PORTD.4=0
PORTD.5=0
PORTD.6=0
PORTB.0=1
WaitMs t
PORTD.7=0
PORTB.1=1
WaitMs t
PORTD.3=0
PORTD.5=1
PORTD.6=1
PORTB.0=0
WaitMs t
PORTD.7=1
PORTB.1=0
WaitMs t
PORTD.6=0
PORTB.0=1
PORTB.2=0
PORTD.4=1
WaitMs t
PORTD.7=0
PORTB.1=1
WaitMs t
PORTD.6=1
PORTB.0=0
PORTD.3=1
PORTD.5=0
WaitMs t

Case 6
   
Case 7


Case 8
PORTD.6=0
PORTD.7=0
PORTB.0=0
PORTB.1=0
PORTB.2=0
PORTD.3=0
PORTD.4=0
PORTD.5=0
i=6
Case 9
Sound 189, 14 '1 kHz beep, 1 sec in duration DO FREQ=50/X TIME=(X1/X2)*50
'Sound 168, 25 '2 kHz beep, 0.5 sec in duration RE
Sound 151, 6 '1 kHz beep, 1 sec in duration MI
'Sound 142, 25 '2 kHz beep, 0.5 sec in duration FA
Sound 126, 6 '1 kHz beep, 1 sec in duration SOL
'Sound 113, 25 '2 kHz beep, 0.5 sec in duration LA
'Sound 101, 25 '1 kHz beep, 1 sec in duration SI
Sound 94, 22 '1 kHz beep, 1 sec in duration DO
Sound 126, 6
Sound 94, 30
i=8

End Select

Loop



'///////////////////////////////////////////////////////////////////////////////////////
Interrupt Int0()            ' trigg with manchester coded signal
'Flanka= True
End Interrupt

'///////////////////////////////////////////////////////////////////////////////////////
Interrupt Urxc(), Save 4    ' saves received char in ID
Local tmp As Byte
InputBin tmp

Select Case tmp
Case 114 'R
' t=20
i=1
Print "DRIVE A BACK"
Case 234 'R
' t=20
i=1
Print "DRIVE A BACK"
Case 101 'E
' t=20
i=0
Print "DRIVE A FORW"
Case 243 'E
' t=20
i=0
Print "DRIVE A FORW"
Case 49 '1
t=8
t1=40
Case 50 '2
t=20
t1=80

Case 48 '0

i=9
Print "STOP MOTOR"
Case 233 'Q
' t=5
i=2
Print "DRIVE B BACK"
Case 113 'Q
' t=5
i=2
Print "DRIVE B BACK"
Case 246 'W
' t=5
i=3
Print "DRIVE B FORW"
Case 119 'W
' t=5
i=3
Print "DRIVE B FORW"
Case 231 'P
' t=5
i=4
Print "2 MOTOR FORW"
Case 111 'P
' t=5
i=4
Print "2 MOTOR FORW"
Case 249 'O
' t=5
i=5
Print "2 MOTOR BACK"
Case 112 'O
' t=5
i=5
Print "2 MOTOR BACK"
Case Else
Print "PLIS PUSH OTHER KEY"
End Select


End Interrupt

В общем пррограмма тоже не сложная. Если включить мозги, достаточно быстро дойдете что и как прога делает. Опять для ленивых выкладываю .hex - файл

image005.gif (551 bytes)

Получив оба файла открываем PONYProg2000, подаем питание на контроллер, выбираем устройство AT90S2313 (его мы будем программировать сначала), стираем его (нажав на кнопку "СТЕРЕТЬ"), открываем ir.hex файл (это "открыть файл программы FLASH") и нажимаем на кнопку "записать файл программы FLASH".Контроллер готов к эксплуатации.

Затем выбираем устройство ATMega8, подаем соответственно на этот контроллер питание и....вот тут-то и ждет нас ЗАСАДА. Дело в том, что с завода контроллеры поставляются с предустановленной тактовой частотой 1МГц. Нам этой частоты несколько маловато будет. Мы должны выставить 4 МГц. Для этого открываем "Команды->Security and Configyre Bit"   и производим считывание битов из контроллера (там кнопка предусмотрена "СЧИТАТЬ"). НИ В КОЕМ СЛУЧАЕ НЕ ОТНЕСИТЕСЬ К ЭТОЙ ВКЛАДКЕ СПУСТЯ РУКАВА. Именно ЭТА ВКЛАДКА может привести к тому, что вы увидите свой контроллер живым в последний раз...(особенно это касается планарных контроллеров). Выставляем ТОЛЬКО: CKSEL3 - галочка есть, CKSEL2 - галочка есть, CKSEL1 - галочки нет, CKSEL0 - галочки нет. Щелкаем по кнопке "ЗАПИСАТЬ" и продолжаем.

Открываем файл autoSid3.hex и записываем его аналогично контроллеру AT90S2313.

ИТАК: Оба контроллера готовы к эксплуатации. Отключаем питание, Соединяем их между собой по RS232, подаем питание и клацаем по кнопке пульта управления... устройство начнет отрабатывать команды только со второй команды с пульта. Причем повторное нажатие той же кнопки на пульте контроллером игнорируется.... Так уж мне захотелось.

В общем на подходе программа записи в память последовательности команд, с последующим их восстановлением в обратном порядке....... Но это уже будет другая история.



Используются технологии uCoz