Stránka 1 z 2

RC spínač v Bascomu

Napsal: 14 zář 2015, 18:39
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 :)

Napsal: 14 zář 2015, 20:24
od ujosvec

Napsal: 14 zář 2015, 22:27
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.

Napsal: 14 zář 2015, 22:29
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

Napsal: 14 zář 2015, 22:52
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í.

Napsal: 14 zář 2015, 23:22
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?

Napsal: 15 zář 2015, 00:00
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.

Napsal: 15 zář 2015, 00:20
od denny_ul
Ten puls vypadá takto v závislosti na poloze kniplu vysílače

Napsal: 15 zář 2015, 07:49
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=41&t=66817&p=1127375&hilit=canon#p1127296
Více najdeš zde: http://www.picaxe.cz/wp-content/uploads/Picaxe-procesor-pro-neprogram%C3%A1tory-RCR.pdf
Od strany 14.

Napsal: 15 zář 2015, 10:05
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

Napsal: 15 zář 2015, 10:52
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?

Napsal: 15 zář 2015, 12:04
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.

Napsal: 15 zář 2015, 13:44
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?

Napsal: 15 zář 2015, 15:51
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.

Napsal: 15 zář 2015, 17:03
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...