Moduł z mikrokontrolerem
ATMEGA32
Białystok, sierpień 2015
Andrzej Pawluczuk: „Moduł z mikrokontrolerem ATMEGA32”
-2/9-
Copyright (C) 2015, Andrzej Pawluczuk. email: apawluczuk@vp.pl
Wszystkie prawa zastrzeżone.
Redystrybucja i używanie, czy to w formie tekstu źródłowego, czy w formie kodu
wykonywalnego, są dozwolone pod warunkiem spełnienia poniższych warunków:
1. Redystrybucja tekstu źródłowego musi zawierać powyższe zastrzeżenie
własności praw autorskich, niniejszą listę warunków oraz poniższe oświadczenie
o wyłączeniu odpowiedzialności.
2. Redystrybucja kodu wykonywalnego musi zawierać w dokumentacji lub w
innych materiałach dostarczanych wraz z kopią oprogramowania powyższe
zastrzeżenie własności praw autorskich, niniejszą listę warunków oraz poniższe
oświadczenie o wyłączeniu odpowiedzialności.
3. Nazwisko autora nie może być użyte celem sygnowania lub promowania
produktów pochodzących od tego opracowania, bez szczególnego, wyrażonego
na piśmie zezwolenia.
To opracowanie jest dostarczone przez posiadacza praw autorskich „takim, jakie jest”.
Każda, dorozumiana lub bezpośrednio wyrażona gwarancja, nie wyłączając dorozumianej
gwarancji przydatności handlowej i przydatności do określonego zastosowania, jest
wyłączona. W żadnym wypadku posiadacz praw autorskich nie może być odpowiedzialny
za jakiekolwiek bezpośrednie, pośrednie, incydentalne, specjalne, uboczne i wtórne
szkody (nie wyłączając obowiązku dostarczenia produktu zastępczego lub serwisu,
odpowiedzialności z tytułu utraty walorów użytkowych, utraty danych lub korzyści, a
także przerw w pracy przedsiębiorstwa) spowodowane w jakikolwiek sposób i na
podstawie istniejącej w torii odpowiedzialności kontraktowej, całkowitej lub deliktowej
(wynikłej zarówno z niedbalstwa, jak i innych postaci winy), powstałe w jakikolwiek
sposób w wyniku używania lub mające związek z używaniem oprogramowania, nawet
jeśli o możliwości powstania takich szkód ostrzeżono.
Zastrzeżonych nazw firm, nazw produktów i znaków towarowych użyto w celu ich
identyfikacji.
Andrzej Pawluczuk: „Moduł z mikrokontrolerem ATMEGA32”
-3/9-
rzydatność różnych modułów, szczególnie zawierających rozbudowane (w
sensie liczby wyprowadzeń) elementy przewidziane do montażu SMD nie
podlega dyskusji. Takimi elementami z pewnością są mikrokontrolery. Sam
mikrokontroler ma kilkadziesiąt delikatnych wyprowadzeń. Taki komponent musi
zostać do czegoś przylutowany. Jak przylutowany, to koniecznie należy
„wyprodukować” odpowiednią płytkę PCB. Warto przewidzieć na tej płytce jakieś
dodatkowe elementy, które często występują w środowisku testowym
mikrokontrolera. Zdecydowałem się na zabudowę zestawu LED'ów oraz interfejsu
RS232. Nieodzownym również elementem jest przyłącze do programatora pamięci
FLASH wewnątrz mikrokontrolera. Pozostałe porty są wyprowadzone na złącze
szpilkowe, które pozwoli na integrację modułu z płytą “Solderless Breadboard”. Tak
określone wymagania spełnia moduł, którego schemat przedstawiają kolejne
ilustracje.
P
Ilustracja 1 zawiera mikrokontroler i niezbędne do jego działania elementy:
zespół resetowania, rezonator kwarcowy do „napędzania” procesora oraz przyłącze
do programatora ISP.
W konstrukcji zostało przewidzianych 8 LED'ów, które są przyłączone do portu B
mikrokontrolera. Wybór portu jest podyktowany tym, że port ten jest współużywany
również przez programator ISP i w trakcie jego działania nie mogą być zakłócane
odpowiednie linie. Zespół LED'ów odseparowany od mikrokontrolera przez układ
ULN2803 nie generuje żadnych sygnałów na liniach programatora. Dodatkowo
odciąża prądowo port mikrokontrolera (ilustracja 2). Zastosowane rozwiązanie
oznacza również, że zapalenie diody LED wymaga ustawienia na porcie stanu
wysokiego.
Ilustracja 1: Mikrokontroler i jego "żywotnie” istotne okolice
Andrzej Pawluczuk: „Moduł z mikrokontrolerem ATMEGA32”
-4/9-
Kolejnym istotnym elementem jest interfejs RS232 pozwalający na eksperymenty
z transmisją szeregową (ilustracja 3). Zastosowany jest tu układ ST3232, będący
mutacją znanego układu MAX232, który może być zasilany napięciem obniżonym.
Pozwala to na eksperymenty z zasilaniem procesora ze źródła napięcia o wartości
zarówno +5V jak i +3,3V.
Pozostałe niewykorzystane w module wyprowadzenia są przyłączone do złącz
szpilkowych przewidzianych do stworzenia elektrycznego kontaktu tych portów z
płytą „dziurkowaną” (ilustracja 4).
Ilustracja 2: Zespół LED'ów
Ilustracja 3: Interfejs RS232
Andrzej Pawluczuk: „Moduł z mikrokontrolerem ATMEGA32”
-5/9-
Zgodnie ze schematem połączeń, zaprojektowana jest
niewielka płytka PCB (ilustracje 5, 6, 7).
Po przylutowaniu wszystkich elementów powstaje wyrób
finalny (ilustracja 9).
Ilustracja 4:
Niewykorzystane piny są
wyprowadzone na złącze
Ilustracja 5: Ścieżki strony TOP
Ilustracja 6: Ścieżki strony BOTTOM
Andrzej Pawluczuk: „Moduł z mikrokontrolerem ATMEGA32”
-6/9-
Finalny wyrób:
Do sprawdzenia modułu powstaje prosty program (co prawda program nie
weryfikuje całości modułu, nie transmituje przykładowo nic przez interfejs RS232).
Jego zadaniem jest wyświetlanie na 8-bitowym zestawie LED'ów kolejnych
Ilustracja 7: Rozmieszczenie elementów
Ilustracja 9: Moduł docelowy
Ilustracja 8: Rozmieszczenie styków modułu
Andrzej Pawluczuk: „Moduł z mikrokontrolerem ATMEGA32”
-7/9-
inkrementowanych liczb w postaci binarnej. Pierwsze „włączenie do prądu”
przebiega pomyślnie. Programator „zobaczył” nowego proca. W takim wypadku
zostają przestawione fabryczne „fuse” na takie, które mi odpowiadają. Operacja się
powidła, procek żyje.
Tekst programu jest następujący.
;
(…)
.nolist
;*******************************************************
.include "m32def.inc"
;*******************************************************
.list
.listmac
;-----------------------------------------------------------------------------
.def acc
= r16
;-----------------------------------------------------------------------------
.dseg
;
;VAR
Cnt : .byte 1
; Cnt : BYTE ;
;-----------------------------------------------------------------------------
.cseg
;*******************************************************
;*******************************************************
;** **
;** CODE SEGMENT **
;** **
;*******************************************************
;*******************************************************
;-----------------------------------------------------------------------------
.org
0
;
rjmp
ResetProcessor
;
;-----------------------------------------------------------------------------
.org
INT0addr
; External Interrupt Request 0
reti
;
;-----------------------------------------------------------------------------
.org
INT1addr
; External Interrupt Request 1
reti
;
;-----------------------------------------------------------------------------
.org
INT2addr
; External Interrupt Request 2
reti
;
;-----------------------------------------------------------------------------
.org
OC2addr
; Timer/Counter2 Compare Match
reti
;
;-----------------------------------------------------------------------------
.org
OVF2addr
; Timer/Counter2 Overflow
reti
;
;-----------------------------------------------------------------------------
.org
ICP1addr
; Timer/Counter1 Capture Event
reti
;
;-----------------------------------------------------------------------------
.org
OC1Aaddr
; Timer/Counter1 Compare Match A
reti
;
;-----------------------------------------------------------------------------
.org
OC1Baddr
; Timer/Counter1 Compare Match B
reti
;
;-----------------------------------------------------------------------------
.org
OVF1addr
; Timer/Counter1 Overflow
reti
;
;-----------------------------------------------------------------------------
Andrzej Pawluczuk: „Moduł z mikrokontrolerem ATMEGA32”
-8/9-
.org
OC0addr
; Timer/Counter0 Compare Match
reti
;
;-----------------------------------------------------------------------------
.org
OVF0addr
; Timer/Counter0 Overflow
reti
;
;-----------------------------------------------------------------------------
.org
SPIaddr
; Serial Transfer Complete
reti
;
;-----------------------------------------------------------------------------
.org
URXCaddr
; USART, Rx Complete
reti
;
;-----------------------------------------------------------------------------
.org
UDREaddr
; USART Data Register Empty
reti
;
;-----------------------------------------------------------------------------
.org
UTXCaddr
; USART, Tx Complete
reti
;
;-----------------------------------------------------------------------------
.org
ADCCaddr
; ADC Conversion Complete
reti
;
;-----------------------------------------------------------------------------
.org
ERDYaddr
; EEPROM Ready
reti
;
;-----------------------------------------------------------------------------
.org
ACIaddr
; Analog Comparator
reti
;
;-----------------------------------------------------------------------------
.org
TWIaddr
; 2-wire Serial Interface
reti
;
;-----------------------------------------------------------------------------
.org
SPMRaddr
; Store Program Memory Ready
reti
;
;-----------------------------------------------------------------------------
LongDelay :
;PROCEDURE LongDelay ( ) ;
;****************
;BEGIN (* LongDelay *)
ldi zl,0 ;
ldi
zh,0
;
LoDe_0 :
;
adiw zl,1 ;
mov acc,zl ;
or acc,zh ;
brne LoDe_0 ;
ret ;END (* LongDelay *) ;
;-----------------------------------------------------------------------------
Pause
:
;PROCEDURE Pause ( ) ;
;****************
;BEGIN (* Pause *)
rcall LongDelay
; LongDelay ( ) ;
rcall LongDelay
; LongDelay ( ) ;
rcall LongDelay
; LongDelay ( ) ;
rcall LongDelay
; LongDelay ( ) ;
rcall LongDelay
; LongDelay ( ) ;
ret
;END (* Pause *) ;
;-----------------------------------------------------------------------------
ResetProcessor :
;
ldi
acc,HIGH(RAMEND)
;
out
SPH,acc
;
ldi
acc,LOW(RAMEND)
;
out
SPL,acc
;
Main :
;BEGIN (* Main *)
ldi
acc,0xFF
;
out
DDRB,acc
; [PORTB] := [output] ;
Andrzej Pawluczuk: „Moduł z mikrokontrolerem ATMEGA32”
-9/9-
ldi
acc,0
; [PORTB] := 0 ;
out
PORTB,acc
;
sts
Cnt,acc
; Cnt := 0 ;
Main_0
:
; LOOP
rcall Pause
; Pause ( ) ;
lds
acc,Cnt
; Cnt := Cnt + 1 ;
inc
acc
;
sts
Cnt,acc
;
out
PORTB,acc
; PORTB := Cnt ;
rjmp
Main_0
; END (* LOOP *) ;
;END (* Main *) ;
;-----------------------------------------------------------------------------
.exit
Po wygenerowaniu wersji binarnej programu, mikrokontroler pomyślnie został
zaprogramowany, czego efektem jest oczekiwane „mruganie” LED'ami.
Ilustracja 10: Układ działa