megszakítások !! egy pici elakadás!
- albatrosz100
- Újonc

- Hozzászólások: 14
- Csatlakozott: 2010. november 18. csütörtök, 7:00
Sziasztok!
Egy kis segítségre lenne szükségem. Adott egy 6 csatornás RC vevő. Ennek minden csatornáján szabványos PWM jel jön ki a szervómotorok számára. Az egyik csatorna felfutó élének HIGH-on eltöltött idejét szeretném megmérni. Vagyis az impulzushosszúságot. Mega16-on Timer1-el ez már megy is, de mivel itthol soic8-ban csak attiny45-öm van, így át akarom írni a kódot TIMER0-ra és TIN0 megszakításra mert csak ez van neki ha jól olvastam.
A jelenlegi kódom:
Namásmost amig az adó ki van kapcsolva, addig Timer0 szépen nullán áll. De amint bekapcsolom tök véletlenszerű értéteket vesz fel. Látszólag semmit nem változtat ha tekergetem az adón a mért csatornához tartozó potit. A TIMER0 viszont nem csordul túl egyszer sem. Nem értem mi lehet a baj. Elvileg a TIMER0 felbontásába 8Mhz-en belefér a jel mérése nem?
Köszi előre is.
Egy kis segítségre lenne szükségem. Adott egy 6 csatornás RC vevő. Ennek minden csatornáján szabványos PWM jel jön ki a szervómotorok számára. Az egyik csatorna felfutó élének HIGH-on eltöltött idejét szeretném megmérni. Vagyis az impulzushosszúságot. Mega16-on Timer1-el ez már megy is, de mivel itthol soic8-ban csak attiny45-öm van, így át akarom írni a kódot TIMER0-ra és TIN0 megszakításra mert csak ez van neki ha jól olvastam.
A jelenlegi kódom:
Kód: Egész kijelölése
'======================================================
'System settings
'======================================================
'Definition for Mega 16
$regfile "m16def.dat"
'System frequency (8Mhz)
$crystal = 8000000
$baud = 9600
Config Timer0 = Timer , Prescale = 1024
Config Pina.0 = Output 'Világitáskapcsoló
Porta.0 = 1
Config Pina.4 = Output 'Timer0 túlcsordulás jelzése
Porta.4 = 1
Led Alias Porta.0
Led2 Alias Porta.4
Led2 = 1
Dim Wtime As Byte
Dim Timercounter As Word
Dim Jel As Bit
Stop Timer0
Timer0 = 0
Jel = 0
On Int0 Captmr
On Timer0 Ovf
Wtime = 200
Timercounter = 0
Config Int0 = Falling
Enable Interrupts
Enable Int0
Enable Timer0
Do
If Timer0 > 0 And Timer0 < 100 Then
Led = 1
End If
If Timer0 > 120 And Timer0 < 250 Then
Led = 0
End If
Waitms Wtime
Print "pwidth: " ; " " ; Timer0
Loop
Captmr:
If Jel = 0 Then
Jel = 1
Start Timer0
Config Int0 = Rising
Else
Jel = 0
Stop Timer0
Config Int0 = Falling
Timercounter = Timer0
Timer0 = 0
Start Timer0
End If
Return
Ovf:
Toggle Led2
Return
End
Köszi előre is.
Tipp:
Kód: Egész kijelölése
config timer0=
dim t0ovf as byte
on timer0 ovf0
enable timer0
enable interrupts
do
.
.
if most_van =1 then
stop timer0
valosido=t0ovf*256
valosido=valosido+timer0
timer0=0
start timer0
endif
.
.
.
loop
ovf0:
incr t0ovf
return
Itt az én verzióm:
Kód: Egész kijelölése
$regfile = "attiny2313.dat"
$crystal = 4000000
$hwstack = 32
$swstack = 10
$framesize = 40
Dim Ch As Word
Config Portd.4 = Input
Config Portb.0 = Output
Waitms 100
Do
Pulsein Ch , Pind , 4 , 1
If Ch < 145 Then Reset Portb.0
If Ch > 155 Then Set Portb.0
Waitms 1
Loop
End
A Pulsein lehet egyszerűbb 
10usec pontossággal mér, max 655.35 ms időt...
http://avrhelp.mcselec.com/pulsein.htm
A BitWaittal az elején meg lehet várni a fel/lefutó élet:). Ez _túl egyszerű_. Nem lehetne kicsit élvezni a problémát?:)
Viszont a leírás azt írja, hogy kvarcfüggő a mérhető idő. Azaz lehet ha precíz szám kelll, akkor kalibrálni kell.
10usec pontossággal mér, max 655.35 ms időt...
http://avrhelp.mcselec.com/pulsein.htm
A BitWaittal az elején meg lehet várni a fel/lefutó élet:). Ez _túl egyszerű_. Nem lehetne kicsit élvezni a problémát?:)
Viszont a leírás azt írja, hogy kvarcfüggő a mérhető idő. Azaz lehet ha precíz szám kelll, akkor kalibrálni kell.
Erre is van egyszerű megoldás de jó felbontáshoz kell a 16Mega kristály, ez akkor jó mikor a programban nem szabad egy us sem várni.
$crystal = 16000000
Config Timer0 = Timer , Prescale = 256
Config Int0 = Change
On Timer0 Detectnorx1
On Int0 Ch1
Enable Interrupts
Enable Int0
Enable Timer0
Start Timer0
Dim Ch1v As Byte,, Ch1i As Integer
Do
If Ch1v > 61 And Ch1v < 139 Then
Ch1i = Ch1v - 100 '+-37
End If
'Ide kel tenni hogy a kapott +-37 értéket mire akarod felhasznalni.
Loop
End
Ch1:
If Pind.2 = 1 Then Timer0 = 0
If Pind.2 = 0 Then Ch1v = Timer0
Return
Detectnorx1:
Return
$crystal = 16000000
Config Timer0 = Timer , Prescale = 256
Config Int0 = Change
On Timer0 Detectnorx1
On Int0 Ch1
Enable Interrupts
Enable Int0
Enable Timer0
Start Timer0
Dim Ch1v As Byte,, Ch1i As Integer
Do
If Ch1v > 61 And Ch1v < 139 Then
Ch1i = Ch1v - 100 '+-37
End If
'Ide kel tenni hogy a kapott +-37 értéket mire akarod felhasznalni.
Loop
End
Ch1:
If Pind.2 = 1 Then Timer0 = 0
If Pind.2 = 0 Then Ch1v = Timer0
Return
Detectnorx1:
Return
Köszi!! A PULSEIN-el tényleg egyszerű volt. Jó, hogy a szemem nem verte ki 
Kód: Egész kijelölése
'======================================================
'RC kapcsoló megvalósítása az RX egyik csatornájának
'PWM kitöltési tényező mérésével
'======================================================
$regfile "attiny45.dat"
$crystal = 8000000
Config Pinb.3 = Output 'Világitáskapcsoló
Led Alias Portb.3
Portb.3 = 1
Dim W As Word
Do
Pulsein W , Pinb , 4 , 0 '0-1 átmenet detektálása
Bitwait Portb.4 , Reset 'stopper megállít 1-0 átmenetre
If W < 1780 And W > 1725 Then 'feltétel vizsgálat
Reset Led
End If
If W < 1725 And W > 1676 Then
Set Led
End If
Waitms 150 'egy kis lassítás (ráérünk)
Loop
End 'end programRe: megszakítások !! egy pici elakadás!
Szép délutánt.
Megakadtam a megszakításokkal. Azt szeretném ha a zöld led villogna ha a gomb nincs működtetve, ha a gombot működtetjük a zöld led aludjon ki és egy piros led villogjon. Ehelyett ha a gombot működtetem akkor van hogy egyszerre világít a zöld és a piros led ez nagyon gyakori ritkább az amikor csak a piros led világít. Azonban egyik esetben sem villog a piros led. Az ic egy atmega328 külső kvarc nélkül. Utána olvastam de sehogy sem jövök rá mi lehet a gond.
A programom:
Megakadtam a megszakításokkal. Azt szeretném ha a zöld led villogna ha a gomb nincs működtetve, ha a gombot működtetjük a zöld led aludjon ki és egy piros led villogjon. Ehelyett ha a gombot működtetem akkor van hogy egyszerre világít a zöld és a piros led ez nagyon gyakori ritkább az amikor csak a piros led világít. Azonban egyik esetben sem villog a piros led. Az ic egy atmega328 külső kvarc nélkül. Utána olvastam de sehogy sem jövök rá mi lehet a gond.
A programom:
Kód: Egész kijelölése
$regfile = "m328pdef.dat"
$crystal = 1000000
Config Pind.6 = Output 'piros led
Config Pind.2 = Input 'gomb
Config Portb.1 = Output 'zöld led
Config Int0 = Low Level
On Int0 Gombnyomva
Enable Interrupts
Enable Int0
Do 'zöld led 100 ms-os villogása alapesetben ha a gomb nincs működtetve
Set Portb.1
Waitms 100
Reset Portb.1
Waitms 100
Loop
Gombnyomva: 'piros led 40 ms-os villogása ha a gomb működtetve van
Set Portd.6
Waitms 40
Reset Portd.6
Return
EndRe: megszakítások !! egy pici elakadás!
Mondjuk mars vissza olvasni:
- INTben nincs várakozás.
- amit nem kell INT-ben futtatni, az mehet a főprogramba.
if gombnyomva then pirosvillog else zoldvillog
Ez miért nem jó?
- INTben nincs várakozás.
- amit nem kell INT-ben futtatni, az mehet a főprogramba.
if gombnyomva then pirosvillog else zoldvillog
Ez miért nem jó?
Re: megszakítások !! egy pici elakadás!
Üdv!
If szerkezettel megy csak jelen helyzetben a megszakításokat próbálom életre kelteni.
INT-ben lévő waitms 1 -re átírtam és így már működik, most már megjegyzem hogy maradj rövid.
INT0 és INT1 -et tudom kezelni megszakításként de mi a teendő ha valamely PCINT lábat akarom felhasználni?
C5 láb adatlapi neve PCINT13. Ha viszont ezt írom engedélyezésre kiírja hogy ilyen megszakítás nincsen.
If szerkezettel megy csak jelen helyzetben a megszakításokat próbálom életre kelteni.
INT-ben lévő waitms 1 -re átírtam és így már működik, most már megjegyzem hogy maradj rövid.
INT0 és INT1 -et tudom kezelni megszakításként de mi a teendő ha valamely PCINT lábat akarom felhasználni?
C5 láb adatlapi neve PCINT13. Ha viszont ezt írom engedélyezésre kiírja hogy ilyen megszakítás nincsen.
Kód: Egész kijelölése
$regfile = "m328pdef.dat"
$crystal = 1000000
Config Pind.3 = Output 'piros led
Config Pinc.5 = Input 'gomb
Config Portb.1 = Output 'zöld led
Config Int0 = Low Level
On Pcint0 Gombnyomva
Enable Interrupts
Enable Pcint0
Do 'zöld led 100 ms-os villogása alapesetben ha a gomb nincs működtetve
Set Portb.1
Waitms 100
Reset Portb.1
Waitms 100
Loop
Gombnyomva: 'piros led 1 ms-os fellvillanása ha a gomb működtetve volt
Set Portd.3
Waitms 1
Reset Portd.3
Return
End