LCD, Single és sűrű mintavételezés megoldása (tekercselőgép)
Lenne egy kis problémám:
Adott egy 2x20 karakteres LCD kijelző, ami másodpercenként kb.10 alkalommal frissíti az adatokat (menetet számol).
- A problémám, hogy ha megszakítás éri kijelzés közben, akkor telefirkálja értelmetlen karakterekkel, ami elég zavaró.
Ha nem használnék megszakítást, akkor a kijelzés ideje miatt nem működhetne a bejövő impulzusok érzékelése, ami létfontosságú.
Van erre valamilyen megoldás?
Az már csak hab a tortán, hogy a "független" PWM kimenetet is megzavarja...
Adott egy 2x20 karakteres LCD kijelző, ami másodpercenként kb.10 alkalommal frissíti az adatokat (menetet számol).
- A problémám, hogy ha megszakítás éri kijelzés közben, akkor telefirkálja értelmetlen karakterekkel, ami elég zavaró.
Ha nem használnék megszakítást, akkor a kijelzés ideje miatt nem működhetne a bejövő impulzusok érzékelése, ami létfontosságú.
Van erre valamilyen megoldás?
Az már csak hab a tortán, hogy a "független" PWM kimenetet is megzavarja...
Ugyanez az áramkör már működött megszakítások nélkül, tehát a tervezési hiba kizárva. Az LCD kb 20mm-re van az ATMEGA32 (DIP tokos) lábaitól.
Hsználtam már 20-50FPS-el is hiba nélkül. A hiba ott kezdődik, amikor bekapcsolom a megszakítást
Majd bemásolok egy programrészletet, ha jó lesz otthon a NET.
Mi a különbség a HW és a SW PWM között (mármint programozásilag)?
Hsználtam már 20-50FPS-el is hiba nélkül. A hiba ott kezdődik, amikor bekapcsolom a megszakítást
Majd bemásolok egy programrészletet, ha jó lesz otthon a NET.
Mi a különbség a HW és a SW PWM között (mármint programozásilag)?
Szóval a forráskód valahogy így néz ki:
Minden működik, csak a kijelzést firkálja össze.
Dim Gombfel As Byte 'Nyomógomb változó
Dim Gomble As Byte
Dim Gombenter As Byte
Dim Gombesc As Byte
Dim Gombfelr As Byte
Dim Gombler As Byte
Dim Gombenterr As Byte
Dim Gombescr As Byte
Dim Anin As Word 'Analóg input
Dim Anins As Single 'Analóg input
Dim Anin1 As Byte
Dim Elotolas As Single
Dim Ch As Byte 'Aktuális ADC csatorna bekapcsolása
Dim Menetszamlalo As Long
Dim Menet2 As Single
Dim Menet As Long
Dim Str1 As String * 20
Dim Irany As Byte 'Léptetés iránya
Dim Bal As Byte 'bal végállás
Dim Balr As Byte 'bal végállás előző
Dim Jobb As Byte 'jobb végállás
Dim Jobbr As Byte 'jobb végállás előző
Dim Ford As Byte 'fordulat érzékelő
Dim Fordr As Byte 'fordulat előző
Dim Lepford As Word 'lépés/fordulat (200)
Dim Mmford As Single 'fordulatonkénti elmozdulás (1mm M6 menetes szárral)
Dim X As Single 'X irányú elmozdulás számlálása
Dim Xl As Single 'Léptető motor valós elmozdulás számlálása
Dim Xp As Single 'Az x-hez hozzáadandó érték
Dim Xs As Single
Dim Osztas As Word
Dim Lepes As Byte 'Aktuális lépésszám számontartása
Dim Pwmjel As Byte
Dim Kiirtim As Word
Dim Motorfelbontas As Word
Dim Menetemelkedes As Single 'A léptető motor egy fordulatára eső elmozdulás mm-ben
Dim Lepesarany As Single 'Léptetőmotor arányszám : menetemelkedés/Motorfelbontás
'************************************************************
Foprog: 'Főprogram
Ch = 0 'Analóg bemenetek beolvasása
Anin = Getadc(ch)
Waitms 50
' Gosub Beolv Ezt a megszakításnak kell meghívnia!!!
Xp = Elotolas / Osztas '0,15/8=0,01875mm eltolás impulzusonként
If Anin < 20 Then Pwmjel = 0
If Anin > 1000 Then Pwmjel = 255
If Anin >= 20 Then
If Anin <= 1000 Then 'PWM jel kiszámítása (0-255)
Anin1 = Anin - 20
Anins = Anin / 3.828125
Anin1 = Round(anins)
Pwmjel = Anin1
End If
End If
Ocr2 = Pwmjel 'PWM jel kitöltés beállítása
Gosub Gombok
' Gosub Kiir A kiírást is a timer aktiválja
'Waitus 100
If Kiirtim >= 1000 Then
Kiirtim = 0
Gosub Kiir
End If
Goto Foprog
'************************************************************
Beolv: 'Bemenetek beolvasása
Stop Timer1
Kiirtim = Kiirtim + 1
Bal = Pind.4
Jobb = Pind.5
Ford = Pind.6
If Bal <> Balr Then 'bal végállás érzékelés
Balr = Bal
If Bal = 0 Then 'csak a szenzor eltakarásakor jelez
Irany = 1
X = 0
Xl = 0 'A végállás mindig nullázza a számlálót
End If
End If
If Jobb <> Jobbr Then 'jobb végállás érzékelés
If Jobb = 0 Then
Jobbr = Jobb
Irany = 0
End If
End If
If Ford <> Fordr Then 'Fordulat impulzus érzékelés
Fordr = Ford
Menetszamlalo = Menetszamlalo + 1 'Minden állapotváltozásnál hozzá ad 1-et
If Irany = 0 Then X = X + Xp
If Irany = 1 Then X = X - Xp
End If
Timer1 = 65000
Start Timer1
Return
'***********************************************************
Kiir:
Menet2 = Menetszamlalo / Osztas 'Ez adja meg a pontos értéket (pl. 3,25)
Menet = Round(menet2)
Str1 = Str(menet)
Locate 1 , 1
Lcd "Menet:" ; Str1 ; " "
Locate 1 , 14
If Irany = 0 Then Lcd ">> " ; Str(anin) ; " "
If Irany = 1 Then Lcd "<< " ; Str(anin) ; " "
Locate 2 , 1
Lcd "El" ; Chr(5) ; "tol" ; Chr(0) ; "s:" ; Fusing(elotolas , "00.000");
Locate 2 , 15
Lcd "mm"
Return
Minden működik, csak a kijelzést firkálja össze.
Dim Gombfel As Byte 'Nyomógomb változó
Dim Gomble As Byte
Dim Gombenter As Byte
Dim Gombesc As Byte
Dim Gombfelr As Byte
Dim Gombler As Byte
Dim Gombenterr As Byte
Dim Gombescr As Byte
Dim Anin As Word 'Analóg input
Dim Anins As Single 'Analóg input
Dim Anin1 As Byte
Dim Elotolas As Single
Dim Ch As Byte 'Aktuális ADC csatorna bekapcsolása
Dim Menetszamlalo As Long
Dim Menet2 As Single
Dim Menet As Long
Dim Str1 As String * 20
Dim Irany As Byte 'Léptetés iránya
Dim Bal As Byte 'bal végállás
Dim Balr As Byte 'bal végállás előző
Dim Jobb As Byte 'jobb végállás
Dim Jobbr As Byte 'jobb végállás előző
Dim Ford As Byte 'fordulat érzékelő
Dim Fordr As Byte 'fordulat előző
Dim Lepford As Word 'lépés/fordulat (200)
Dim Mmford As Single 'fordulatonkénti elmozdulás (1mm M6 menetes szárral)
Dim X As Single 'X irányú elmozdulás számlálása
Dim Xl As Single 'Léptető motor valós elmozdulás számlálása
Dim Xp As Single 'Az x-hez hozzáadandó érték
Dim Xs As Single
Dim Osztas As Word
Dim Lepes As Byte 'Aktuális lépésszám számontartása
Dim Pwmjel As Byte
Dim Kiirtim As Word
Dim Motorfelbontas As Word
Dim Menetemelkedes As Single 'A léptető motor egy fordulatára eső elmozdulás mm-ben
Dim Lepesarany As Single 'Léptetőmotor arányszám : menetemelkedés/Motorfelbontás
'************************************************************
Foprog: 'Főprogram
Ch = 0 'Analóg bemenetek beolvasása
Anin = Getadc(ch)
Waitms 50
' Gosub Beolv Ezt a megszakításnak kell meghívnia!!!
Xp = Elotolas / Osztas '0,15/8=0,01875mm eltolás impulzusonként
If Anin < 20 Then Pwmjel = 0
If Anin > 1000 Then Pwmjel = 255
If Anin >= 20 Then
If Anin <= 1000 Then 'PWM jel kiszámítása (0-255)
Anin1 = Anin - 20
Anins = Anin / 3.828125
Anin1 = Round(anins)
Pwmjel = Anin1
End If
End If
Ocr2 = Pwmjel 'PWM jel kitöltés beállítása
Gosub Gombok
' Gosub Kiir A kiírást is a timer aktiválja
'Waitus 100
If Kiirtim >= 1000 Then
Kiirtim = 0
Gosub Kiir
End If
Goto Foprog
'************************************************************
Beolv: 'Bemenetek beolvasása
Stop Timer1
Kiirtim = Kiirtim + 1
Bal = Pind.4
Jobb = Pind.5
Ford = Pind.6
If Bal <> Balr Then 'bal végállás érzékelés
Balr = Bal
If Bal = 0 Then 'csak a szenzor eltakarásakor jelez
Irany = 1
X = 0
Xl = 0 'A végállás mindig nullázza a számlálót
End If
End If
If Jobb <> Jobbr Then 'jobb végállás érzékelés
If Jobb = 0 Then
Jobbr = Jobb
Irany = 0
End If
End If
If Ford <> Fordr Then 'Fordulat impulzus érzékelés
Fordr = Ford
Menetszamlalo = Menetszamlalo + 1 'Minden állapotváltozásnál hozzá ad 1-et
If Irany = 0 Then X = X + Xp
If Irany = 1 Then X = X - Xp
End If
Timer1 = 65000
Start Timer1
Return
'***********************************************************
Kiir:
Menet2 = Menetszamlalo / Osztas 'Ez adja meg a pontos értéket (pl. 3,25)
Menet = Round(menet2)
Str1 = Str(menet)
Locate 1 , 1
Lcd "Menet:" ; Str1 ; " "
Locate 1 , 14
If Irany = 0 Then Lcd ">> " ; Str(anin) ; " "
If Irany = 1 Then Lcd "<< " ; Str(anin) ; " "
Locate 2 , 1
Lcd "El" ; Chr(5) ; "tol" ; Chr(0) ; "s:" ; Fusing(elotolas , "00.000");
Locate 2 , 15
Lcd "mm"
Return
A hozzászólást 1 alkalommal szerkesztették, utoljára ACdrian 2010. június 22. kedd, 18:52-kor.
A config lemaradt:
Config Timer0 = Timer , Prescale = 64
Config Timer1 = Timer , Prescale = 1
Config Timer2 = Pwm , Prescale = 8 , Compare Pwm = Clear Down 'OC2 kimenet használata, 15625Hz, alacsonyról indul
'Pwm0a = xxx : Pwm0b = xxx
On Timer1 Beolv:
On Timer0 Leptet:
'On Ovf0 Kiir: 'Túlcsorduláskor a beolv-ra ugrik, így nem kési le a bemenő jelet
Enable Timer0
Enable Timer1
Enable Timer2
'Timer1 = 5000
'Start Timer0
Start Timer1
Start Timer2
Enable Interrupts
Config Watchdog = 2048 'reset 2048 mSec után, ha lefagyna
Config Adc = Single , Prescaler = Auto 'Analóg/DC átalakító beállítása
Start Adc
Config Timer0 = Timer , Prescale = 64
Config Timer1 = Timer , Prescale = 1
Config Timer2 = Pwm , Prescale = 8 , Compare Pwm = Clear Down 'OC2 kimenet használata, 15625Hz, alacsonyról indul
'Pwm0a = xxx : Pwm0b = xxx
On Timer1 Beolv:
On Timer0 Leptet:
'On Ovf0 Kiir: 'Túlcsorduláskor a beolv-ra ugrik, így nem kési le a bemenő jelet
Enable Timer0
Enable Timer1
Enable Timer2
'Timer1 = 5000
'Start Timer0
Start Timer1
Start Timer2
Enable Interrupts
Config Watchdog = 2048 'reset 2048 mSec után, ha lefagyna
Config Adc = Single , Prescaler = Auto 'Analóg/DC átalakító beállítása
Start Adc