Timerinterupt und LCD-Display

Hallo,
ich möchte jede 0,5s eine Zeichenkette auf dem LCD-Display ausgeben.
Leider passiert nichts.
Die Bildschirmausgabe funktioniert.

Wer was Rat?

Hier der Code.

#define I2C_ADDR 0x38
#define BACKLIGHT_PIN 7//3
#define En_pin 4//2
#define Rw_pin 5//1
#define Rs_pin 6//0
#define D4_pin 0//4
#define D5_pin 1//5
#define D6_pin 2//6
#define D7_pin 3//7
LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

void setup()
{

Serial.begin(9600);
lcd.begin (16,2);
lcd.home ();
lcd.setCursor (0,0);//Spalte,Zeile
lcd.print("Zaehlen:");
lcd.setCursor (8,0);//Spalte,Zeile

noInterrupts();
TCCR1A = 0;
TCCR1B = 0;

TCNT1 = 34286;
TCCR1B |= (1 << CS12);
TIMSK1 |= (1 << TOIE1);
interrupts();

}

void loop()
{

}

ISR(TIMER1_OVF_vect)
{
TCNT1 = 34286;
//Serial.println("OK");
lcd.print("OK");
lcd.setCursor (8,0);//Spalte,Zeile

}

Setze Deinen Code bitte in Codetags (</> oben links im Forumseditor), damit er von allen lesbar ist.

Gruß Tommy

#define I2C_ADDR 0x38
#define BACKLIGHT_PIN 7//3
#define En_pin 4//2
#define Rw_pin 5//1
#define Rs_pin 6//0
#define D4_pin 0//4
#define D5_pin 1//5
#define D6_pin 2//6
#define D7_pin 3//7
LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

void setup()
{

Serial.begin(9600);
lcd.begin (16,2);
lcd.home ();
lcd.setCursor (0,0);//Spalte,Zeile
lcd.print("Zaehlen:");
lcd.setCursor (8,0);//Spalte,Zeile

noInterrupts();
TCCR1A = 0;
TCCR1B = 0;

TCNT1 = 34286;
TCCR1B |= (1 << CS12);
TIMSK1 |= (1 << TOIE1);
interrupts();

}

void loop()
{

}

ISR(TIMER1_OVF_vect)
{
TCNT1 = 34286;
//Serial.println("OK");
lcd.print("OK");
lcd.setCursor (8,0);//Spalte,Zeile

}
[/quote]

print funktioniert in der ISR nicht.

Testprogramm:

const byte LED = 13;

void setup()
{
  pinMode(LED, OUTPUT);

  noInterrupts();
  TCCR1A = 0;
  TCCR1B = 0;

  TCNT1 = 34286;
  TCCR1B |= (1 << CS12);
  TIMSK1 |= (1 << TOIE1);
  interrupts();
}

void loop() {}

ISR(TIMER1_OVF_vect)
{
  TCNT1 = 34286;
  digitalWrite(LED, !digitalRead(LED));
}

der ISR funktioniert, ich kann ja den String auf dem Bildschirm ausgeben.

Serial.print() hat in einer ISR erst recht nichts verloren. Setzte in der ISR ein Flag auf dass du in loop() abfrägst

Allerdings sind Interrupts hier der falsche Weg. 0,5 Sekunden die nicht besonders genauso sein müssen kann man einfach mit millis() machen. Interrupts sind eher für sehr kurze und/oder genaue Zeiten

Die ISR funktioniert, aber print nicht in der ISR.

Du hast keine Bibliothek eingebunden, welche nutzt Du? Es gibt viele, bitte daher einen Link.

Beispiel mit Millis:

#include <Wire.h>
#include <hd44780.h>
#include <hd44780ioClass/hd44780_I2Cexp.h>
hd44780_I2Cexp lcd;
#define LCD_COLS 20
#define LCD_ROWS 4

uint32_t BLINKZEIT = 500; // in Millisekunden
uint32_t blinkMillis;
bool blink;

void setup()
{
  lcd.begin(LCD_COLS, LCD_ROWS);
}

void loop()
{
  if (millis() - blinkMillis >= BLINKZEIT)
  {
    blinkMillis = millis();
    lcd.setCursor (8, 0); //Spalte,Zeile
    blink = !blink;
    if (blink)
    {
      lcd.print("OK");
    } else {
      lcd.print("  ");
    }
  }
}

#include <LiquidCrystal_I2C.h>

Hi

  • bitte Code-Tags ... hat ja geklappt - zwar nicht beim TO, man muß aber auch Mal mit Kleinigkeiten zufrieden sein
  • Link zur Lib ... hat ja geklappt - äh, ne, eigentlich gar nicht.

Es gibt ungefähr zwei Millionen Libs, Die ALLE LiquidCrystal_I2C.h einbinden - wird wohl daran liegen, daß ALLE eine gemeinsame Herkunft haben - deshalb wurde ja nach einem Link gefragt, woher Du diese Lib hast.
Selber habe ich zwei LiquidCrystal_I2C...Libs in einen Ordner verschoben, damit die Arduino-IDE Diese nicht mehr findet - Da ich hier eben 'je nach Wetterlage' (oder kA, wie die IDE auswürfelt, welche Lib gerade genommen wird) eine dieser Auswahl benutzt wird - Welche konnte ich noch nicht nachvollziehen, also das: Warum.

Auch versuche ich in meinem Lib-Chaos nach und nach aufzuräumen, Libs, Die im Original schon nciht wollen (und ich Ersatz habe) verschwinden direkt in diesen Ordner :wink:
Auch versuche ich immer dran zu denken, den Link, wo ich Das her hab, in die Lib einzubringen ... klappt leider nicht immer.

MfG

Oft (leider nicht immer) steht der Link in der Readme.md oder der library.properties im Verzeichnis der Lib.

Gruß Tommy

F. Malpartida hat die geschrieben- NEWLiquidCrystal

postmaster-ino:
Welche konnte ich noch nicht nachvollziehen, ...

Bei mir sagt die IDE:

Multiple libraries were found for "LiquidCrystal_I2C.h"
 Used: f:\Arduino\libraries\LiquidCrystal_I2C
 Not used: f:\Arduino\libraries\NewliquidCrystal

Mußt Du möglicherweise die Warnungen oder eine andere Option der IDE einschalten.

postmaster-ino:
Auch versuche ich immer dran zu denken, den Link, wo ich Das her hab, in die Lib einzubringen ... klappt leider nicht immer.

Ich lege eine Quelle.txt an, wenn ... ja wenn ...

postmaster-ino:

  • Link zur Lib ...

Ist Das eigentlich Absicht??
Also, daß Du uns, mal wieder !!, nicht die Quelle der Lib gibst?

Wohl:
jesses .. ein Klick-Link

library.properties wieder was gelernt
Meine, bei mir funktionierende Lib zeigt dort:

name=LiquidCrystal_I2C
version=1.1.2
author=Frank de Brabander
maintainer=Marco Schwartz <marcolivier.schwartz@gmail.com>
sentence=A library for I2C LCD displays.
paragraph= The library allows to control I2C displays with functions extremely similar to LiquidCrystal library. THIS LIBRARY MIGHT NOT BE COMPATIBLE WITH EXISTING SKETCHES.
category=Display
url=https://github.com/marcoschwartz/LiquidCrystal_I2C
architectures=avr