Kazalo po Svet elektronike forumu Svet elektronike
Revija za prave elektronike
 
AlbumAlbum   Pomoč pogostih vprašanjPomoč pogostih vprašanj   IščiIšči   Seznam članovSeznam članov   Skupine uporabnikovSkupine uporabnikov   Registriraj seRegistriraj se 
 Tvoj profilTvoj profil   Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil   PrijavaPrijava 

kakšna ideja

 
Objavi novo temo   Odgovori na to temo    Kazalo po Svet elektronike forumu -> Digitalna elektronika
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
Boštjan
Profesionalec


Pridružen/-a: Tor Mar 2004 22:48
Prispevkov: 100

PrispevekObjavljeno: Tor Okt 11, 2011 8:16 pm    Naslov sporočila: kakšna ideja Odgovori s citatom

Zanima me kako bi rešil naslednjo situacijo. Izdelal sem obratomer. In sicer tako da z timerjem0 štejem impulze na vhodu. Z timerjem1 pa te impulze vsaki sekundo pogledam in pomnožim z 60 , tako dobim obr/min.
Prikaz imam na lcd_ju. Sedaj pa bi vse skupaj še rad prikazal na LED display. Ampak za multiplex potrebujem še en timer. Kako se izogniti enemu timerju. Procesor mega8515.

LP Boštjan
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Vlado
Profesionalec


Pridružen/-a: Ned Jan 2004 16:11
Prispevkov: 556
Kraj: Ljubljana

PrispevekObjavljeno: Sre Okt 12, 2011 1:09 pm    Naslov sporočila: Odgovori s citatom

Zakaj pa pulze ne šteješ z INT0/INT1, boš imel en prost timer.
Drugače pa poglej temo pod to (Charliplexing), na koncu je Jure podal naslov kjer je opisano kako z nekaj pini krmiliti več displejev (brez multiplexa).
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Boštjan
Profesionalec


Pridružen/-a: Tor Mar 2004 22:48
Prispevkov: 100

PrispevekObjavljeno: Sre Okt 12, 2011 4:55 pm    Naslov sporočila: saj uporabljam Odgovori s citatom

Za branje pulzov uporabljam INT0, TIMER1 pa uporabljam za generiranje 1 sekunde. Tako da mi zmanjka timerjev. Potreboval bi torej multiplex kjer ne uporabiš timerja, samo če se ne motim ti potem lahko utripajo številke.
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Vlado
Profesionalec


Pridružen/-a: Ned Jan 2004 16:11
Prispevkov: 556
Kraj: Ljubljana

PrispevekObjavljeno: Sre Okt 12, 2011 5:40 pm    Naslov sporočila: Odgovori s citatom

Citiram:
Za branje pulzov uporabljam INT0, TIMER1 pa uporabljam za generiranje 1 sekunde.


Zakaj pa uporabljaš timer0?
V prvem postu si napisal da za štetje impulzov uporabljaš timer0, zdaj pa da pulze seštevaš z INT0.
Zakaj pa sploh rabiš multipleks, ali ti ne ostanejo fraj še trije porti na procesorju za neposreden prikaz, vsak displej na en port, neboš prikazoval enice obratov, dovolj so ti tudi dva LED displeja (tisočice in stotice, tudi desetic ne rabiš, drugače bo vse preveč migetalo).
Pripni svojo kodo, mogoče bomo lažje svetovali.

LP
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Boštjan
Profesionalec


Pridružen/-a: Tor Mar 2004 22:48
Prispevkov: 100

PrispevekObjavljeno: Sre Okt 12, 2011 8:09 pm    Naslov sporočila: to je moj števec na lcd_ju Odgovori s citatom

coda:

'program zajema impulze na PINB.0 2 sekundi in nato preračuna st. impulzov v obr./min.

Dim Vrednost As Word
Dim Vrednost_1 As Word

Const Timer1reload = 31250
Config Timer1 = Timer , Prescale = 64
Load Timer1 , Timer1reload
On Ovf1 Timer1_isr
Enable Timer1
Start Timer1
Enable Interrupts
Config Porta = Output
Config Timer0 = Counter , Edge = Rising 'timer0 dela kot števec/counter
Config Lcd = 20 * 2
Cursor Off 'izklopim kurzor na LCD_ju
Cls
Porta = 0
Tcnt0 = 0

Do
Loop

End

Timer1_isr:
Load Timer1 , Timer1reload
Toggle Porta.0
Cls
Locate 1 , 1
Lcd Tcnt0
Vrednost = Tcnt0 * 15
Locate 2 , 1
Lcd Vrednost
Tcnt0 = 0 'izpisi vrednost TCNT0


Return

' Razlaga vrednosti timerja
' Timer1 je 16bitni timer, preliv se zato zgodi ko doseže vrednost 65536.
' AVR Mega8515 teče na frekvenci 1000000Hz, delilnik(prescaler) je 64
' vsak cikl se izvede: 0,064 ms - (1 / CPUSpeed in KHz ) * Prescaler
' Timer potrebuje 15625 ciklov, da doseže zahtevan čas 1 sekunde ( 15625 * 0,064 = 1000ms)
' Začetno vrednost timerja1 moramo postavit na vrednost 49911 tako,
' da bomo dosegli preliv 65536 po 15625 ciklih
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Boštjan
Profesionalec


Pridružen/-a: Tor Mar 2004 22:48
Prispevkov: 100

PrispevekObjavljeno: Sre Okt 12, 2011 8:13 pm    Naslov sporočila: to pa je multi plax Odgovori s citatom

koda:



Config Timer0 = Timer , Prescale = 64
Const Timerhitrost = 250
On Timer0 Test
Enable Timer0
Enable Interrupts



Dim A As Byte 'za preklop med števili 1-4
Dim Stevec As Word
Dim Enice As Word
Dim Desetice As Word
Dim Stotice As Word
Dim Tisocice As Word
Dim Pomozna_v As Word
Dim Pomozna_v2 As Word
Dim Pomozna_v3 As Word
Dim Led1 As Byte 'enice
Dim Led2 As Byte 'desetice
Dim Led3 As Byte 'stotice
Dim Led4 As Byte 'tisocice


Config Porta = Output 'števila
Config Portc = Output
Config Portb = Output
Config Portd = Output


Stevec = 0 'vklop segmenta
A = 0
'-------------------------------------------------------------------------------
'GLAVNI PROGRAM
Main:
Do
Incr Stevec
If Stevec = 9999 Then
Stevec = 0

End If
Waitms 20
Gosub Leddisplay

Loop


End

'-------------------------------------------------------------------------------
Leddisplay:

Tisocice = Stevec / 1000 'tisocica
Pomozna_v = Tisocice * 1000 'pomozna za izracun stotic

Pomozna_v3 = Stevec - Pomozna_v
Led4 = Lookup(tisocice , Segmente)
Stotice = Pomozna_v3 / 100
Led3 = Lookup(stotice , Segmente)
Pomozna_v2 = Stotice * 100

Pomozna_v = Pomozna_v3 - Pomozna_v2

Desetice = Pomozna_v / 10
Led2 = Lookup(desetice , Segmente)
Pomozna_v3 = Desetice * 10
Enice = Pomozna_v - Pomozna_v3
Led1 = Lookup(enice , Segmente)

Return
'-------------------------------------------------------------------------------



Segmente:
Data 192 , 237 , 112 , 97 , 77 , 67 , 66 , 229 , 64 , 65

'-------------------------------------------------------------------------------

Test:

Timer0 = Timerhitrost

Incr A
If A = 5 Then A = 1

If A = 1 Then
Portd = &B01101000
Porta = Led1
End If

If A = 2 Then
Portd = &B00111000
Porta = Led2
End If

If A = 3 Then
Portd = &B01011000
Porta = Led3
End If

If A = 4 Then
Portd = &B01110000
Porta = Led4
End If

Return
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Vlado
Profesionalec


Pridružen/-a: Ned Jan 2004 16:11
Prispevkov: 556
Kraj: Ljubljana

PrispevekObjavljeno: Sre Okt 12, 2011 8:23 pm    Naslov sporočila: Odgovori s citatom

Bštjan,
če delaš obratomer ne rabiš enic in desetic, drugače ti bo LED displej preveč migetal. Dva displeja lahko priklopiš tudi direkt na porte ki so fraj.

Za štetje lahko uporabiš namesto timer0 INT0 prekinitev in če vztrajaš boš imel timer0 za multipleks.
Še nekaj, prekinitvena rutina mora vedno biti čim krajša, iz tovje Timer1_isr rutine odstrani prikaz na LCD in to počni v glavni zanki. V tej rutini samo postavi vrednost timerja in resetiraj števec pulzov, vse ostalo moraš delati v glavni zanki.
Povej zakaj ti ne zadustujeta dva LED displeja?
LP
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Boštjan
Profesionalec


Pridružen/-a: Tor Mar 2004 22:48
Prispevkov: 100

PrispevekObjavljeno: Čet Okt 13, 2011 7:07 pm    Naslov sporočila: nizki obrati Odgovori s citatom

potrebujem jih zato ker merim obrate na enem velikem svedru za asfalt vrtat in se vrti zelo počasi cca. 60 obr./min. drugače za info na en obrat dobim 4 impulze. Zanimama me nekaj kako misliš da bi uporabil prekinitev INT0 ali ni to del timerja0.
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
RudiP
Profesionalec


Pridružen/-a: Sre Jul 2008 8:39
Prispevkov: 128
Kraj: KOPER

PrispevekObjavljeno: Čet Okt 13, 2011 8:27 pm    Naslov sporočila: Odgovori s citatom

Delaš precej stvari narobe. Prva napaka je, da delaš en kup opravil v interrupt rutinah. V teh rutinah se postavi zastavice opravila pa se , glede na postavljene zastavice, izvajajo v glavni zanki Do Loop. Pravtako je neprimerna uporaba wait ukazov . Primer kako bi to jast rešil:

Koda:

'*******************************************************************************

$regfile = "M128def.dat"                ' NAKLJUČNO IZBRAN IN NAPISAN
$crystal = 16000000                     ' NAKLJUČNO IZBRAN IN NAPISAN
'$hwstack = 60                           '180
'$swstack = 160                          '160
'$framesize = 220                        '190
'$xramstart = &H0261
Dim S_1s As Word
Dim S_10s As Word
Dim S_1ms As Word
Dim Stevec_obratov As Word
Dim Stevec_obratov_m As Word
Dim Stevec_sekund As Byte
Dim 10_sek_f As Bit
Dim Sek_f As Bit

Config Pinb.1 = Input                   ' NAKLJUČNO IZBRAN IN NAPISAN PIN POPRAVI ZATE
Inpulz Alias Portb.1

Const Timer0reload = 250
Config Timer0 = Timer , Prescale = 64
Enable Timer0
On Ovf0 Tim0_isr


Config Int0 = Falling                   ' NAKLJUČNO IZBRAN IN NAPISAN PIN POPRAVI ZATE
Enable Int0
On Int0 Process_irq

'******************************************************************************'
 Do
     If Sek_f = 1 Then                  'VSAKO SEKUNDO POKAŽE ČAS
        Reset Sek_f
        Locate 1 , 1
        Lcd Stevec_obratov_m
     End If

 Loop
'*********************** LOOP NET **********************************************

Tim0_isr:                               ' SE IZVEDE VSAKO MILISEKUNDO  IN NE VPLIVA NA GLAVNI PROGRAM

    Load Timer0 , Timer0reload
    Incr S_1s
    Incr S_10s

    If S_10s = 10000 Then
       S_10s = 0
       Stevec_obratov_m = Stevec_obratov
       Stevec_obratov = 0
       Set 10_sek_f
    End If

    If S_1ms = 1000 Then
       S_1ms = 0
       Set Sek_f
    End If


Return
'*******************************************************************************

Process_irq:
    Incr Stevec_obratov

Return

'*******************************************************************************

End                                     'end program

_________________
Lep pozdrav !


Nazadnje urejal/a RudiP Pet Okt 14, 2011 6:45 am; skupaj popravljeno 1 krat
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Vlado
Profesionalec


Pridružen/-a: Ned Jan 2004 16:11
Prispevkov: 556
Kraj: Ljubljana

PrispevekObjavljeno: Čet Okt 13, 2011 8:36 pm    Naslov sporočila: Odgovori s citatom

Boštjan,
če imaš tako majhno število obratov potem ne potrebuješ stotic in tisočic, kaj ne.
Če je število obratov tako majhno potem moraš obrate meriti dalj časa (10 sekund), drugače bo meritev zelo nenatančna, ali pa meriti periodo enega obrata kar je bolj natančno. Če boš meril čas za koliko se zavrti mašina za en obrat imel boš zelo natančen rezultat, meritev pa bo trajala krajši čas.

LP
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
RudiP
Profesionalec


Pridružen/-a: Sre Jul 2008 8:39
Prispevkov: 128
Kraj: KOPER

PrispevekObjavljeno: Ned Okt 16, 2011 7:22 pm    Naslov sporočila: Odgovori s citatom

Boštjan:


kateri namig si izbral ?

_________________
Lep pozdrav !
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Vlado
Profesionalec


Pridružen/-a: Ned Jan 2004 16:11
Prispevkov: 556
Kraj: Ljubljana

PrispevekObjavljeno: Tor Okt 18, 2011 6:32 pm    Naslov sporočila: Odgovori s citatom

Rudi,
zgleda da je Boštjan našel boljšo rešitev.
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
RudiP
Profesionalec


Pridružen/-a: Sre Jul 2008 8:39
Prispevkov: 128
Kraj: KOPER

PrispevekObjavljeno: Tor Okt 18, 2011 6:48 pm    Naslov sporočila: Odgovori s citatom

Vlado je napisal/a:
Rudi,
zgleda da je Boštjan našel boljšo rešitev.


Ali pa je omagal ?

_________________
Lep pozdrav !
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Boštjan
Profesionalec


Pridružen/-a: Tor Mar 2004 22:48
Prispevkov: 100

PrispevekObjavljeno: Čet Okt 20, 2011 7:30 pm    Naslov sporočila: Moj program Odgovori s citatom

Lepo pozdravljeni, nisem še omagal. To je moj program , ki deluje odlično, LED display ne utripa popolnoma nič. Tudi obrati so presenetljivo točni.
Prosim za pripombe na program , ker se lahko samo tako izboljšaš, jaz se navadno največ naučim na napakah.

Lep pozdrav
Boštjan

KODA:
Dim A As Byte 'za preklop med števili 1-4
Dim Stevec As Word
Dim Enice As Word
Dim Desetice As Word
Dim Stotice As Word
Dim Tisocice As Word
Dim Pomozna_v As Word
Dim Pomozna_v2 As Word
Dim Pomozna_v3 As Word
Dim Led1 As Byte 'enice
Dim Led2 As Byte 'desetice
Dim Led3 As Byte 'stotice
Dim Led4 As Byte 'tisocice
Dim Vrednost As Word
Dim Vrednost_1 As Word

Config Porta = Output 'števila
Config Portc = Output
Config Portd = Output

Const Timer1reload = 15625
Config Timer1 = Timer , Prescale = 64
Load Timer1 , Timer1reload
On Ovf1 Timer1_isr
Enable Timer1
Start Timer1
Enable Interrupts


Config Timer0 = Counter , Edge = Rising 'timer0 dela kot števec/counter


Stevec = 0 'vklop segmenta
A = 0
Tcnt0 = 0


'-------------------------------------------------------------------------------
'GLAVNI PROGRAM

Main:
Do
Gosub Leddisplay
Gosub Test
Loop


End

'-------------------------------------------------------------------------------
Leddisplay:

Tisocice = Stevec / 1000 'tisocica
Pomozna_v = Tisocice * 1000 'pomozna za izracun stotic

Pomozna_v3 = Stevec - Pomozna_v
Led4 = Lookup(tisocice , Segmente)
Stotice = Pomozna_v3 / 100
Led3 = Lookup(stotice , Segmente)
Pomozna_v2 = Stotice * 100

Pomozna_v = Pomozna_v3 - Pomozna_v2

Desetice = Pomozna_v / 10
Led2 = Lookup(desetice , Segmente)
Pomozna_v3 = Desetice * 10
Enice = Pomozna_v - Pomozna_v3
Led1 = Lookup(enice , Segmente)

Return
'-------------------------------------------------------------------------------


Segmente:
Data 192 , 237 , 112 , 97 , 77 , 67 , 66 , 229 , 64 , 65

'-------------------------------------------------------------------------------

Test:

Incr A
If A = 5 Then A = 1

If A = 1 Then
Portd = &B01101000
Porta = Led1
End If

If A = 2 Then
Portd = &B00111000
Porta = Led2
End If

If A = 3 Then
Portd = &B01011000
Porta = Led3
End If

If A = 4 Then
Portd = &B01110000
Porta = Led4
End If

Return

'-------------------------------------------------------------------------------
Timer1_isr:
Load Timer1 , Timer1reload
Vrednost = Tcnt0 * 15
Stevec = Vrednost
Tcnt0 = 0 'izpisi vrednost TCNT0
Return
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Boštjan
Profesionalec


Pridružen/-a: Tor Mar 2004 22:48
Prispevkov: 100

PrispevekObjavljeno: Čet Okt 20, 2011 7:36 pm    Naslov sporočila: aja , še to Odgovori s citatom

Na vsak obrat , dobim 4 impulze iz induktivnega stikala. Tako pri meritvi ki traja 1 sekundo dobimo merilno območje od 15 pa približno do 3800, kar mi popolnoma odgovarja.

LP Boštjan.
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo    Kazalo po Svet elektronike forumu -> Digitalna elektronika Časovni pas GMT + 1 ura, srednjeevropski - zimski čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
You cannot attach files in this forum
You cannot download files in this forum


Powered by phpBB © 2001, 2005 phpBB Group