|
Svet elektronike Revija za prave elektronike
|
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
Boštjan Profesionalec
Pridružen/-a: Tor Mar 2004 22:48 Prispevkov: 100
|
Objavljeno: Tor Okt 11, 2011 8:16 pm Naslov sporočila: kakšna ideja |
|
|
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 |
|
|
Vlado Profesionalec
Pridružen/-a: Ned Jan 2004 16:11 Prispevkov: 556 Kraj: Ljubljana
|
Objavljeno: Sre Okt 12, 2011 1:09 pm Naslov sporočila: |
|
|
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 |
|
|
Boštjan Profesionalec
Pridružen/-a: Tor Mar 2004 22:48 Prispevkov: 100
|
Objavljeno: Sre Okt 12, 2011 4:55 pm Naslov sporočila: saj uporabljam |
|
|
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 |
|
|
Vlado Profesionalec
Pridružen/-a: Ned Jan 2004 16:11 Prispevkov: 556 Kraj: Ljubljana
|
Objavljeno: Sre Okt 12, 2011 5:40 pm Naslov sporočila: |
|
|
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 |
|
|
Boštjan Profesionalec
Pridružen/-a: Tor Mar 2004 22:48 Prispevkov: 100
|
Objavljeno: Sre Okt 12, 2011 8:09 pm Naslov sporočila: to je moj števec na lcd_ju |
|
|
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 |
|
|
Boštjan Profesionalec
Pridružen/-a: Tor Mar 2004 22:48 Prispevkov: 100
|
Objavljeno: Sre Okt 12, 2011 8:13 pm Naslov sporočila: to pa je multi plax |
|
|
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 |
|
|
Vlado Profesionalec
Pridružen/-a: Ned Jan 2004 16:11 Prispevkov: 556 Kraj: Ljubljana
|
Objavljeno: Sre Okt 12, 2011 8:23 pm Naslov sporočila: |
|
|
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 |
|
|
Boštjan Profesionalec
Pridružen/-a: Tor Mar 2004 22:48 Prispevkov: 100
|
Objavljeno: Čet Okt 13, 2011 7:07 pm Naslov sporočila: nizki obrati |
|
|
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 |
|
|
RudiP Profesionalec
Pridružen/-a: Sre Jul 2008 8:39 Prispevkov: 128 Kraj: KOPER
|
Objavljeno: Čet Okt 13, 2011 8:27 pm Naslov sporočila: |
|
|
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 |
|
|
Vlado Profesionalec
Pridružen/-a: Ned Jan 2004 16:11 Prispevkov: 556 Kraj: Ljubljana
|
Objavljeno: Čet Okt 13, 2011 8:36 pm Naslov sporočila: |
|
|
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 |
|
|
RudiP Profesionalec
Pridružen/-a: Sre Jul 2008 8:39 Prispevkov: 128 Kraj: KOPER
|
Objavljeno: Ned Okt 16, 2011 7:22 pm Naslov sporočila: |
|
|
Boštjan:
kateri namig si izbral ? _________________ Lep pozdrav ! |
|
Nazaj na vrh |
|
|
Vlado Profesionalec
Pridružen/-a: Ned Jan 2004 16:11 Prispevkov: 556 Kraj: Ljubljana
|
Objavljeno: Tor Okt 18, 2011 6:32 pm Naslov sporočila: |
|
|
Rudi,
zgleda da je Boštjan našel boljšo rešitev. |
|
Nazaj na vrh |
|
|
RudiP Profesionalec
Pridružen/-a: Sre Jul 2008 8:39 Prispevkov: 128 Kraj: KOPER
|
Objavljeno: Tor Okt 18, 2011 6:48 pm Naslov sporočila: |
|
|
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 |
|
|
Boštjan Profesionalec
Pridružen/-a: Tor Mar 2004 22:48 Prispevkov: 100
|
Objavljeno: Čet Okt 20, 2011 7:30 pm Naslov sporočila: Moj program |
|
|
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 |
|
|
Boštjan Profesionalec
Pridružen/-a: Tor Mar 2004 22:48 Prispevkov: 100
|
Objavljeno: Čet Okt 20, 2011 7:36 pm Naslov sporočila: aja , še to |
|
|
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 |
|
|
|
|
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
|