Forum: Mikrocontroller und Digitale Elektronik IRSND mega8: IR CODE senden ->nur symmetrische PWM


von Tzu Y. (tzu)


Angehängte Dateien:

Lesenswert?

Hey Leute,

habe ein kleines Problem, mit der IRSND Libaray Siehe:

http://www.mikrocontroller.net/articles/IRMP

Hab die Libaray in mein Eclipse Projekt eigefügt und wollte die 
Testdatei verwenden, nun wollte ich am Pin PB3 messen und bekomme nur 
ein (symmetrisches) PWM  Signal heraus!

Habe schon versucht den Code bzw. die Adresse mal zu ändern hat nichts 
gebracht.. )-:

Hier die Main:
1
/*---------------------------------------------------------------------------------------------------------------------------------------------------
2
 * irsndmain.c - demo main module to test irsnd encoder
3
 *
4
 * Copyright (c) 2010-2012 Frank Meyer - frank(at)fli4l.de
5
 *
6
 * ATMEGA88 @ 8 MHz
7
 *
8
 * Fuses: lfuse: 0xE2 hfuse: 0xDC efuse: 0xF9
9
 *
10
 * This program is free software; you can redistribute it and/or modify
11
 * it under the terms of the GNU General Public License as published by
12
 * the Free Software Foundation; either version 2 of the License, or
13
 * (at your option) any later version.
14
 *---------------------------------------------------------------------------------------------------------------------------------------------------
15
 */
16
#include "irsnd.h"
17
18
#ifndef F_CPU
19
#  error F_CPU unkown
20
#endif
21
22
void
23
timer1_init (void)
24
{
25
#if defined (__AVR_ATtiny45__) || defined (__AVR_ATtiny85__)                // ATtiny45 / ATtiny85:
26
    OCR1C   =  (F_CPU / F_INTERRUPTS / 4) - 1;                              // compare value: 1/15000 of CPU frequency, presc = 4
27
    TCCR1   = (1 << CTC1) | (1 << CS11) | (1 << CS10);                      // switch CTC Mode on, set prescaler to 4
28
#else                                                                       // ATmegaXX:
29
    OCR1A   =  (F_CPU / F_INTERRUPTS) - 1;                                  // compare value: 1/15000 of CPU frequency
30
    TCCR1B  = (1 << WGM12) | (1 << CS10);                                   // switch CTC Mode on, set prescaler to 1
31
#endif
32
33
#ifdef TIMSK1
34
    TIMSK1  = 1 << OCIE1A;                                                  // OCIE1A: Interrupt by timer compare
35
#else
36
    TIMSK   = 1 << OCIE1A;                                                  // OCIE1A: Interrupt by timer compare
37
#endif
38
}
39
40
/*---------------------------------------------------------------------------------------------------------------------------------------------------
41
 * timer 1 compare handler, called every 1/10000 sec
42
 *---------------------------------------------------------------------------------------------------------------------------------------------------
43
 */
44
ISR(TIMER1_COMPA_vect)
45
{
46
    (void) irsnd_ISR();                                                     // call irsnd ISR
47
    // call other timer interrupt routines here...
48
}
49
50
/*---------------------------------------------------------------------------------------------------------------------------------------------------
51
 * MAIN: main routine
52
 *---------------------------------------------------------------------------------------------------------------------------------------------------
53
 */
54
55
56
int
57
main (void)
58
{
59
    IRMP_DATA irmp_data;
60
61
    irsnd_init();                                                             // initialize irsnd
62
    timer1_init();                                                            // initialize timer
63
    sei ();                                                                   // enable interrupts
64
65
    for (;;)
66
    {
67
        irmp_data.protocol = IRMP_NEC_PROTOCOL;
68
        irmp_data.address  = 0x00FF;
69
        irmp_data.command  = 0x0001;
70
        irmp_data.flags    = 0;
71
72
        irsnd_send_data (&irmp_data, TRUE);
73
        _delay_ms (100);
74
    }
75
}


hier die config:
1
/*---------------------------------------------------------------------------------------------------------------------------------------------------
2
 * irsndconfig.h
3
 *
4
 * DO NOT INCLUDE THIS FILE, WILL BE INCLUDED BY IRSND.H!
5
 *
6
 * Copyright (c) 2010-2011 Frank Meyer - frank(at)fli4l.de
7
 *
8
 * $Id: irsndconfig.h,v 1.38 2012/06/05 12:00:46 fm Exp $
9
 *
10
 * ATMEGA88 @ 8 MHz
11
 *
12
 * This program is free software; you can redistribute it and/or modify
13
 * it under the terms of the GNU General Public License as published by
14
 * the Free Software Foundation; either version 2 of the License, or
15
 * (at your option) any later version.
16
 *---------------------------------------------------------------------------------------------------------------------------------------------------
17
 */
18
19
#ifndef _IRSNDCONFIG_H_
20
#define _IRSNDCONFIG_H_
21
22
#if !defined(_IRSND_H_)
23
#  error please include only irsnd.h, not irsndconfig.h
24
#endif
25
26
/*---------------------------------------------------------------------------------------------------------------------------------------------------
27
 * F_INTERRUPTS: number of interrupts per second, should be in the range from 10000 to 20000, typically 15000
28
 *---------------------------------------------------------------------------------------------------------------------------------------------------
29
 */
30
#ifndef F_INTERRUPTS
31
#  define F_INTERRUPTS                          15000   // interrupts per second
32
#endif
33
34
/*---------------------------------------------------------------------------------------------------------------------------------------------------
35
 * Change settings from 1 to 0 if you want to disable one or more encoders.
36
 * This saves program space.
37
 * 1 enable  decoder
38
 * 0 disable decoder
39
 *---------------------------------------------------------------------------------------------------------------------------------------------------
40
 */
41
42
// typical protocols, disable here!             Enable  Remarks                 F_INTERRUPTS            Program Space
43
#define IRSND_SUPPORT_SIRCS_PROTOCOL            1       // Sony SIRCS           >= 10000                 ~200 bytes
44
#define IRSND_SUPPORT_NEC_PROTOCOL              1       // NEC + APPLE          >= 10000                 ~100 bytes
45
#define IRSND_SUPPORT_SAMSUNG_PROTOCOL          1       // Samsung + Samsung32  >= 10000                 ~300 bytes
46
#define IRSND_SUPPORT_MATSUSHITA_PROTOCOL       1       // Matsushita           >= 10000                 ~200 bytes
47
#define IRSND_SUPPORT_KASEIKYO_PROTOCOL         1       // Kaseikyo             >= 10000                 ~300 bytes
48
#define IRSND_SUPPORT_DENON_PROTOCOL            1       // DENON, Sharp         >= 10000                 ~200 bytes
49
50
// more protocols, enable here!                 Enable  Remarks                 F_INTERRUPTS            Program Space
51
#define IRSND_SUPPORT_RC5_PROTOCOL              0       // RC5                  >= 10000                 ~150 bytes
52
#define IRSND_SUPPORT_RC6_PROTOCOL              0       // RC6                  >= 10000                 ~250 bytes
53
#define IRSND_SUPPORT_RC6A_PROTOCOL             0       // RC6A                 >= 10000                 ~250 bytes
54
#define IRSND_SUPPORT_JVC_PROTOCOL              0       // JVC                  >= 10000                 ~150 bytes
55
#define IRSND_SUPPORT_NEC16_PROTOCOL            0       // NEC16                >= 10000                 ~150 bytes
56
#define IRSND_SUPPORT_NEC42_PROTOCOL            0       // NEC42                >= 10000                 ~150 bytes
57
#define IRSND_SUPPORT_IR60_PROTOCOL             0       // IR60 (SDA2008)       >= 10000                 ~250 bytes
58
#define IRSND_SUPPORT_GRUNDIG_PROTOCOL          0       // Grundig              >= 10000                 ~300 bytes
59
#define IRSND_SUPPORT_SIEMENS_PROTOCOL          0       // Siemens, Gigaset     >= 15000                 ~150 bytes
60
#define IRSND_SUPPORT_NOKIA_PROTOCOL            0       // Nokia                >= 10000                 ~400 bytes
61
62
// exotic protocols, enable here!               Enable  Remarks                 F_INTERRUPTS            Program Space
63
#define IRSND_SUPPORT_KATHREIN_PROTOCOL         0       // Kathrein             >= 10000                 DON'T CHANGE, NOT SUPPORTED YET!
64
#define IRSND_SUPPORT_NUBERT_PROTOCOL           0       // NUBERT               >= 10000                 ~100 bytes
65
#define IRSND_SUPPORT_BANG_OLUFSEN_PROTOCOL     0       // Bang&Olufsen         >= 10000                 ~250 bytes
66
#define IRSND_SUPPORT_RECS80_PROTOCOL           0       // RECS80               >= 20000                 ~100 bytes
67
#define IRSND_SUPPORT_RECS80EXT_PROTOCOL        0       // RECS80EXT            >= 20000                 ~100 bytes
68
#define IRSND_SUPPORT_THOMSON_PROTOCOL          0       // Thomson              >= 10000                 ~250 bytes
69
#define IRSND_SUPPORT_NIKON_PROTOCOL            0       // NIKON                >= 10000                 ~150 bytes
70
#define IRSND_SUPPORT_NETBOX_PROTOCOL           0       // Netbox keyboard      >= 10000                 DON'T CHANGE, NOT SUPPORTED YET!
71
#define IRSND_SUPPORT_FDC_PROTOCOL              0       // FDC IR keyboard      >= 10000 (better 15000)  ~150 bytes
72
#define IRSND_SUPPORT_RCCAR_PROTOCOL            0       // RC CAR               >= 10000 (better 15000)  ~150 bytes
73
#define IRSND_SUPPORT_RUWIDO_PROTOCOL           0       // RUWIDO, T-Home       >= 15000                 DON'T CHANGE, NOT SUPPORTED YET!
74
#define IRSND_SUPPORT_LEGO_PROTOCOL             0       // LEGO Power RC        >= 20000                 ~150 bytes
75
76
/*---------------------------------------------------------------------------------------------------------------------------------------------------
77
 * AVR section:
78
 *
79
 * Change hardware pin here:                    IRSND_OC2  = OC2  on ATmegas         supporting OC2,  e.g. ATmega8
80
 *                                              IRSND_OC2A = OC2A on ATmegas         supporting OC2A, e.g. ATmega88
81
 *                                              IRSND_OC2B = OC2B on ATmegas         supporting OC2B, e.g. ATmega88
82
 *                                              IRSND_OC0  = OC0  on ATmegas         supporting OC0,  e.g. ATmega162
83
 *                                              IRSND_OC0A = OC0A on ATmegas/ATtinys supporting OC0A, e.g. ATtiny84, ATtiny85
84
 *                                              IRSND_OC0B = OC0B on ATmegas/ATtinys supporting OC0B, e.g. ATtiny84, ATtiny85
85
 *---------------------------------------------------------------------------------------------------------------------------------------------------
86
 */
87
#if defined(ATMEL_AVR)
88
#  define IRSND_OCx                             IRSND_OC2              // use OC2B
89
90
/*---------------------------------------------------------------------------------------------------------------------------------------------------
91
 * PIC C18 section:
92
 *
93
 * Change hardware pin here:                    IRSND_PIC_CCP1 = RC2 on PIC 18F2550/18F4550, ...
94
 *                                              IRSND_PIC_CCP2 = RC1 on PIC 18F2550/18F4550, ...
95
 *---------------------------------------------------------------------------------------------------------------------------------------------------
96
 */
97
#elif defined(PIC_C18)
98
#  define IRSND_OCx                             IRSND_PIC_CCP2          // Use PWMx for PIC
99
                                                                        // change other PIC C18 specific settings:
100
#  define F_CPU                                 48000000UL              // PIC frequency: set your freq here
101
#  define Pre_Scaler                            4                       // define prescaler for timer2 e.g. 1,4,16
102
#  define PIC_Scaler                            2                       // PIC needs /2 extra in IRSND_FREQ_32_KHZ calculation for right value
103
#  warning Timer2 used for IRSND (PWM out) ! Do not use/setup Timer 2 yourself !
104
105
/*---------------------------------------------------------------------------------------------------------------------------------------------------
106
 * ARM STM32 section:
107
 *---------------------------------------------------------------------------------------------------------------------------------------------------
108
 */
109
#elif defined (ARM_STM32)                                               // use A6 as IR output on STM32
110
#  define IRSND_PORT_LETTER                     A
111
#  define IRSND_BIT_NUMBER                      6
112
#  define IRSND_TIMER_NUMBER                    10
113
#  define IRSND_TIMER_CHANNEL_NUMBER            1                       // only channel 1 can be used at the moment, others won't work
114
115
/*---------------------------------------------------------------------------------------------------------------------------------------------------
116
 * Other target system
117
 *---------------------------------------------------------------------------------------------------------------------------------------------------
118
 */
119
#elif !defined (UNIX_OR_WINDOWS)
120
#  error target system not defined.
121
#endif
122
123
/*---------------------------------------------------------------------------------------------------------------------------------------------------
124
 * Use Callbacks to indicate output signal or something else
125
 *---------------------------------------------------------------------------------------------------------------------------------------------------
126
 */
127
#ifndef IRSND_USE_CALLBACK
128
#  define IRSND_USE_CALLBACK                    0                       // flag: 0 = don't use callbacks, 1 = use callbacks, default is 0
129
#endif
130
131
#endif // _IRSNDCONFIG_H_


Vielleicht kennt jemand das Problem bzw meinen Fehler!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Tzu Ying schrieb:

> Hab die Libaray in mein Eclipse Projekt eigefügt und wollte die
> Testdatei verwenden, nun wollte ich am Pin PB3 messen und bekomme nur
> ein (symmetrisches) PWM  Signal heraus!

Ja, IRSND erzeugt nur symmetrische PWM-Signale. Es gab bisher auch 
keinen Anlass, dies zu ändern - auch wenn bestimmte IR-Protokolle 
eigentlich etwas anderes vorsehen.

Wo ist Dein Problem?

Gruß,

Frank

von Tzu Y. (tzu)


Lesenswert?

hmm, glaube dann verstehe ich was falsch.... wollt mein Signal von 
meiner Apple Fernbedienung nachbilden, welches auf dem Oszi ja nicht 
symmetrisch ist? bzw. was bringt mir denn IRSND wenn jede Adresse und 
Befehl gleich aussieht )-:

Bekomme ja nur ein Signal mit -> 01010101010101010, egal welchen Hex 
wert ich in die main schreibe... aber nicht z.B. 1000111011111

Gruß
TZU

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Tzu Ying schrieb:
> hmm, glaube dann verstehe ich was falsch.... wollt mein Signal von
> meiner Apple Fernbedienung nachbilden, welches auf dem Oszi ja nicht
> symmetrisch ist? bzw. was bringt mir denn IRSND wenn jede Adresse und
> Befehl gleich aussieht )-:

Da haben wir uns wohl missverstanden. Ich dachte, es ginge Dir um das 
Tastverhältnis der Modulationsfrequenz. Natürlich kann IRMP verschiedene 
Adressen bzw. Befehle.

> Bekomme ja nur ein Signal mit -> 01010101010101010, egal welchen Hex
> wert ich in die main schreibe... aber nicht z.B. 1000111011111

Das ist merkwürdig. Kannst Du mal die irsndconfig.h hier reinstellen?

Gruß,

Frank

von Tzu Y. (tzu)


Lesenswert?

Hi, steht doch schon drinne unter der main (-:

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Tzu Ying schrieb:
> Hi, steht doch schon drinne unter der main (-:

Sorry, übersehen.

Auszug aus Deinem main.c:
1
        irmp_data.protocol = IRMP_NEC_PROTOCOL;
2
        irmp_data.address  = 0x00FF;
3
        irmp_data.command  = 0x0001;
4
        irmp_data.flags    = 0;
5
6
        irsnd_send_data (&irmp_data, TRUE);

Dir ist wahrscheinlich klar, dass für das Apple-Protokoll
1
        irmp_data.protocol = IRMP_APPLE_PROTOCOL;

eingestellt werden muss...

Ich habe IRSND nochmal unter Linux für APPLE und NEC getestet, läuft 
einwandfrei. Welchen µC benutzt Du? Vermutlich einen ATmega8? Wie ist 
bei Dir F_CPU eingestellt?

Zu Deinem Oszi-Bild:

Welche Zeit entspricht einem Kästchen? 500µsec? Dann sind das ca. 
4500µs, was ich da sehe. Das entspricht ca. dem 8fachen eines einzelnen 
NEC-Pulses.

Offenbar siehst Du da nur ein einzelnes Bit auf dem Scope und nicht den 
ganzen Frame. Wähle mal eine andere Zeitbasis auf Deinem Scopy. Zudem 
scheint Dein Prozessor nur mit einem Achtel von F_CPU zu laufen...

Erzähle bitte mal mehr über Deinen Prozessor, den verwendeten Takt, die 
Fuse-Einstellungen und ob Du einen Quarz einsetzt.

Gruß,

Frank

von Tzu Y. (tzu)


Lesenswert?

Hi, schonmal vielen dank für deine mühe, also ich benutze für den 
Versuchsaufbau keinen Quarz nur den internen RC-Oszilator vom mega8, 
Muss ein externen Quarz verwendet werden? Du hast recht habe übersehn 
das der mega8 mit 1Mhz getaktet ist...

Habe leider das Oszi nicht mehr da muss mir es nochmal ausleihen und 
dann noch mal schauen

Aber schonmal vielen dank bis hierher (-:

Gruß
TZU

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Tzu Ying schrieb:
> Muss ein externen Quarz verwendet werden?

Nicht zwingend. Es gibt aber durchaus kommerzielle Geräte, die beim 
Timing sehr pingelig sind.

> Du hast recht habe übersehn das der mega8 mit 1Mhz getaktet ist...

Schau Dir

    http://www.engbedded.com/fusecalc/

an. Da siehst Du dann, dass Du die Low-Fuse auf 0xE4 umstellen musst, 
damit Dein ATmega8 auch mit 8 MHz rennt.

> Habe leider das Oszi nicht mehr da muss mir es nochmal ausleihen und
> dann noch mal schauen

Stelle erstmal den ATmega auf 8MHz um. Dann sollte es auch 
funktionieren.

Gruß,

Frank

von Newbe (Gast)


Lesenswert?

Hallo, ich möchte ungerne einen neuen Thread aufmachen, daher hänge ich 
mich mal hinten dranne.

Ich versuche jetzt schon länger IRSND auf einem ATmega8 zum laufen zu 
bringen (auch mit einem atmega32 probiert, geht auch nicht).

Ich habe das Programm von oben (main und irsndconfig) mit copy & paste 
auf dem AVR. IR-Diode ist wie in dem Wiki von IRSND gezeigt 
angeschlossen (Basis an PB3).

Der Controller "lebt" auch: Wenn ich die IR-Diode durch eine 0815 LED 
ersetze Blinkt diese (bei genauer beobachtung jedoch auch nicht alle 
100ms sondern eher alle 400-500 (gaaaanz grob, hab leider keinen Oszi)).

Des weiteren habe ich einen ATmega32 auf einem Pollin-Board der bei 
einem empfangenem IR-Befehl das Protokoll, Adresse und Command auf dem 
LCD anzeigt. Hier kommt rein garnichts an... Wenn ich mit einer Normalen 
TV Fernbedienung und dem Mega8 gleichzeitig sende wird das empfangene 
Protokoll jedoch verfälscht (lässt wohl vermuten dass zumindest 
IRGENDWAS mit IRSND endsteht, und wenn es nur Bullshit ist ;) )

Fueses:
hfuse: D9
lfuse: E4
(Arbeite mit Burn-O-Mat)

Grüße
Manu

Hoffe dass Ihr mir helfen könnt, da mein "Projekt" jetzt erstmal stockt 
:(

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.