RC spínač v Bascomu

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
denny_ul
Příspěvky: 30
Registrován: 14 zář 2015, 02:00
Bydliště: Ústí n.L.

RC spínač v Bascomu

#1 Příspěvek od denny_ul »

Mohl by někdo, kdo programuje Atmely v bascomu a programoval někdy RC spínač, napsat sem jak by vypadal program, který by se choval takto:

pokud by na určitém vstupu ATTINY byl impuls >1,3ms bude aktivní určitý výstup

pokud bude impuls >1,7ms budou aktivní dva výstupy

chtěl bych z toho pochopit jak se měří ta šířka toho impulsu

předem dík všem dobrým duším za jakoukoliv radu :)

Uživatelský avatar
ujosvec
Příspěvky: 283
Registrován: 07 srp 2008, 02:00

#2 Příspěvek od ujosvec »

Dell INSPIRON N7110-Intel i7-2630QM-8G RAM-GT525M/1G-SSD-256G-Win8-64bit

hakamusai
Příspěvky: 943
Registrován: 17 dub 2007, 02:00

#3 Příspěvek od hakamusai »

šířku impulzu lze měřit za pomocí Timeru.Při náběžný hraně se spustí Timer , při sestupný se Timer zastaví a přečte hodnota.Je potřeba správně Timer inicializovat.

Uživatelský avatar
denny_ul
Příspěvky: 30
Registrován: 14 zář 2015, 02:00
Bydliště: Ústí n.L.

#4 Příspěvek od denny_ul »

Dík, netušil jsem že by to mohlo být až tak jednoduché, hned jak budu moc tak to vyzkouším :o

Uživatelský avatar
mtajovsky
Příspěvky: 3694
Registrován: 19 zář 2007, 02:00
Bydliště: Praha

#5 Příspěvek od mtajovsky »

Jednoduché, ale ne moc dokonalé. Pokud bude ten puls velmi dlouhý, třeba až nekonečný, bude platit podmínka t>1.7 ms, ale oba dva výstupy nebudou aktivní. Pulsein neskončí a nic se nevyhodnotí.

Uživatelský avatar
denny_ul
Příspěvky: 30
Registrován: 14 zář 2015, 02:00
Bydliště: Ústí n.L.

#6 Příspěvek od denny_ul »

mtajovsky píše:... Pokud bude ten puls velmi dlouhý ... Pulsein neskončí a nic se nevyhodnotí.
Co je to "velmi dlouhý"? Ten puls by měl mít šířku 1 - 2ms s opakováním po 20ms.
hakamusai píše:šířku impulzu lze měřit za pomocí Timeru a náběžný/sestupný hrany ...
tohle bude asi o dost složitější, mohl by někdo poradit jak by to vypadalo?

Uživatelský avatar
mtajovsky
Příspěvky: 3694
Registrován: 19 zář 2007, 02:00
Bydliště: Praha

#7 Příspěvek od mtajovsky »

denny_ul píše:
mtajovsky píše:... Pokud bude ten puls velmi dlouhý ... Pulsein neskončí a nic se nevyhodnotí.
Co je to "velmi dlouhý"?
V zadání úlohy není nic o omezení délky pulsu. Dokud puls neskončí, nic se nebude dít, takže puls > 1,7 ms je taky puls - 1 minuta, třeba. Jenže po té 1,7 ms se nic nenastaví, bude se čekat celou minutu. Toť k algoritmu. V případě Pulsein je maximální vrácená hodnota 65535 x 10 µs defaultně, timeout i časová jednotka se dají nastavit, nicméně zadání není splněno.

Uživatelský avatar
denny_ul
Příspěvky: 30
Registrován: 14 zář 2015, 02:00
Bydliště: Ústí n.L.

#8 Příspěvek od denny_ul »

Ten puls vypadá takto v závislosti na poloze kniplu vysílače
Přílohy
pwm[1].jpg
(19.15 KiB) Staženo 68 x
Naposledy upravil(a) denny_ul dne 16 zář 2015, 09:28, celkem upraveno 1 x.

Uživatelský avatar
jova1
Příspěvky: 1207
Registrován: 20 pro 2007, 01:00
Bydliště: Chýnov - to je kousek od Tábora
Kontaktovat uživatele:

#9 Příspěvek od jova1 »

Pokud by jsi netrval na tom Atmelu a bascomu, dalo by se to vyřešit jednoduše pomocí PICAXE. Má na to přímo dělané příkazy.
Já sem v něm děla ovládání fotoaparátu CANON: http://www.rcmania.cz/viewtopic.php?f=4 ... n#p1127296
Více najdeš zde: http://www.picaxe.cz/wp-content/uploads ... ry-RCR.pdf
Od strany 14.

Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 01:00

#10 Příspěvek od AB1 »

Zkus

Kód: Vybrat vše

Dim Time1 As Word
Dim Time2 As Word
Dim Krok As Long
Dim Sirka_pulsu As Long

   Config Timer1 = Timer , Prescale = 1

   Config Pinb.0 = Input

   Krok = 1000000000 / _xtal            '1 krok čítače [nanosec]

   Bitwait Pinb.0 , Reset

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

Do
   Bitwait Pinb.0 , Set                 'čekej na úroveň "1"
   Time1 = Tcnt1                        'zapiš stav čítače
   Bitwait Pinb.0 , Reset               'čekej na úroveň "0"
   Time2 = Tcnt1                        'zapiš stav čítače

   Sirka_pulsu = Time2 - Time1          'kroků čítače
   Sirka_pulsu = Sirka_pulsu * Krok     '[nanosec]
   Sirka_pulsu = Sirka_pulsu / 1000     '[microsec]

   Print Sirka_pulsu

Loop

End

Uživatelský avatar
denny_ul
Příspěvky: 30
Registrován: 14 zář 2015, 02:00
Bydliště: Ústí n.L.

#11 Příspěvek od denny_ul »

Tak jsem vyzkoušel tento program v mé konstrukci (vstup-PB0, výstupy PB3 a PB4) a nějak to nechce fungovat.

Kód: Vybrat vše

$regfile = "attiny13a.dat"
$crystal = 9600000
$hwstack = 16
$swstack = 8
$framesize = 24

Config Portb.0 = Input
Config Portb.3 = Output
Config Portb.4 = Output
Dim W As Word
Do
Pulsein W , Pinb , 0 , 1

If W > 170 And W <= 200 Then
Portb.3 = 1
Else
Portb.3 = 0
End If
If W <= 130 And W > 100 Then
Portb.4 = 1
Else
Portb.4 = 0
End If
Loop
End
poradí někdo co s tím, nebo jak by to vypadalo s měřením té náběžné/sestupné hrany?

Uživatelský avatar
mtajovsky
Příspěvky: 3694
Registrován: 19 zář 2007, 02:00
Bydliště: Praha

#12 Příspěvek od mtajovsky »

Action
Returns the number of units between two occurrences of an edge of a pulse.

PULSEIN var , PINX , PIN , STATE

STATE: May be 0 or 1.
0 means sample 0 to 1 transition.
1 means sample 1 to 0 transition.

Kód: Vybrat vše

Pulsein W , Pinb , 0 , 1
bude měřit dobu mezi dvěma přechody z log. 1 do log 0. To bude podle obrázku zadání 10-22 ms, což při defaultní granularitě 10 µs dává číslo 1000 - 2200 do proměnné W.

Je ale třeba měřit dobu mezi přechody 0->1 a 1->0, což PULSEIN podle popisu nedělá. Zkus kód s měřením způsobem jak to naznačil AB1. Ten bych ještě doplnil před smyčkou úvodním čekáním na úroveň 0 pro případ, že by se program spustil v okamžiku, kdy je signál v úrovni 1.

Uživatelský avatar
Ruprecht
Příspěvky: 1114
Registrován: 28 zář 2005, 02:00
Bydliště: ZČ + JM

#13 Příspěvek od Ruprecht »

of an edge
Měří to délku log.0 nebo 1
When state 0 is used, the routine will wait until the level on the specified input pin is 0. Then a counter is started and stopped until the input level gets 1.

Jak máš fuse bity? Běží ta tiny na 9,6MHz?
Jak máš udělaný vstup? Přímo signál z přijímače nebo tranzistor na vstupu tiny + vnitřní pullup?
Kampaň, účelovka, nepodepsal, Palermo, ODS, Kalousek, je líp a jsou na to čísla, nastudujte si to.

Uživatelský avatar
denny_ul
Příspěvky: 30
Registrován: 14 zář 2015, 02:00
Bydliště: Ústí n.L.

#14 Příspěvek od denny_ul »

Takže nakonec jsem to přeci jen rozchodil takto:
Signál je přímo z přijímače.

Kód: Vybrat vše

$regfile = "attiny13.dat"
$crystal = 1000000
$hwstack = 16
$swstack = 8
$framesize = 24

 Config Portb.0 = Input
 Config Portb.3 = Output
 Config Portb.4 = Output

 Dim Puls As Byte
 Dim Dolni As Byte
 Dim Horni As Byte

 Dolni = 130
 Horni = 160

Aaa:
Pulsein Puls , Pinb , 0 , 0

If Puls < Dolni Then
Portb.3 = 0
Portb.4 = 0
End If

If Puls > Dolni And Puls < Horni Then
Portb.3 = 1
Portb.4 = 0
End If

If Puls > Horni Then
Portb.3 = 1
Portb.4 = 1
End If

Goto Aaa

End
Ještě jednou díky všem za pomoc.

Uživatelský avatar
Ruprecht
Příspěvky: 1114
Registrován: 28 zář 2005, 02:00
Bydliště: ZČ + JM

#15 Příspěvek od Ruprecht »

To goto není hezké. Je sice funkční, ale fakt není hezké :)
Hlavní smyčka je Do ... Loop
Podmínky jdou napsat trochu čitelněji (třeba Select Case)
Pro konstanty není třeba zabírat místo v paměti deklarováním proměnných, stačí jako konstanty (Const)
Proměnná puls by měla být pro jistotu naopak deklarována jako word (má 16-bit, viz help: A 16 bit counter is used. A time out will occur after 65535 unit counts. With 10 uS units this will be after 655.35 mS).
Podle $crystal = 1000000 to vypadá, že používáš externí xtal. Pokud používáč vnitřní RC, nastav 4,8MHz nebo 9,6MHz (viz fusebity)
Pro přehlednost je dobré používat pro vstupy a výstupy aliasy (lidské názvy místo portů/pinů)

Kód: Vybrat vše

$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 16
$swstack = 8
$framesize = 24

Config Portb.0 = Input
Config Portb.3 = Output
Config Portb.4 = Output

Vystup1 alias Portb.3
Vystup2 alias Portb.4

Dim Puls As Word
Const Dolni = 130
Const Horni = 160 

Do
  Pulsein Puls , Pinb , 0 , 0

  Select Case Puls

    Case is < Dolni:
      Vystup1 = 0
      Vystup2 = 0

    Case Dolni to Horni:
      Vystup1 = 1
      Vystup2 = 0

    Case is > Horni:
      Vystup1 = 1
      Vystup2 = 1

  End Select

Loop
End
A nejsem si jistý, jestli tou poslední nulou v "Pulsein Puls , Pinb , 0 , 0" nedetekuješ log.0 (nemůžu vyzkoušet). Ono to teď fungovat může, ale s jiným přijímačem s jinou frekvencí opakování pulsů to pak nemusí fungovat správně i když vlastní pulsy budou 1-2ms...
Kampaň, účelovka, nepodepsal, Palermo, ODS, Kalousek, je líp a jsou na to čísla, nastudujte si to.

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“