Portul digital al microcontrolerului Atmega328p [619666]
Portul digital al microcontrolerului Atmega328p
Matricea de leduri 8×8
Principiul Handshaking
Prof. coordonator : Ș.l.dr.ing. Octavian Cornea Student: [anonimizat]
1. FUNDAMENTE TEORETICE :
i) Microcontrolerul Atmega328p are 28 de pini, dintre care 23 pot fi folositi ca si pini
digitali( nu se recomanda utilizarea ca si pini digitali a pinilor de RX(PD0) si
TX(PD1) ).
• PORTUL B [7:0]
Portul B este bi -directional I/O pe 8 biti cu rezistoare pull -up interne(pentru fiecare
bit)
• PORTUL C [5:0]
Portul C este bi -directional I/O pe 7 biti cu rezistoare pull -up interne(pentru fiecare
bit)
Se observa pe schema ca PORTUL C este pe aceeasi pini analogici ai
microcontrolerului.
• PC6/RESET
Daca RSTDISBL este programata atunci PC6 poate fi folosit ca si I/O, in caz contrar
este folosit ca si intrare de RESET.
• PORTUL D[7:0]
Portul D este bi -directional I/O pe 8 biti cu rezistoare pull -up interne(pentru fiecare
bit)
Pinii microcontrolerului pot fi configurati atat ca si input cat si output.
ii) 8×8 LED Matrix
Pentru a aprinde toate ledurile de pe display:
( Se recomanda “curatarea coloanelor inainte de a trimite date pe matrice, deci ca si operatie initiala
se pun pe HIGH pinii randurilor ” )
1. se pun pe HIGH pinii corespunzatori coloanelor .
2. se pun pe LOW pinii corespunzatori randurilor .
Pentru a aprinde un singur led ales:
1. Daca pentru a aprinde toate ledurile nu este obligatorie curatarea randurilor ( Pentru curatarea
randurilor se pun pinii corespunzatori pe HIGH ).
2. Se pune pe HIGH pinul corespunzator coloanei pe care se afla ledul, iar toti pinii corespunzatori
celorlalte coloane se pun pe LOW.
3. Se pune pe LOW pinul corespunzator randului pe care se afla ledul, toate celelalte randuri
ramanand pe HIGH.
Pentru a aprinde mai multe leduri pe un rand:
Se folosesc pasii anteriori, pui randu l pe LOW si apoi parcurgi coloanele si pui pe HIGH pinii
corespunzatori ledurilor.
Schema electrica
iii) Principiul Handshaking:
Acest principiu este folosit la sincronizarea actiunilor asincrone intre doua entitati.
Modulul 1(Transmitator) trimite un request catre modulul 2(receptor).
Putem privi requestul ca si un impuls. In momentul de timp t cand modulul 2 a detectat frontal
crescator al requestului, acesta trimite catre modulul 1 un impuls care confirma ca a detectat
requestul( acknowledge ); dupa ce Modulul 1 a primit ACKNOWLEDGE -ul cele doua dispositive vor
incepe acti unea sincrona la momentul de timp t.
In urmatoarea figura sunt prezentate cele doua impulsuri:
Pentru a realiza Handshaking intre doua microcontrolere se conecteaza un fir de la placuta 1 la
placuta 2(request) si un fir de la placuta 2 la placuta 1(acknowledge).
Se pot folosi 2 pini digitali astfel:
Transmitatorul isi programeaza “request -ul” ca si output, iar “acknowledge -ul” ca si input.
Receptorul isi programeaza “request -ul ca si input”, iar “acknowledge -ul” ca si output.
Ca si logica, o idee pentru realizarea sincronizarii ar fi urmato area: Receptorul sa astepte pan a ce
detecteaza un front crescator pe pinul de “request”. Dupa ce a detectat requestul, trimite acknowledge
si incepe actiune a. Transmitatorul incepe actiunea dupa ce a detectat acknowledge -ul.
Codul incarcat in uC
#include <avr/io.h>
//header to enable data flow control over pins
#define F_CPU 1000000
//telling controller cryst al frequency attached
#include <util/delay.h>
//header to enable delay function in program
int main(void)
{
char PORT[8] = {1,2,4,8,16,32,64,128};//pin values of PORTD
static int
ALPHA[26][8]={{0,0b01111111,0b11111111,0b11001100,0b11001100,0b11001100,0b11111111,0b011
11111},
{0,0b00111100,0b01111110,0b11011011,0b11011011,0b11011011,0b11111111,0b11111111},
{0,0b11000011,0b11000011,0b11000011,0b11000011,0b11100111,0b01111110,0b00111100},
{0,0b01111110,0b10111101,0b11000011,0b110000 11,0b11000011,0b11111111,0b11111111},
{0,0b11011011,0b11011011,0b11011011,0b11011011,0b11011011,0b11111111,0b11111111},
{0,0b11011000,0b11011000,0b11011000,0b11011000,0b11011000,0b11111111,0b11111111},
{0b000 11111,0b11011111,0b11011000,0b11011011,0b11011011,0b11011011,0b11111111,0b
11111111},
{0,0b11111111,0b11111111,0b00011000,0b00011000,0b00011000,0b11111111,0b11111111},
{0b11000011,0b11000011,0b11000011,0b11111111,0b11111111,0 b11000011,0b11000011,0b
11000011},
{0b11000000,0b11000000,0b11000000,0b11111111,0b11111111,0b11000011,0b11001111,0b
11001111},
{0,0b11000011,0b11100111,0b01111110,0b00111100,0b00011000,0b11111111,0b11111111},
{0b00000011,0b00000011,0b00000011,0b00000011,0b00000011,0b00000011,0b11111111,0b
11111111},
{0b11111111,0b11111111,0b01100000,0b01110000,0b01110000,0b01100000,0b11111111,0b
11111111},
{0b11111111,0b11111111,0b00011100,0b0011100 0,0b01110000,0b11100000,0b11111111,0b
11111111},
{0b01111110,0b11111111,0b11000011,0b11000011,0b11000011,0b11000011,0b11111111,0b
01111110},
{0,0b01110000,0b11111000,0b11001100,0b11001100,0b11001100,0b11111111,0b11111111},
{0b01111110,0b11111111,0b11001111,0b11011111,0b11011011,0b11000011,0b11111111,0b
01111110},
{0b01111001,0b11111011,0b11011111,0b11011110,0b11011100,0b11011000,0b11111111,0b
11111111},
{0b11001110,0b11011111,0b1101 1011,0b11011011,0b11011011,0b11011011,0b11111011,0b
01110011},
{0b11000000,0b11000000,0b11000000,0b11111111,0b11111111,0b11000000,0b11000000,0b
11000000},
{0b11111110,0b11111111,0b00000011,0b00000011,0b00000011,0b00000011,0b11 111111,0b
11111110},
{0b11100000,0b11111100,0b00011110,0b00000011,0b00000011,0b00011110,0b11111100,0b
11100000},
{0b11111110,0b11111111,0b00000011,0b11111111,0b11111111,0b00000011,0b11111111,0b
11111110},
{0b010 00010,0b11100111,0b01111110,0b00111100,0b00111100,0b01111110,0b11100111,0b
01000010},
{0b01000000,0b11100000,0b01110000,0b00111111,0b00111111,0b01110000,0b11100000,0b
01000000},
{0b11000011,0b11100011,0b11110011,0b11111011,0b11011111,0b11001111,0b11000111,0b
11000011}};//characters a,b,c,d,e,f,g,…z binary codecs
char NAME[]={2,8,17,2,2 0,8,19,3,8,6,4,18,19};///circuitdigest character values
uint8_t l =0;
while(1)
{
for (int m=0;m<sizeof NAME;m++)
{
l = NAME[m];
for (int n=0;n<200;n++)//execute 200 times for the eye to catch
{
for (int j=0;j<4;j++)
{
PORTB = PORT[j];// ROW
PORTD = ~ALPHA[l][j];//show half of character (COLUMN)
_delay_us(500);
}
PORTB=0x00;//clear screen after show
for (int k=0;k<4;k++)
{
PORTC = PORT[k];// ROW
PORTD = ~ALPHA[l][k+4];//show other half of character(COLUMN)
_delay_us(500);
}
PORTC=0x00;//c lear screen after show.
}
}
_delay_ms(220);
_delay_ms(220);
_delay_ms(220);
_delay_ms(220);
_delay_ms(220);
}
}
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Portul digital al microcontrolerului Atmega328p [619666] (ID: 619666)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
