background image

Moduł z mikrokontrolerem

ATMEGA32

Białystok, sierpień 2015

background image

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.

background image

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

background image

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

background image

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

background image

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

background image

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

;

;-----------------------------------------------------------------------------

background image

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] ;

background image

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