Forum: Mikrocontroller und Digitale Elektronik IRMP Anfänger braucht Hilfe


von horst (Gast)


Lesenswert?

Nabend,

ich möchte grade ein wenig mit dem IRMP 
(www.mikrocontroller.net/articles/IRMP) herumprobieren und wollte zum 
Anfang ein kleines Programm schreiben welches mir eine Ausgabe auf einem 
LCD tätigt sobald IRGENDEIN IR Signal erkannt wurde.

Als IR Empfänger nutze ich den: 
https://cdn-reichelt.de/documents/datenblatt/A500/TSOP312SERIES_DATASHEET.pdf

Ich habe per Osziloskop bereits kontrolliert ob das IR-Signal auch am 
Pin PB1 ankommt. Das tut es und ich habe in der irmpconfig auf den Pin 
PB1 als Eingang eingestellt. Ich nutze als uC den Atmega8.

Folgenden Code habe ich:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include <avr/interrupt.h>
4
5
6
#include "irmp.h"
7
#include "lcd.h"
8
9
int main(void){
10
lcd_init();
11
lcd_setcursor(0,0);
12
lcd_string("Hallo");
13
14
IRMP_DATA irmp_data;
15
16
    irmp_init();                                                     
17
    sei ();
18
  for (;;)
19
    {
20
        if (irmp_get_data (&irmp_data))
21
        {
22
      lcd_string("1111");
23
      while(1){
24
      }
25
    }
26
  }
27
}

Die erste Ausgabe auf dem LCD funktioniert, allerdings nicht diejenige 
die kommen soll wenn ein Signal erkannt wurde. Was habe ich vergessen? 
Was habe ich in der Beschreibung übersehen?

Würde mich freuen wenn ihr helfen könntet.

Gruß

von horst (Gast)


Lesenswert?

Das Problem hat sich erledigt. Habe natürlich die IRMP-ISR nicht 
aktiviert ;-)
Allerdings tut sich bei mir schon die nächste Frage auf.

Wie kann ich jetzt den Protokoll Namen auf dem LCD ausgeben.
Adresse und Befehl lassen sich ja ganz einfach per itoa umwandeln aber 
beim Protokoll hakts bei mir. Da weiss ich nicht wie ich das anfassen 
soll.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

horst schrieb:
> Das Problem hat sich erledigt. Habe natürlich die IRMP-ISR nicht
> aktiviert ;-)
> Allerdings tut sich bei mir schon die nächste Frage auf.
>
> Wie kann ich jetzt den Protokoll Namen auf dem LCD ausgeben.
> Adresse und Befehl lassen sich ja ganz einfach per itoa umwandeln aber
> beim Protokoll hakts bei mir. Da weiss ich nicht wie ich das anfassen
> soll.

Ist etwas kompliziert bei den AVRs, aber geht:

Zuerst in irmpconfig.h IRMP_PROTOCOL_NAMES auf 1 setzen. Dann landen die 
Protokoll-Namen als Strings im Flash. Diese werden durch ein Array 
zusammengehalten, die auch im Flash liegen, da das RAM auf ATmegas meist 
knapp bemessen ist.

Du musst also erst den pointer von irmp_protocol_names[irmp_data] aus 
dem Flash holen, dann den String dazu auch nochmals.

Du findest dazu auch ein Beispiel in main.c. Auszug:
1
  uart_puts_P (pgm_read_word (&(irmp_protocol_names[irmp_data.protocol])));

Beachte, dass uart_puts_P eine Funktion ist, die eben nochmals aus dem 
Flash liest.

Diese findest Du auch in main.c:
1
static void
2
uart_puts_P (PGM_P s)
3
{
4
    uint8_t ch;
5
6
    while ((ch = pgm_read_byte(s)) != '\0')
7
    {
8
        uart_putc (ch);
9
        s++;
10
    }
11
}

Daraus eine lcd_puts_P()-Funktion zu machen, sollte nicht allzu schwer 
sein.

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.