Sari la conținut
ELFORUM - Forumul electronistilor

Ceas simplu cu Atmega 8 - ajutor, va rog !


fratello

Postări Recomandate

Lasa "Dta:" asa cum este.

Corect:

Data &H77 , &H4C , &H45 , &H27 , &H85 , &HA4 , &H57 , &H04 , &H07 , &H14, &HFF

In loc de:

Portb = &H0F

Scrie:

Portb = &H00

Inlocuieste asta:

Y = X - 1 ' считаем какую конкретно цифру, из 4х нужно сейчас зажечьReset Portb.y ' зажигаем нужную цифру под номером игрик

Cu asta:

Y = X - 1 ' считаем какую конкретно цифру, из 4х нужно сейчас зажечьSet Portb.y ' зажигаем нужную цифру под номером игрик
Link spre comentariu

Pana aici e bine ...

Desi nu este afisat segmentul A, dar poate este o eroare din Proteus (?!) ...

Mai trebuie "activat" punctul pentru secunde si "dezactivat" zero la zecile de ore.

post-175951-0-94343800-1452098805_thumb.jpg

Editat de fratello
Link spre comentariu

Punctul zecimal este PD2 si il setezi/resetezi la fiecare secunda.

Set Portd.2If Dotx = 0 Then Reset Portd.2 Else Set Portd.2

Desi am revazut setul de date pentru formarea cifrelor nu mi-au aparut erori (cu exceptia a doua cifre 6 si 9, pe care le-am corectat).

Este posibil ca PD5 sa fie setat ca intrare, desi nu pare.

Incearca si urmatoarea varianta:

Data &H77 , &H4C , &H45 , &H27 , &H85 , &HA6 , &H57 , &H04 , &H07 , &H14, &HFF
Link spre comentariu

Am "activat" si liniile :

Dim Dotx as Integer

Dotx = _sec mod 2

Acum se aprinde DP, dar la TOTI digitii ! In continuare segmentul A nu se aprinde.

 

Acesta este ultima versiune completa de cod  (poate ajuta o privire de ansamblu):

' CKOPT,BOOTSZ1,BOOTSZ0,SUT1,SUT0,CKSEL3,CKSEL1,CKSEL0$regfile = "m8def.dat" '$crystal = 8000000Config Portb = Output ,Config Portd = Output ,Config Pinc.3 = InputPortc.5 = 1Portc.4 = 1Dim I As Byte , X As Byte , Y As Byte , Temp As Integer , Bn(10) As Byte , Cifra(5) As IntegerDim Dotx as IntegerRestore DtaFor I = 1 To 10Read Bn(i)Next 'Config Clock = Soft_sec = 0 : _min = 0 : _hour = 0Config Timer0 = Timer , Prescale = 8Config Timer1 = Counter , Edge = Falling , Prescale = 1On Timer0 PulseEnable InterruptsEnable Timer0Config Debounce = 30DoDebounce Pinc.4 , 0 , Minute , SubDebounce Pinc.5 , 0 , Ore , SubTemp = _hour * 100Temp = Temp + _minFor I = 1 To 4Cifra(i) = Temp Mod 10If Cifra(i) = 0 ThenCifra(i) = 10Goto TEnd IfTemp = Temp - Cifra(i)T:Temp = Temp / 10NextDotx = _sec mod 2LoopEndPulse:Incr XPortb = &B00000000Portd = Bn (Cifra(x))Set Portd.2If Dotx = 0 Then Reset Portd.2 Else Set Portd.2Y = X - 1Set Portb.yIf X = 4 Then X = 0ReturnDta:Data &H77 , &H4C , &H45 , &H27 , &H85 , &H84 , &H57 , &H04 , &H05 , &H14, &HFFMinute:Incr _minIf _min = 60 Then_min = 00Incr _hourEnd IfIf _hour > 23 Then _hour = 00_sec = 00ReturnOre:Incr _hourIf _hour > 23 Then _hour = 00Return
Link spre comentariu

Dezactiveaza Timer1, asa:

'Config Timer1 = Counter , Edge = Falling , Prescale = 1

si vei avea si segmentul A .

 

Codul de mai jos l-am testat:

$regfile = "m8def.dat" '$crystal = 8000000Config Portb = Output ,Config Portd = Output ,Config Pinc.3 = InputPortc.5 = 1Portc.4 = 1Dim I As Byte , X As Byte , Y As Byte , Temp As Integer , Bn(10) As Byte , Cifra(5) As IntegerDim Dotx as IntegerRestore DtaFor I = 1 To 10Read Bn(i)Next 'Config Clock = Soft_sec = 0 : _min = 0 : _hour = 0Config Timer0 = Timer , Prescale = 8'Config Timer1 = Counter , Edge = Falling , Prescale = 1On Timer0 PulseEnable InterruptsEnable Timer0Config Debounce = 30DoDebounce Pinc.4 , 0 , Minute , SubDebounce Pinc.5 , 0 , Ore , SubTemp = _hour * 100Temp = Temp + _minFor I = 1 To 4Cifra(i) = Temp Mod 10If Cifra(i) = 0 ThenCifra(i) = 10Goto TEnd IfTemp = Temp - Cifra(i)T:Temp = Temp / 10NextDotx = _sec mod 2LoopEndPulse:Incr XPortb = &B00000000Portd = Bn (Cifra(x))Set Portd.2If Dotx = 0 Then Reset Portd.2 Else Set Portd.2Y = X - 1Set Portb.yIf X = 4 Then X = 0ReturnDta:'Data &H77 , &H4C , &H45 , &H27 , &H85 , &H84 , &H57 , &H04 , &H05 , &H14, &HFFData &H77 , &H4C , &H45 , &H27 , &H85 , &HA6 , &H57 , &H04 , &H07 , &H14, &HFFMinute:Incr _minIf _min = 60 Then_min = 00Incr _hourEnd IfIf _hour > 23 Then _hour = 00_sec = 00ReturnOre:Incr _hourIf _hour > 23 Then _hour = 00Return

si in atasament fisierul hex.

ceas_ac.txt

Link spre comentariu

Cred, dar nu sunt sigur, ca asa:

Pulse:Portb = &B00000000Incr XPortd = Bn (Cifra(x))Set Portd.2Y = X - 1Set Portb.yIf Dotx = 0 AND Portb.2 = 1 Then Reset Portd.2 Else Set Portd.2If X = 4 Then X = 0
Link spre comentariu

Pentru mine e noua aceasta abordare inclusiv cu "citirea" tactului:

$regfile = "m8def.dat"$crystal = 1000000 'Internal RC$hwstack = 64$swstack = 64$framesize = 64'RTCConfig Clock = Soft , Gosub = Sectic

 

si am presupus ca setarea se face pe 1Mhz intern iar tactul pentru ceas il da oricum oscilatorul extern, la Atmega 16 parca am vazut o aplicatie cu doua oscilatoare externe si daca nu ma insel are o functie interna separata pentru ceas, vorbesc din memorie si scriu rapid, posibil sa ma insel....

 

 

L.E era raspuns pentru "rata" de la postul #36

Editat de nickrvl
Link spre comentariu

Asa merge corect punctul :

Pulse:Incr XPortb = &B00000000Portd = Bn (Cifra(x))Set Portd.2Y = X - 1Set Portb.yIf Dotx = 0 AND Portb.2 = 1 Then Reset Portd.2 Else Set Portd.2If X = 4 Then X = 0Return

Mai ramane de "sters" zero-ul zecilor de ore.Probabil tot ceva de genul "If Temp<>0 Then ...?".

Link spre comentariu

Dacă ora împărţită la zece e zero, nu o mai afişezi.

 

am presupus ca setarea se face pe 1Mhz intern iar tactul pentru ceas il da oricum oscilatorul extern, la Atmega 16 parca am vazut o aplicatie cu doua oscilatoare externe si daca nu ma insel are o functie interna separata pentru ceas, vorbesc din memorie si scriu rapid, posibil sa ma insel....

Sigur, dacă foloseşti cuarţul de 32,768kHz doar pentru timerul care generează secundele, poţi folosi oricare alt semnal de ceas pentru aplicaţie. Am crezut că vrei să faci un ceas exclusiv cu oscilatorul intern.

Link spre comentariu

Inteleg, deci pot seta Mc-ul pe oscilator intern pentru "altele" (1Mhz sa zicem) si sa-i atasez oscilator extern de 32,768khz pe care implicit Mc-ul il va folosi la numaratul secundelor prin comenzile:

Config Clock = Soft , Gosub = Sectic

in cazul Bascom-ului, corect?

 

Alte intrebari;

- Atmega16 e mai specializat in acest caz decit Atmega8? are alte facilitati hard/soft in cea ce priveste ceasul sau eventual Data?sau am citit/retinut eu gresit....

- Cit tine o baterie de 9V (sa zicem) pe un ceas facut cu Atmega8 si afisaj cu leduri de 4 digiti? ma bazez pe cei ce au facut astfel de ceasuri si care au capatat astfel experienta in timpul in care le-au utilizat, adica e fezabil un astfel de proiect judecind strict din punct de vedere al consumului si doar pe baterie (nu cu alimentare de la retea)? sau intr-o luna ma lasa bateria....., stiu ca se poate calcula/aproxima insa o experienta impartasita valoreaza mult.

- Si nu in ultimul rind, cit de precise sint? daca il reglez odata la 6 luni ar fi ok insa daca sint nevoit sa-l reglez in fiecare luna nu prea ar fi convenabil, din punctul meu de vedere....

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