www.elektronik.si
ATmega8 - težave
Pojdi na stran 1, 2, 3  Naslednja  :||:
www.elektronik.si -> AVR, LPC900, x51

Avtor: linelKraj: prekmurje PrispevekObjavljeno: Pet Nov 29, 2013 12:55 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Da nebom nove teme odpiral, bom kar tukaj vprašal, in sicer.

Imam težave z samodejnim resetiranjem mikrokontrolerja (atmega8) naključno med delovanjem. Gre pa se pa za semafor rezultata za namizni tenis, ko z tipkami povečujem pač vrednosti (rezultat) se naključno zgodi da vrednosti samodejno postavi na 0 (brez da bi pritisnil tipko za reset rezultata, na pin reset mikrokontrolerja pa je povezan 10K upor na Vcc in pa kondenzator 100nf na gnd.

kaj je temu vzrok?

Avtor: mujoKraj: MB PrispevekObjavljeno: Pet Nov 29, 2013 1:23 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Kako daleč imaš postavljen upor od reset linije?

V kolikor je upor na reset povezavo preveč daleč se lahko na tej liniji kaj inducira in sproži reset.

Avtor: linelKraj: prekmurje PrispevekObjavljeno: Pet Nov 29, 2013 1:30 pm    Naslov sporočila:  
----------------------------------------------------------------------------
kondezatorja in upora nisem narisal ko sem načrtoval vezje, tako da sem kondenzator in upor prispajkal direkt na pine na mikrokontrolerju (spodnja stran vezja)

Avtor: VolkDKraj: Divača (Kačiče) PrispevekObjavljeno: Pet Nov 29, 2013 1:33 pm    Naslov sporočila:  
----------------------------------------------------------------------------
linel je napisal/a:
Da nebom nove teme odpiral, bom kar tukaj vprašal, in sicer.

Bom pa jaz.

Avtor: zokKraj: Ponikva PrispevekObjavljeno: Pet Nov 29, 2013 2:34 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Kaj pa napajanje?

Je semafor napajan iz iste veje kot AtMega (5 V za stabilizatorjem)?

Avtor: lojzek PrispevekObjavljeno: Pet Nov 29, 2013 2:42 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Ali si gotov, da se resnično resetira.... Da nimaš kaj narobe v programu in ti vrednosti program postavi na 0?

Če bi to rad preveril, čisto na začetek programa dodaj eno ali dve vrstici, ki ti za nekaj časa prižgeta npr. eno lučko... Pa pazi, da se bo to res lahko izvedlo samo enkrat...

Pa še to. ni nujno, da imaš samo ta fizični reset na pinu Mege. Imaš lahko tudi Brown Out Reset, Watchdog Reset,..

Avtor: mucekKraj: Domzale PrispevekObjavljeno: Pet Nov 29, 2013 2:52 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Je program prav napisan - da ne skačeš v kakšne subrutine in potem nazaj iz subrutin z Goto? (hint: stack)
Je napajanje stabilno? Zna biti, da ti pri vklopu displayev napajanje (lahko le za trenutek) pade pod dovoljeno (imaš omogočen brown out detection?) in se ti procesor resetira.

LP, g

Avtor: linelKraj: prekmurje PrispevekObjavljeno: Pet Nov 29, 2013 2:59 pm    Naslov sporočila:  
----------------------------------------------------------------------------
napajanje imam iz istega usmernika, enkrat uporabljen l7805 za napajanje mikrokontrolerja in lm317 za napajanje 7 segmentnih prikazovalnikov 8,4V.

nevem kaj bi imel v programu narobe, ker se to zgodi naključno ( npr rezultat 7 :13 ; 21: 18 ; 7:5..., vedno pa ob pritisku na katerokoli tipko (tipka prištevanje ali odštevanje) če ne pritiskam je stabilno in nikoli ne pade rezultat na 0 oz. resetne.

Avtor: KrEnKraj: LJ PrispevekObjavljeno: Pet Nov 29, 2013 3:20 pm    Naslov sporočila:  Napajanje
----------------------------------------------------------------------------
Vse skupaj nakazuje lahko na več problemov:
Če uporabljaš watch dog:
ali slučajno presežeš v kaki rutini čas?

Kot je ze bilo omenjeno BROWN OUT:
če ga uporabljaš nastavi ustrezno napetost.

Čim blizje napajalnim pinov prispajkaj 100 nF blokirni kondenzator.


AVR-ji omgoočajo, da po resetu ugotoviš vzrok reseta ( reset, watch dog, brown out..)


Lahko pa izkoristiš EEPROM za zapisovanje vrednosti. S tem, da imaš omejitev zapisovanja ( 100000 x).

Ali pa vrednost zapišeš v ram. Kot zanimivost povem, da se vrednost rama ob resetu ne resetira.
Recimo v ramu uporabiš 4 byte, v katere potem zapišeš isto vrednost. Nato pa ob resetu primerjaš vrednost in če je enaka, jo izpišeš, ce pa se razlikuje pa jo postaviš na nič in začneš od zacetka.

lp
KrEn

Avtor: gumby PrispevekObjavljeno: Pet Nov 29, 2013 4:44 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Za začetek se prepričaj, če se mega res resetira ali se kaj drugega zgodi. Pa vzrok reseta najdi (imaš register za to).

Avtor: linelKraj: prekmurje PrispevekObjavljeno: Pet Nov 29, 2013 6:58 pm    Naslov sporočila:  
----------------------------------------------------------------------------
watch dog ne uporabljam, brown out je bil sicer nastavljen na 2,7V potem sem ga popolnoma izključil. kondenzator 100nF sem prispajkal med pin Vcc in gnd. vendar nič ni bolje.

kako pa pogledam v register reseta? ( po datasheetu sem pogledal in je to register 0x000 ali?

program sem sicer napisal v bascomu.

Avtor: VladoKraj: Ljubljana PrispevekObjavljeno: Pet Nov 29, 2013 7:15 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Kaj pa stack, ali si ga definiral v programu ali pa velja privzeta vrednost?
Bilo bi lažje če bi pripel program in shemo.
Ali uporabljaš prekinitve?
Kako krmiliš displej?
Razlogov za to kar se dogaja je lahko več.
LP

Avtor: mucekKraj: Domzale PrispevekObjavljeno: Pet Nov 29, 2013 7:48 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Bolj kot berem, bolj se mi zdi, da si ti nekaj zašuštral v programu in ti stack zatava neznano kam ... (no, znano - na višja mesta, kjer so spremenljivke)

Prilepi glavni del kode (main), odkoder skačeš v podprograme, da vidimo ... Pa še javi, kolikokrat v programu uporabiš "Goto", "Gosub" in "Return".

LP, g

Avtor: linelKraj: prekmurje PrispevekObjavljeno: Pet Nov 29, 2013 7:54 pm    Naslov sporočila:  
----------------------------------------------------------------------------
krmiljenje displejev je z tranzistorji, to deluje vredu.
prilagam celoten program:

Koda:


$regfile = "m8def.dat"
$crystal = 12000000

Dim I As Word
Dim J As Byte
Dim K As Byte
Dim L As Byte
Dim S As String * 16


Config Portd = Output


Config Portb = Output
Config Debounce = 30

I = 0                                                       'začetna vrednost spremenljivke I
J = 0                                                       ' začetna vrednost spremenljivke J
Dim Eni1 As Word
Dim Des1 As Word
Dim Des As Word
Dim Eni As Word


Const Timer0reload = 54
Config Timer0 = Timer , Prescale = 1024
Load Timer0 , Timer0reload
On Ovf0 Timer0_isr
Enable Ovf0
Start Timer0
Enable Interrupts






'****************************** GLAVNI PROGRAM ****************************************************

Do
  Config Pinc.5 = Input
  If Pinc.5 = 1 Then
  I = 0
   J = 0
  End If

  Tipka1 Alias Pinc.0
  Tipka2 Alias Pinc.1
  Config Pinc.0 = Input
  Config Pinc.1 = Input
  Debounce Tipka1 , 1 , Dodaj
  Debounce Tipka2 , 1 , Dodaj
  Goto Preskok2
  Dodaj:
     If Pinc.0 = 1 Then
     Incr I
     End If
     If Pinc.1 = 1 Then
     Decr I
     End If

  Preskok2:

'*****************************
  Tipka3 Alias Pinc.2
  Tipka4 Alias Pinc.3
  Config Pinc.2 = Input
  Config Pinc.3 = Input
  Debounce Tipka3 , 1 , Dodaj1
  Debounce Tipka4 , 1 , Dodaj1
  Goto Preskok3
  Dodaj1:
     If Pinc.2 = 1 Then
     Incr J
     End If
     If Pinc.3 = 1 Then
     Decr J
     End If

  Preskok3:



Loop
'************************ PREKINITVENA RUTINA****************************************************


Timer0_isr:
Load Timer0 , Timer0reload





  Eni = I Mod 10
  Des = I Mod 100
  Des = Des / 10

  Eni1 = J Mod 10
  Des1 = J Mod 100
  Des1 = Des1 / 10

      Incr K
      If K > 3 Then K = 0
      Portd = Lookup(i , Stevilke)
      Portb = 0
      If K = 0 Then

         Set Portb.3

         Portd = Lookup(des1 , Stevilke)
      End If
      If K = 1 Then
         Set Portb.2
         Portd = Lookup(eni1 , Stevilke)
      End If

      If K = 2 Then
         Set Portb.1
         Portd = Lookup(des , Stevilke)
      End If

      If K = 3 Then
         Set Portb.0
         Portd = Lookup(eni , Stevilke)
      End If







Return


'***************************TABELA VREDNOSTI ŠTEVILK ZA SEGMENTE*****************************************



Stevilke:
'       0      1      2      3      4      5     6      7
Data &H3F , &H06 , &H5B , &H4F , &H66 , &H6D , &H7C , &H07 , &H7F , &H67

Avtor: mucekKraj: Domzale PrispevekObjavljeno: Pet Nov 29, 2013 8:01 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Ok, ne si več glave razbijat, problem je v programu ...
Daj mi 10 minut ... (in eno pivo potem ... Smile )

LP, g

Stran 1 od 3

Powered by phpBB © 2001,2002 phpBB Group