Jump to content
ELFORUM - Forumul electronistilor

ATMega16 - ajutor


dorelb

Recommended Posts

  • Replies 68
  • Created
  • Last Reply

Top Posters In This Topic

  • dorelb

    33

  • godFather89

    13

  • fratello

    5

  • nickrvl

    1

Top Posters In This Topic

Posted Images

Nu mai da nimeni niste sfaturi ? Am ramas la stadiul de cifre inpietrite . Afisaza cele sase segmente - 00 : 00 : 00 - , si cam atat . Se pot regla orele si minutele, dar ceasul nu porneste . Nu am habar la programare .

Link to comment

In codul sursa ai:

/*Global Variables Declarations*/unsigned char hours = 0;unsigned char minutes = 0;unsigned char seconds = 0;
care apoi sunt incrementate din intreruperea de 1 sec.

Trebuie marcate cu 'volatile' ca sa mearga din intrerupere.

 

Deci, schimba cu:

/*Global Variables Declarations*/volatile unsigned char hours = 0;volatile unsigned char minutes = 0;volatile unsigned char seconds = 0;

si recompileaza.

Link to comment

@godFather89. Salut ! Cum am scris mai sus, nu am cu ce sa generez hex-ul. L-am modificat si il atasez mai jos. Daca poate cineva sa genereze hex-ul, mii de multumiri.

Link to comment

@godFather89 . Buna dimineata ! Si eu m-am gandit la un cristal de 32.768 KHz extern . De fapt ai si anticipat ca precizia lui o sa lase de dorit . Poti sa adaugi la program acest cristal, sau trebuie refacut tot programul ? Are un avans foarte mare . De la ora 6 are cam 30 sec.

Link to comment

Nu numai softul e cu bube, dar şi schema lasă de dorit.

 

1. Nu există rezistenţe de limitare a curentului pentru fiecare segment (LED) în parte din afişajul unei cifre. Din cauza asta, vei avea variaţii ale intensităţii luminoase a cifrelor. Cifrele cu mai puţine segmente aprinse, cum ar fi cifra "1" vor lumina mult mai puternic decât cifrele cu multe segmente aprinse, cum ar fi cifra "8".

 

Remediu: pune în serie cu PB0...PB6 câte o rezistenţă de câteva zeci de ohmi. Valoarea exactă a rezistenţelor depinde de tensiunea de alimentare şi de căderea de tensiune pe un LED. Calculezi cu legea lui ohm.

 

2. Singura limitare de curent este făcută cu R1, dar e făcută greşit, pentru că afectează valoarea şi stabilitatea tensiunii de alimentare a MCU-ului (MCU = Micro Controller Unit - aici, e Atmega-ul nostru).

 

Remediu: pune 7 rezistenţe ca la punctul 1, şi apoi desfiinţează R1.

 

3. Nu are condensatoare pe alimentarea MCU-ului. Condensatoarele sunt esenţiale pentru o funcţionare stabilă a circuitelor digitale, circuite în care apar comutaţii şi fronturi abrupte. Fronturile abrupte înseamnă spectru larg şi bogat în frecvenţe înalte. Dacă nu există condensatoare de filtrare pe alimentare, frecvenţele mari vor circula în afara montajului, prin firele de alimentare. Firele de alimentare se vor transforma astfel în antene de emisie şi vor genera paraziţi radio. Pun pariu că acel ceas bruiază simţitor aparatele de radio.

 

Remediu: pune un condensator electrolitic de căteva zeci de uF şi unul neelectrolitic de câteva zeci pănă la sute de nF. Ambele condensatoare le pui în paralel pe alimentarea MCU-ului, cât mai aproape de pinii acestuia.

 

4. Dacă foloseşti alte LED-uri (de exemplu altă culoare), nu se ştie dacă mai merge, şi cum va merge, pentru că LED-uri diferite au căderi de teniune diferite. Cu nişte LED-uri cu cădere mică de tensiune, s-ar putea ca POR (POR = Power On Reset - circuitul din interiorul MCU-ului care detectează valoarea tensiunii de alimentare şi dă reset automat la pornirea montajului) să reseteze aleator MCU-ul, sau să nici nu pornească.

 

Remediu: vezi remediile de la punctele anterioare.

 

5. Nu a activat pull-up resistors pe pinii cu butoanele. Din cauza asta, funcţionarea butoanelor e nesigură. De exemplu, dacă bagi montajul într-o cutie metalică, probabil că butoanele nu vor mai funcţiona.

 

Remediu: activează pull-up resistors pentru pinii PC6 şi PC7. Adică, rescrie tot codul astfel încât în loc de "SegDataPort = " să fie "SegDataPort = 0xC0|", peste tot. Se poate face asta destul de uşor, cu CTRL+H (adică Find & Replace), din editorul codului sursă.

 

6. Nu ştie să folosească type qualifier "volatile". Din cauza asta, acelaşi program va merge sau nu va merge, în funcţie de nivelul de optimizare setat în compilator.

 

Remediu: pune "volatile", cum ţi-a spus godFather89.

 

7. Vrea să facă un ceas folosind oscilatorul intern, care are variaţii mari de frecvenţă cu temperatura, cu alimentare şi de la un MCU la altul, variaţii suficient de mari cât să facă ceasul de neutilizat.

 

Remediu: oscilator cu cuarţ şi schimbat fusebits-ii, astfel încât să se folosească cuarţul.

 

 

 

Probabil mai sunt şi alte greşeli, n-am mai căutat, astea sunt doar cele care mi-au sărit în ochi.

Cine a proiectat ceasul era începător, şi la hardware, şi la software.

Link to comment

Pai tot ce trebuie sa faci e sa legi un cristal de quartz de 32.768 KHz (gasesti in majoritatea ceasurilor) si sa folosesti timer-ul 2 in modul asincron.

For AVR microcontrollers with Timer/Counter Oscillator pins (TOSC1 and TOSC2), the crystal isconnected directly between the pins. No external capacitors are needed. The Oscillator is optimizedfor use with a 32.768 kHz watch crystal. Applying an external clock source to TOSC1 isnot recommended.

Vezi aici incepand cu pagina 117.LE: Despre restul, RoGeorge are dreptate. Foarte multe greseli (nu m-am uitat deloc pe schema pana acum). Ai ales probabil cel mai prost proiect de ceas de pe net...
Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines