mega8, нет PWM на выводах 3 5 6

std
Offline
Зарегистрирован: 05.01.2012

Полный код, скорее всего будет малополезен. Есть 4 режима, сейчас интересует 2, когда A0 посажен на землю. Программа недописана.

#define data1in  (2)     // outs
#define data2in  (0)
#define mode1sel (A1)
#define mode2sel (A0)
#define led1out  3
#define led2out  5
#define led3out  6
#define led4out  9
#define led5out  10
#define led6out  11

byte          mode=0,              // mode
              val=0;               // LED value
boolean       trig=false;          // trigger flag
unsigned long last_upd=millis(),   // timestamps
              last_trig=millis();
int           trig_span=2000;      // triggered time, ms
  
void setup(){
  pinMode(mode1sel,INPUT_PULLUP);  // inputs
  pinMode(mode2sel,INPUT_PULLUP);
  pinMode(data1in,INPUT);
  pinMode(data2in,INPUT);
  pinMode(led1out,OUTPUT);         // LEDs
  pinMode(led2out,OUTPUT);
  pinMode(led3out,OUTPUT);
  pinMode(led4out,OUTPUT);
  pinMode(led5out,OUTPUT);
  pinMode(led6out,OUTPUT);
  pinMode(A7,INPUT);               // noise source
//  Serial.begin(9600);
} 

void loop(){
  int delta=5;
  if(digitalRead(data1in)==HIGH && !trig){                                  // flag enable
    trig=true;
    last_trig=millis();
  }
  if(digitalRead(data1in)==LOW && trig && millis()-last_trig>=trig_span){   // flag disable
    trig=false;
  }
  mode=!digitalRead(mode1sel)*2+!digitalRead(mode2sel);                     // poll mode
  trig=true;  //DEBUG
  if(trig){                    // flag
    switch(mode){
      case 0:      // blink
        if(millis()-last_upd>=trig_span){
          if(val>0 && val<255) val=0;
          if(val==0) val=255;
           else val=0;
          analogWrite(led1out,val);
          analogWrite(led2out,val);
          analogWrite(led3out,val);
          analogWrite(led4out,val);
          analogWrite(led5out,val);
          analogWrite(led6out,val);
          last_upd=millis();
        }
      break;
      case 1:      // pulse
        if(millis()-last_upd>=30){
          val+=1;
          analogWrite(led1out,val);
          analogWrite(led2out,val);
          analogWrite(led3out,val);
          analogWrite(led4out,val);
          analogWrite(led5out,val);
          analogWrite(led6out,val);
          last_upd=millis();
        }
      break;
      case 2:      // steady
        analogWrite(led1out,255);
        analogWrite(led2out,255);
        analogWrite(led3out,255);
        analogWrite(led4out,255);
        analogWrite(led5out,255);
        analogWrite(led6out,255);
      break;
      case 3:      // random
        if(millis()-last_upd>=trig_span){
          last_upd=millis();
        }
      break;
    }
  }else{                       // no flag
    analogWrite(led1out,0);
    analogWrite(led2out,0);
    analogWrite(led3out,0);
    analogWrite(led4out,0);
    analogWrite(led5out,0);
    analogWrite(led6out,0);
  }
}

Суть проблемы: на плате Duemilanove пр-ва Италии с 328 этот же код выполняется и шимятся все 6 выводов. На самодельной плате, сляпанной из 8й меги из Китая, в TQFP корпусе творится следующая херня: на выводах 11, 10, 9 нормально. На выводах 3, 5, 6 - больше 127 - горит, меньше не горит. Куда копать? программа наитупейшая, никаких нехваток памяти не может быть в принципе. Все таймеры работают. иначе как я понимаю - нет на 3 - не было бы и на 11. Чо за хрень? Что ещё можно убить в меге? Разъём программатора вверх тормашками НЕ втыкался.

Заодно прицепом вопрос, можно ли читать D0 когда запущен сериал? типа:

Serial.begin(9600);
x=digitalRead(0);

Фотки будут, если надо.

std
Offline
Зарегистрирован: 05.01.2012

Фотки платы:

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

даташит почитай. там всего 3 хардваных шима)) на 9 10 и 11

std
Offline
Зарегистрирован: 05.01.2012

О как. ну блин, голова помидор. А я думал они только объёмом флеша, EEPROM и мозгов отличаются.

А как с сериалом, если он запущен, можно читать вывод Rx по digitalRead()?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да нет. разница больше))

а с вопросом не понял

axill
Offline
Зарегистрирован: 05.09.2011

по теме - сделайте програмный ШИМ

у атмела было несколько поколений МК, мега8 из самых первых, старее чем тини13, а мега328 практически из последнего поколения, новее только тини4/5/9/10

так что отличий и правда куда больше, чем просто память. количество ШИМ одно из них, еще более критичные - отсутствие системы PCINT, меньше режимов у таймеров, отсутствие железной отладки и т.д.

Даже больше. atmega8 заметно отличается от atmega8a. Последняя говоря языком програмистов  багфикс к atmega8, говоря языком автомобилистов - рестайлинг

Ровесник atmega328 - atmega88. У них и даташит один. Но по цене смысла покупать 88-ю нет никакого. Либо мириться с отличиями мега8 и покупать ее по 60 центов либо практически за теже деньги что 88-я покупать 328-ю (вместо 1.1 платить 1.3)

std
Offline
Зарегистрирован: 05.01.2012

Не, у меня atmega8a-au, на фотге видно.