Sari la conținut
ELFORUM - Forumul electronistilor

Programarea uC-urilor Atmel


Postări Recomandate

Salutare!

Vreau sa-i multumesc colegului nostru @ratza care ma ajuta sa inteleg despre ce este vorba,respect.

Am vazut greseala cu timpul ,trebuia sa scriu _delay_ms(250); ca sa am in total 500ms,dar nu-i problema.

Alta este si anume PORTB |=0b0000001; bara aceea este "sau",nu? Si ineamna ca doar pinul 0 din port B este high ,restul cum sunt ,cum adica sunt neafectati?

PORTB &= ~0b00000001Si aici la fel,cum e? &=Si  ,iar ~=NOT ,cum fac sa imi dau seama ce fac acesti & | ~ ,de la informatica stiu ca 01010&01110=01010 01010|01110=01110.

Am citit intr-o carte ceva de genu DDRB=32 sau 7 ,adica un numar natural, ce inseamna? In carte nu explica.

Link spre comentariu

AND, OR, XOR şi NOT sînt operaţii logice, exact cele folosite la porţile logice. Pe pagina anterioară ai semnificaţia lor, o mai trec o dată aici ca să nu mai dai pagina înapoi (ştiu din experienţe recente cum e să uiţi unde ai rămas).

AND & ->  0&0=0; 0&1=0; 1&0=0; 1&1=1 (rezultatul e 1 doar dacă ambii termeni sînt 1)OR  | ->  0|0=0; 0|1=1; 1|0=1; 1|1=1 (rezultatul e 0 doar dacă ambii termeni sînt 0)XOR ^ ->  0^0=0; 0^1=1; 1^0=1; 1^1=0 (rezultatul e 1 doar dacă termenii sînt diferiţi)NOT ~ ->  ~0=1; ~1=0                 (rezultatul e opusul)

Să presupunem că port B are valoarea iniţială 0b11110000, adică:

PB7 = 1

PB6 = 1

PB5 = 1

PB4 = 1

PB3 = 0

PB2 = 0

PB1 = 0

PB0 = 0  <-- aici e ledu' nostru, numai cu el avem treabă.

 

Să zicem că vrei să aprinzi ledul:

PORTB |= 0b00000001 => PORTB = PORTB | 0b00000001 => PORTB = 0b11110000 | 0b00000001 => PORTB = 0b11110001

După care vrei să-l stingi (PORTB are valoarea de sus):

PORTB &= ~0b00000001 => PORTB = PORTB & 0b11111110 => PORTB = 0b11110001 & 0b11111110=> PORTB = 0b11110000

 

Ledul reprezină bitul colorat cu roşu, cei coloraţi cu albastru au alte functionalităţi de care nu ne pasă. După cum vezi, toţi ceilalţi biţi şi-au păstrat valoarea, nefiind afectaţi absolut deloc, însă ledul se aprinde şi se stinge fără probleme.

 

Referitor la DDRB = 32, e preferabil să foloseşti valori în hexa, care sînt extrem de uşor de transpus în binar.

32 devine 0x20 sau 0b00100000.

7 devine 0x07 sau 0b00000111.

133 devine 0x85 sau 0b10000101.

 

EDIT: Mi-am corectat cretinismele scrise.

Editat de ratza
Link spre comentariu

Multumesc mult ,cred ca am inteles

AND & -> 0&0=0; 0&1=0; 1&0=0; 1&1=      1&1=nu este 1.

 PORTB &= ~0b00000001 => PORTB = PORTB | 0b11111110 => PORTB = 0b11110001 | 0b11111110=> PORTB = 0b1111000 pot sa o scriu si asa  

PORTB &= ~0b00000001 =>PORTB=PORTB & 0b11111110=> PORTB =0b11110000 adica sa nu mai folosesc de 2 ori OR

Multumesc ca va bateti capul cu mine.

Link spre comentariu

Vreau sa fac ceva de genu https://www.youtube.com/watch?v=-LaSOtzyrP8 ,acolo e cu cd4017 eu vreau sa-l fac cu un atmega.Vreau ca primul LED sa se aprinda tot asa pana la ultimul ,apoi sa o ia de la capat.

Codul:

#include<avr/io.h>

#include<util/delay.h>

 

int main(void)

{

DDRB=0b11111111;

PORTB=0b00000000;

  while(1)

PORTB=0b00000001;

  _delay_ms(100);

PORTB=0b00000010;

  _delay_ms(100);

PORTB=0b00000100;

  _delay_ms(100);

PORTB=0b00001000;

  _delay_ms(100);

PORTB=0b00010000;

  _delay_ms(100);

PORTB=0b00100000;

  _delay_ms(100);

PORTB=0b01000000;

  _delay_ms(100);

PORTB=0b10000000;

  _delay_ms(100);

}

}

E bun codul?

Editat de PKP98
Link spre comentariu

Eu as face ceva de genul:

while (1) { for (int i = 0; i<8; i++){  PORTB = PORTB << i;  _delay_ms(100); }}

Pare OK si varianta ta daca vrei sa mearga numai intr-o directie, dar de ce nu il testezi in Proteus?

 

Daca vrei Knight Rider, adica de la bit0 la bit7 si de la bit7 la bit0 atunci ar fi asa:

while (1) { for (int i = 1; i<8; i++){  PORTB = PORTB << i;  _delay_ms(100); } for (int i = 6; i>=0; i--){  PORTB = PORTB << i;  _delay_ms(100); }}

Adaugi restul de program cum le-ai scris si tu.

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum
×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări