Infra jelek dekódolása
-
pkedvessy
Infra jelek dekódolása
A következő program megírásában kérném a segítségetek!
Tetszőleges IR jelet szeretnék eltárolni és aztán visszajátszani! A tárolást úgy képzeltem el, hogy megmérem az egyes jelek hosszát, a köztük lévő jelek hosszát, és ezeket az értékeket kellene elmenteni pl egy I2C buszos soros eepromba! Így a jelek a protokol ismerete nélkül is elmenthetőek lennének és utána vissza is lehetne őket játszani!
Ez megvalósítható a TINY2313-al?
Előre is köszönöm a segítséget!
(Ui: remélem érthetően írtam le hogy mit szeretnék megvalósítani)
Tetszőleges IR jelet szeretnék eltárolni és aztán visszajátszani! A tárolást úgy képzeltem el, hogy megmérem az egyes jelek hosszát, a köztük lévő jelek hosszát, és ezeket az értékeket kellene elmenteni pl egy I2C buszos soros eepromba! Így a jelek a protokol ismerete nélkül is elmenthetőek lennének és utána vissza is lehetne őket játszani!
Ez megvalósítható a TINY2313-al?
Előre is köszönöm a segítséget!
(Ui: remélem érthetően írtam le hogy mit szeretnék megvalósítani)
-
Robert
Megoldható.
Az infrajel begyűjtése TSOP1736 vagy TSOP1836 chippel lehet, ennek adatkimenete a ATTINY2313 interruptjára kerül. És méred az impulzusok közötti időt. (ld. megszakítások c-ű fejezet).
Akimentet meg valamelyik Timer kimenetre és 36kHz-t kapcsolgatsz adott időnként.
Ja a fel és a lefutó él is kell neked, így a Tiny2313 C(?) portja tudja a change típusú interruptot. Azaz mind a fel, mind a lefutó élre kapsz.
Az adatcsomag hossza 12...18 bit. A beolvasás után írdd csak eepromba, mert a jel hossza és a EEPROM írás I2C-n összemérhető sebességű!
PC-s kezelőprogram fejlesztésére a sorosporton át történő kommunikáció javasolt, ez terminálban könnyen kezelhető. Én erre fejlesztek (COMport), így a legkönnyvebben (Basic
) a libertybasic amivel tök gyorsan lehet távirányító kezelőfelületet létrehozni...
Az infrajel begyűjtése TSOP1736 vagy TSOP1836 chippel lehet, ennek adatkimenete a ATTINY2313 interruptjára kerül. És méred az impulzusok közötti időt. (ld. megszakítások c-ű fejezet).
Akimentet meg valamelyik Timer kimenetre és 36kHz-t kapcsolgatsz adott időnként.
Ja a fel és a lefutó él is kell neked, így a Tiny2313 C(?) portja tudja a change típusú interruptot. Azaz mind a fel, mind a lefutó élre kapsz.
Az adatcsomag hossza 12...18 bit. A beolvasás után írdd csak eepromba, mert a jel hossza és a EEPROM írás I2C-n összemérhető sebességű!
PC-s kezelőprogram fejlesztésére a sorosporton át történő kommunikáció javasolt, ez terminálban könnyen kezelhető. Én erre fejlesztek (COMport), így a legkönnyvebben (Basic
-
Robert
-
Vendég
Ez így leírva elég egyszerűnek tűnik... A PC-s progival nem is lesz gond, viszont az AVR programozásban eléggé kezdő vagyok! Örülök hogy az elv jó, amit kitaláltam...
Nem tudnál esetleg segíteni a program megírásában?
Erről a CHANGE INT-ről nem túl sok infót találtam a BASCOM-ban...
Előre is nagyon köszönöm!
Előre is nagyon köszönöm!
-
Robert
Van a megszakítások fejezet, abban a vége felé ott van egy minta, hogy két jel közott hogy fogd meg.
ATMega8-ra írtam egyet, ami a két jel közötti időt köhögi vissza sorosporton (átírható Tiny2313-ra, csak a lábakat kell átírni, meg a definíciót ill a kristály értékét...):
Itt a lefutó élekre megy a mérés...
Ja amúgy ez a UIR vagy az URCR protokoll a távirányításban...
$regfile = "m8def.dat"
$crystal = 7372800
$baud = 57600
Config Portc = Output 'LED itt log Portc.5(zold) es portc.4(piros)
Portc = 255
'Int1 beallitasa
Config Pind.3 = Input 'INT 1
Dim Kiir As Byte
'Dim Length As Byte
Dim New_signal As Byte
Dim Temp As Word
New_signal = 0
'Timer beallitasa (eltelt idore leolvasasi ciklusoke)
'Timer1 16 bites
Config Timer1 = Timer , Prescale = 1024
'Kvarc=7372800, Prescale=1024
'1 tick=1,38*10e-4 (~13,88 msec)
'1 Overflow= 9,1 sec
Config Int1 = Falling
On Timer1 Beolv
On Int1 Irvetel
Timer1 = 60000
Enable Interrupts
Enable Int1
Enable Timer1
Start Timer1
Portc = 0
New_signal = 0
Waitms 100
Portc = 255
Do
'itt nem csinal semmit:)
Loop
'LED itt log Portc.5(zold) es portc.4(piros)
Irvetel: 'Int1
Temp = Timer1
Timer1 = 60000
Temp = Temp - 60000
Kiir = Temp
If New_signal > 0 Then
Print Str(kiir)
Else 'Az elso jelet eldobjuk, nem ismert a starthelyzete
New_signal = 1
Kiir = 0
Print Str(kiir)
Reset Portc.4 'led kigyujt
End If
Gifr = 128 'ne legyen ujraint (ne duplázzon)
Return
Beolv: 'Timer OF
Set Portc.4 'LED lekapcsol
Timer1 = 60000
New_signal = 0
ATMega8-ra írtam egyet, ami a két jel közötti időt köhögi vissza sorosporton (átírható Tiny2313-ra, csak a lábakat kell átírni, meg a definíciót ill a kristály értékét...):
Itt a lefutó élekre megy a mérés...
Ja amúgy ez a UIR vagy az URCR protokoll a távirányításban...
$regfile = "m8def.dat"
$crystal = 7372800
$baud = 57600
Config Portc = Output 'LED itt log Portc.5(zold) es portc.4(piros)
Portc = 255
'Int1 beallitasa
Config Pind.3 = Input 'INT 1
Dim Kiir As Byte
'Dim Length As Byte
Dim New_signal As Byte
Dim Temp As Word
New_signal = 0
'Timer beallitasa (eltelt idore leolvasasi ciklusoke)
'Timer1 16 bites
Config Timer1 = Timer , Prescale = 1024
'Kvarc=7372800, Prescale=1024
'1 tick=1,38*10e-4 (~13,88 msec)
'1 Overflow= 9,1 sec
Config Int1 = Falling
On Timer1 Beolv
On Int1 Irvetel
Timer1 = 60000
Enable Interrupts
Enable Int1
Enable Timer1
Start Timer1
Portc = 0
New_signal = 0
Waitms 100
Portc = 255
Do
'itt nem csinal semmit:)
Loop
'LED itt log Portc.5(zold) es portc.4(piros)
Irvetel: 'Int1
Temp = Timer1
Timer1 = 60000
Temp = Temp - 60000
Kiir = Temp
If New_signal > 0 Then
Print Str(kiir)
Else 'Az elso jelet eldobjuk, nem ismert a starthelyzete
New_signal = 1
Kiir = 0
Print Str(kiir)
Reset Portc.4 'led kigyujt
End If
Gifr = 128 'ne legyen ujraint (ne duplázzon)
Return
Beolv: 'Timer OF
Set Portc.4 'LED lekapcsol
Timer1 = 60000
New_signal = 0
-
pkedvessy
-
Robert
-
pkedvessy
-
pkedvessy
Elvileg a legújabb 1.11.7.9-es verzió van feltelepítve, és a help-ben össz-vissz ennyi van a config int x részben:
Action
Configures the way the interrupts 0,1 and 4-7 will be triggered.
Syntax
CONFIG INTx = state
Where X can be 0,1 and 4 to 7 in the MEGA chips.
Remarks
state LOW LEVEL to generate an interrupt while the pin is held low. Holding the pin low will generate an interrupt over and over again.
FALLING to generate an interrupt on the falling edge.
RISING to generate an interrupt on the rising edge..
The MEGA has also INT0-INT3. These are always low level triggered so there is no need /possibility for configuration.
The number of interrupt pins depend on the used chip. Most chips only have int0 and int1.
Example
'--------------------------------------------------------------
'Sample for the MEGA103
Config INT4 = LOW LEVEL
End
Csak én vagyok béna, vagy tényleg nincs benne a help-ben???
Action
Configures the way the interrupts 0,1 and 4-7 will be triggered.
Syntax
CONFIG INTx = state
Where X can be 0,1 and 4 to 7 in the MEGA chips.
Remarks
state LOW LEVEL to generate an interrupt while the pin is held low. Holding the pin low will generate an interrupt over and over again.
FALLING to generate an interrupt on the falling edge.
RISING to generate an interrupt on the rising edge..
The MEGA has also INT0-INT3. These are always low level triggered so there is no need /possibility for configuration.
The number of interrupt pins depend on the used chip. Most chips only have int0 and int1.
Example
'--------------------------------------------------------------
'Sample for the MEGA103
Config INT4 = LOW LEVEL
End
Csak én vagyok béna, vagy tényleg nincs benne a help-ben???
-
Vendég
-
Robert
Mert a Timer 1 túlcsordulása 65535-nél történik meg.
Azt hiszem a Tuimer 0 valamiért nem vált be.
A jelben a két megszakítás közt eltelt idő tick-ben számolva (ez a timer léptetés ideje) a jeltől függően 32 és 64 volt.(hosszabb v. rovidebb az infrajel. Ezek fényében a Timer 0-ra is átrakható lenne.
Azt hiszem volt egy olyan benne, hogy ebből ha fel kell építeni a jelet, akkor ha a Timer1 és a 65535 különbsége nagyobb mint 80, akkor nem volt még gomblenyomás. Ja és a jelek közötti ismétlés esetén a várakozást (ha van) akkor így lehet detektálni. Ez ~300 tick egységnyi volt. (Ezt timer0 esetén már nem lehet megfogni, mert az 255-önként nullázódik (8bites).
Azt hiszem a Tuimer 0 valamiért nem vált be.
A jelben a két megszakítás közt eltelt idő tick-ben számolva (ez a timer léptetés ideje) a jeltől függően 32 és 64 volt.(hosszabb v. rovidebb az infrajel. Ezek fényében a Timer 0-ra is átrakható lenne.
Azt hiszem volt egy olyan benne, hogy ebből ha fel kell építeni a jelet, akkor ha a Timer1 és a 65535 különbsége nagyobb mint 80, akkor nem volt még gomblenyomás. Ja és a jelek közötti ismétlés esetén a várakozást (ha van) akkor így lehet detektálni. Ez ~300 tick egységnyi volt. (Ezt timer0 esetén már nem lehet megfogni, mert az 255-önként nullázódik (8bites).
-
pkedvessy
Akkor ha a Config Int1 = Falling-t átírom Config Int1 = Change-re, akkor a jelek közti szünetet is leméri? Mást nem is kell hozzá átírni, ugye?
Egy másik dolog az idők kiszámolásával kapcsolatban!
Amit írtál, hogy a 7372800 órajel mellett 1024-es osztandóval 1 tick az 13,88 ms, az jó?
Mert nekem akár hogy számolok 0,1388 ms jön ki! És így a túlcsordulás az 0,768 másodpercenként következik be! Nem?
Egy másik dolog az idők kiszámolásával kapcsolatban!
Amit írtál, hogy a 7372800 órajel mellett 1024-es osztandóval 1 tick az 13,88 ms, az jó?
Mert nekem akár hogy számolok 0,1388 ms jön ki! És így a túlcsordulás az 0,768 másodpercenként következik be! Nem?
-
Robert
Igen, eleg. A change az eltelt idot meri. DE a PC fele kuldes miatt erdemes az elejere egy sorosbuffer megnovelest belerakni. A belso RAM 128 byte azt hiszem, igy max 64 byte legyen! vagy tombbe, es ha megszunt az IR jel adasa utana kuldod a PC fele az osszes kodot, vagy eleg ha 12-16-t megfogsz es ha annyi megjott, akkor pc fele kuldod. (ekkor termeszetesen kuldes alatt az int1 tiltva van (enable int1/disable int1)
A szamolasban:
Kvarc: 7372800 rezges/sec
Prescale: 1024
A Timer1 bemenete: 7200 rezges/sec,
ez pedig 1 rezges ideje (én ezt hívom általában tick-nek (A tik-tak angol kifejezéséből)) (1/7200): 1,38*10^-4 sec, azaz 1,38*10^-1 msec=0,138 msec.
A tulcsordulas 0,138msec*65536=9,1 sec
Télleg elszámoltam:)
De elvben valahol ott az AVRCalc progi, az megszámolja ezeket helyettem:)))
1 change esemény ~32 tick alatt jön, azaz 2 megszakítás között 8,8 msec idő telik el. Így max memóriába dolgozhatsz. az EEPROMba beírás ideje 10...80msec között lehet, a sorosporton meg lassan megy ki a bitsorozat...
A szamolasban:
Kvarc: 7372800 rezges/sec
Prescale: 1024
A Timer1 bemenete: 7200 rezges/sec,
ez pedig 1 rezges ideje (én ezt hívom általában tick-nek (A tik-tak angol kifejezéséből)) (1/7200): 1,38*10^-4 sec, azaz 1,38*10^-1 msec=0,138 msec.
A tulcsordulas 0,138msec*65536=9,1 sec
Télleg elszámoltam:)
De elvben valahol ott az AVRCalc progi, az megszámolja ezeket helyettem:)))
1 change esemény ~32 tick alatt jön, azaz 2 megszakítás között 8,8 msec idő telik el. Így max memóriába dolgozhatsz. az EEPROMba beírás ideje 10...80msec között lehet, a sorosporton meg lassan megy ki a bitsorozat...
-
Vendég