mega8, нет PWM на выводах 3 5 6
- Войдите на сайт для отправки комментариев
Полный код, скорее всего будет малополезен. Есть 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);
Фотки будут, если надо.
Фотки платы:
даташит почитай. там всего 3 хардваных шима)) на 9 10 и 11
О как. ну блин, голова помидор. А я думал они только объёмом флеша, EEPROM и мозгов отличаются.
А как с сериалом, если он запущен, можно читать вывод Rx по digitalRead()?
да нет. разница больше))
а с вопросом не понял
по теме - сделайте програмный ШИМ
у атмела было несколько поколений МК, мега8 из самых первых, старее чем тини13, а мега328 практически из последнего поколения, новее только тини4/5/9/10
так что отличий и правда куда больше, чем просто память. количество ШИМ одно из них, еще более критичные - отсутствие системы PCINT, меньше режимов у таймеров, отсутствие железной отладки и т.д.
Даже больше. atmega8 заметно отличается от atmega8a. Последняя говоря языком програмистов багфикс к atmega8, говоря языком автомобилистов - рестайлинг
Ровесник atmega328 - atmega88. У них и даташит один. Но по цене смысла покупать 88-ю нет никакого. Либо мириться с отличиями мега8 и покупать ее по 60 центов либо практически за теже деньги что 88-я покупать 328-ю (вместо 1.1 платить 1.3)
Не, у меня atmega8a-au, на фотге видно.