Выплескивание эмоций

Тема в разделе "Флудилка", создана пользователем alp69, 15 окт 2016.

  1. akl

    akl Гик

    етить форум глючит сломали
     
  2. akl

    akl Гик

    кстати этот bitRead почему-то не может адекватно считывать состояние пина с внутренней подтяжкой
     
  3. Igor68

    Igor68 Гуру

    вот так похоже? (ну не тютелька в тютельку):
    Код (C++):

    ....
    ....
    u_int8_t res, mask=0x01;
    //правда побитный вариант - не по номеру бита
    while(1)
    {
          switch(mask)
          {
               case 0x01:
                    res = bitRead(BORTB, 3);
                    .....
                    break;
               case 0x02:
                    res = bitRead(BORTC, 3);
                    ....
                    break;
               ......
               ......
               default:
                    break;
          }
          if(mask & 0x80)
            mask = 0x01;
        else
            mask = mask << 1;
         ....
         //что-то делаем
    }
     
    switch-case работает быстрее, чем if-then... да и код короче
     
  4. akl

    akl Гик

    типа того,
    Код (C++):
    void indic(int nn){
      if (nn==0){
        GLED1_L;
        GLED2_L;
        GLED3_L;
        GLED4_L;
        GLED5_L;
      }
      if (nn==1){
        GLED1_H;
        GLED2_L;
        GLED3_L;
        GLED4_L;
        GLED5_L;
      }
      if (nn==2){
        GLED1_H;
        GLED2_H;
        GLED3_L;
        GLED4_L;
        GLED5_L;
      }
      if (nn==3){
        GLED1_H;
        GLED2_H;
        GLED3_H;
        GLED4_L;
        GLED5_L;
      }
      if (nn==4){
        GLED1_H;
        GLED2_H;
        GLED3_H;
        GLED4_H;
        GLED5_L;
      }
      if (nn==5){
        GLED1_H;
        GLED2_H;
        GLED3_H;
        GLED4_H;
        GLED5_H;
      }
    }
    потом в лупе просто indic(переменная) зажигает нужное количество диодов в зависимости от значения

    а сами пинокрутилки вот так устроены
    #define GLED1_H PORTD |= (1<<5)
    #define GLED1_L PORTD &= ~(1<<5)
    и т.д.
     
  5. akl

    akl Гик

    почему может быть такое, что digitalRead(A3); (А3 подтянут к питанию внутренним резистором) нормально работает, а bitRead(PORTC, 3); возвращает единицу даже когда этот пин замкнут на землю и на нем соответственно ноль напряжения?
     
  6. Igor68

    Igor68 Гуру

    для if параметры nn и (0...5) извлекаются из памяти для каждого сравнения, а для switch-case nn извлекается один раз и только (0...5) извлекаются каждый раз - посмотрите на результат компиляции.
     
  7. Igor68

    Igor68 Гуру

    По поводу digitalRead для AVR сказать не могу.... если только вы не используете в настройках его ещё для чего. Посмотрите может так? Конечно туплю про AVR, для Atmel вроде и ARM имеют такие же регистры (зачем изменять отлаженное)... но про Arduino тонкостей не скажу... что там в функции SETUP?
     
  8. akl

    akl Гик

    вот собственно весь скетч,
    Код (C++):
    #include <EEPROM.h>
    #define GLED1_PIN 5
    #define GLED2_PIN 6
    #define GLED3_PIN 7
    #define GLED4_PIN 8
    #define GLED5_PIN 9
    #define YLED_PIN 10
    #define TP100_PIN A1
    #define GALET_PIN A2
    #define BUTTON_PIN A3
    #define POYALO_ST      bitRead(PORTD, 4)
    #define CALBUTTON_ST   bitRead(PORTC, 3)
    #define POYALO_H       PORTD |= (1<<4)
    #define POYALO_L       PORTD &= ~(1<<4)
    #define GLED1_H       PORTD |= (1<<5)
    #define GLED1_L       PORTD &= ~(1<<5)
    #define GLED2_H       PORTD |= (1<<6)
    #define GLED2_L       PORTD &= ~(1<<6)
    #define GLED3_H       PORTD |= (1<<7)
    #define GLED3_L       PORTD &= ~(1<<7)
    #define GLED4_H       PORTB |= (1<<0)
    #define GLED4_L       PORTB &= ~(1<<0)
    #define GLED5_H       PORTB |= (1<<1)
    #define GLED5_L       PORTB &= ~(1<<1)
    #define YLED_H       PORTB |= (1<<2)
    #define YLED_L       PORTB &= ~(1<<2)

    int cal;
    int caltemp;
    boolean calmod = false;
    unsigned long caltime;
    int tp100;
    int galet;
    boolean calbutton;
    int tempmod = 0;
    boolean poyalo;
    int temp[] = {0,1,2,3,4,5};
    int ledpinN;

    void setup() {
    DDRD = B11110000;
    DDRB = B00000111;
    DDRC = B00000000;
    PORTC |= (1<<3);
    PORTD = B11100000;
    PORTB = B00000011;
    delay(500);
    PORTD = B00000000;
    PORTB = B00000000;
     
      if (EEPROM.read(0) == 123) {
        cal = EEPROM.read(1);}
        else {cal = 210;}

      temp[0] = 0;
      temp[1] = 350+cal-72;
      temp[2] = 350+cal-54;
      temp[3] = 350+cal-36; // 270 C
      temp[4] = 350+cal-18;
      temp[5] = 350+cal;  // 350 C

    }


    void loop() {
      tp100 = analogRead(TP100_PIN);
      galet = analogRead(GALET_PIN);
      calbutton = digitalRead(BUTTON_PIN);
      poyalo = bitRead(PORTD, 4);
      digitalWrite (YLED_PIN, poyalo);

      if (tp100 < temp[tempmod]) {
          POYALO_H;}
      else if (tp100 > temp[tempmod]+5) {
          POYALO_L;}
         
      for (int n = 0; n < 6; n++){
       if (tp100 < temp[n]) {
          ledpinN = n-1;
          break;}
          else {ledpinN = 5;}
        }
      indic(ledpinN);
       

     
      if (galet <100 && tempmod != 0) {
        delay(50);
        if (galet <100){
        tempmod = 0;}
        }
      if (galet > 100 && galet < 300 && tempmod != 1) {
        delay(50);
        if (galet > 100 && galet < 300){
        tempmod = 1;}
        }
      if (galet > 300 && galet < 500 && tempmod != 2) {
        delay(50);
        if (galet > 300 && galet < 500){
        tempmod = 2;}
        }
      if (galet > 500 && galet < 700 && tempmod != 3) {
        delay(50);
        if (galet > 500 && galet < 700){
        tempmod = 3;}
        }
      if (galet > 700 && galet < 900 && tempmod != 4) {
        delay(50);
        if (galet > 700 && galet < 900){
        tempmod = 4;}
        }
      if (galet > 900 && tempmod != 5) {
        delay(50);
        if (galet > 900){
        tempmod = 5;}
        }

     
      if (!calmod && calbutton){
        delay(50);
        if (calbutton){
          calmod = true;
          caltime = millis();}
         }
      if (!calbutton) {
        calmod = false;}
      if (calmod && millis()-caltime > 3000) {
        EEPROM.write(0, 123);
        EEPROM.write(1, tp100 - 350);
        GLED1_L;
        GLED2_L;
        GLED3_L;
        GLED4_L;
        GLED5_L;
        delay(500);
        GLED1_H;
        delay(250);
        GLED1_L;
        GLED2_H;
        delay(250);
        GLED2_L;
        GLED3_H;
        delay(250);
        GLED3_L;
        GLED4_H;
        delay(250);
        GLED4_L;
        GLED5_H;
        delay(250);
        GLED5_L;
        caltime = millis();
        }
       

    delay(100);}

    void indic(int nn){
      if (nn==0){
        GLED1_L;
        GLED2_L;
        GLED3_L;
        GLED4_L;
        GLED5_L;
      }
      if (nn==1){
        GLED1_H;
        GLED2_L;
        GLED3_L;
        GLED4_L;
        GLED5_L;
      }
      if (nn==2){
        GLED1_H;
        GLED2_H;
        GLED3_L;
        GLED4_L;
        GLED5_L;
      }
      if (nn==3){
        GLED1_H;
        GLED2_H;
        GLED3_H;
        GLED4_L;
        GLED5_L;
      }
      if (nn==4){
        GLED1_H;
        GLED2_H;
        GLED3_H;
        GLED4_H;
        GLED5_L;
      }
      if (nn==5){
        GLED1_H;
        GLED2_H;
        GLED3_H;
        GLED4_H;
        GLED5_H;
      }
    }

    A3 пробовал настраивать и стандартным способом через pinMode - не помогает. на цифровом пине битрид нормально работает, а на этом А3 - нет. А диджиталрид делает как надо.
     
  9. Igor68

    Igor68 Гуру

    прошу прощения... никак не найду функционального описания (схемы) порта C... который аналоговый. Пока ищу. Рассматриваю ATmega328P по DATASHEET. Есть ли "пересечения" по назначению пинов. (нет ли общего режима?)
     
  10. akl

    akl Гик

    у меня атмега8
    мне то собственно и с диджиталрид устраивает, но разобраться почему оно так было бы интересно конечно.
    впрочем проект откладывается (паяльная игрушечная станция на мелком 6вольт 9ватт паяльничке), возможно насовсем - транс не потянул - напряжение проседает сильнее чем я ожидал. попробую поставить в выпрямитель диоды шоттки, либо придется питать атмегу через повышающий стаб (хотя это тоже не очень вариант). А ведь должен выдавать 2 ампера спокойно транс собака ТН-13. паяльник жрет 1,5.
     
  11. Igor68

    Igor68 Гуру

    Спасибо за уточнение... скачал ATmega8 DATASHEET... подробнее конечно, но скудно по сравнению с ADuC7024(ARM7TDMI). По поводу источника - потребуется двухканальный малогабаритный импульсный на 6В каждый канал по (до 3А каждый канал). В Чип и Дип если быстро(10 дней) или у Китайских товарищей (но дольше).
     
  12. akl

    akl Гик

    думаю для начала зайду на блошиный рынок поищу транс пожирнее.
     
  13. null

    null Гик

    В етить форум вставили майнер. Уже починили
     
  14. Igor68

    Igor68 Гуру

    Посмотри цену сначала... а то транс дороже будет. Блок с перекупкой из Чип и Дип в нашем регионе (Тульская обл. Новомосковск) прошлый год дешевле транса был... в металлическом корпусе без защиты от внешней среды. Размер примерно 150х180х20 с креплением на плоскость винтами - вход 220AC выход 2х6V(до 3А). Исполнение серьёзное.
     
  15. akl

    akl Гик

    тут походу дело не столько в трансформаторе, сколько в диодах, т.к. переменное почти не проседает. но это все фигня - основная загвоздкп в том, что от этого паяльника к моему датчику температуры слишком плохо передается тепло, так что наладить обратную связь все равно не получится. уже отпаял все детали, а транс пойдет на бп или будет дальше лежать
     
  16. Airbus

    Airbus Оракул

    Транс можно поискать на авито на qrz.ru
     
  17. akl

    akl Гик

    дело не в трансе - надо было просто диоды более мощные брать, на этих 3хамперных почему-то 4 вольта проседало. Но проект был изначально термодинамически гибельный, заработало бы если бы был нормальный паяльник со встроенным датчиком, но к такому паяльнику и трансформатор нужен будет или БП мощный, а это все уже выходит в стоимость готовой дешевой паяльной станции.
     
  18. Airbus

    Airbus Оракул

    Так а на диодах по любому напряжение проседает где то по вольту на Брата.На Шотках поменьше.Иногда включаю 2-3 диода последовательно чтоб уровни понизить с 5 до 3х вольт
     
  19. Igor68

    Igor68 Гуру

    Доброго времени суток!
    Конечно, глупость говорю... но как вариант:
    1) имеем шунт(Rш) измерения тока(Iш) через нагреватель;
    2) измеряем напряжение на нагревателе(Uн)
    контролируя эти параметры можно определить сопротивление нагревателя (Rн)... косвенно по Rн определяем температуру нагревателя. Ну и регулируем... всё исходя только из того, что тепловой "контакт" с жалом паяльника эффективнее , чем "приложенного" датчика.
    Простите за высказывание.
     
  20. Igor68

    Igor68 Гуру

    Как вариант... после выпрямления на сглаживающих конденсаторах напряжение стремится к амплитудному значению и с увеличением нагрузки падает, а по переменке у Вас только действующее.