#1 Re: Програмування Arduino » Проблема с прерываниями и отображением данных на экране Нокиа 5110 » 2017-02-17 19:11:17

Попробовал. Если убрать очистку, то выводятся значения яркости до тех пор, пока не начнешь её регулировать. То же самое.

#2 Re: Програмування Arduino » Проблема с прерываниями и отображением данных на экране Нокиа 5110 » 2017-02-17 19:01:13

Не думаю. Этот же скетч но с управлением 3-мя кнопками, вместо энкодера, работал.
Очистка нужна, иначе новые данные пишутся поверх.

#3 Програмування Arduino » Проблема с прерываниями и отображением данных на экране Нокиа 5110 » 2017-02-17 17:33:42

impy
відповідей: 4

Для проекта решил попробовать сделать установку значений энкодером. Для отображения использую экран от Нокии. Энкодер нормально работает только с прерываниями. Я новичок и только их осваиваю, поэтому перепробовал несколько готовых вариантов примеров для энкодера, пока у меня наконец-то получилось изиенять значения. Но теперь другая проблема - после первого же прерывания экран становится пустым. Для того, чтобы отследить работу энкодера его значения выводятся в порт, и активность там есть. Я сделал аналогичный короткий скетч, который меняет яркость подсветки, чтоб понять что же я делаю не так. Проблема в нем та же - в мониторе порта видна активность, подсветка меняется, но на экране пусто. И ещё интересно - если раскомментить Serial.println(light) в конце главного цикла, то экран тоже остается пустым.

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <Rotary.h>

Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 1);
Rotary r = Rotary(2, 3);

int light = 90;
int bl=9;
int result = 1;
volatile int enc = 0;

void setup() 
{
  
  Serial.begin(9600);
  display.begin();

  PCICR |= (1 << PCIE2);
  PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
  sei();

  pinMode(mode, INPUT); //Mode button
  pinMode(bl, OUTPUT); //LCD light

  analogWrite(bl, light);

}// Setup


void loop() {

  display.clearDisplay();

  if (enc == 1) 
  {
    Serial.println(enc);
    if (light<120) light +=30;
    if (light>=120) light = 150;
  }

if (enc == -1) 
 {
      Serial.println(enc);
      if (light >30 ) light -=30;
       if (light<=30) light = 0;
  }
      
analogWrite(bl, light);

display.println(light);
display.display();

[color=#ff450d]//Serial.println(light);[/color]
  
} //End loop

ISR(PCINT2_vect) 
      {
      unsigned char result = r.process();
      if (result == DIR_NONE) enc =0;
      else if (result == DIR_CW)  enc =1;
      else if (result == DIR_CCW)  enc =-1;
      }
  

Підвал форуму