Sari la conținut
ELFORUM - Forumul electronistilor

Migrare Arduino pe ATmega328P ?


messu

Postări Recomandate

Diferenta dintre procesorul cu care este echipat Arduino Nano si Atmega 328P in capsula 28 DIP sunt pinii A6 si A7.

In schema ta sunt utilizati toti pinii, mai putin A7, in concluzie nu poti porta direct softul dupa un model pe altul.

Pentru asta asi recomanda sa compilezi softul pentru Atmega 328P si frecventa procesor de 8MHz interna. Asta iti va elibera pinii 9 si 10 (XTAL1 si XTAL2) pe care ii poti utiliza ca pini digitali PORTB.6 si PORTB.7. Asa ca pinul A6 poate fi inlocuit cu A2 de la switch-ul encoderului, iar pentru switch in loc de A2 se poate utiliza PORTB.6 sau PORTB.7.

Ca sa poti compila pentru Atmega 328P, selectezi in IDE Arduino, File, Preferences, Additional Boards Manager URLs, si copiezi  linkul pentru MiniCore " https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.json". Dupa asta la Tools, Board, Boards Manager... alegi "MiniCore" si il instalezi.

Odata instalat iti poti alege board-ul cu procesorul Atmega 328P, Variant 328P sau 328PA cu oscilator intern de 8MHz.

Daca faci modificarile hardware descrise (A6 la A2 de la switch si A2 de la switch la PORTB.6) completate si in soft, nu vad de ce nu ar "merge".

Am inteles ca ai un programator USBasp, asa ca programarea ar trebui sa o faci din meniul IDE Arduino, Sketch, Upload Using Programmer, dupa ce ai ales programatorul din Tools, Programmer, USBasp(MiniCore).

Succes!

Editat de Marin1960
Link spre comentariu
  • Răspunsuri 56
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

Imagini postate

Da, observatia legata de diferenta dintre cele doua capsule ale Atmega328p, este, bineinteles, corecta.

Cred totusi ca nu m-am facut bine inteles.

Diferenta dintre cele doua capsule m-a facut sa nu portez codul direct.  Asa cum se poate vedea in codul Arduino si cum poate ca eu n-am reusit sa transmit prin micile corecturi (facute cu rosu) pe schema electronica. Codul a fost modificat , astfel incat encoderul sa fie conectat la porturile A1 si A2 ale Arduino (PC1 si PC2 - Atmega) iar butonul encoderului la portul D0 (Arduino) repectiv PD0 (Atmega).

Iar citirea analogica (READING in schema electronica) a fost mutata pe portul A3 (Arduino), respecctiv (PC3- Atmega).

In acest fel am si ceasul de 16MHz si porturile ocupate, aproape in intregime (liber ramanand doar D1)

Codul astfel modificat ruleaza PERFECT pe Arduino, dar ruleaza partial pe Atmega. Asta e problema. Nu-s deloc specialist, dar nu vad de ce ar fi o eroare de fusebit de ceas.

Totusi, am retinut sugestia cu verificarea functionarii cu oscilator intern de 8MHz.

Am s-o verific, la fel ca si compararea fusebitilor, diseara sau maine, in functie de cand ajung acasa.

Revin cu rezultate...

Link spre comentariu

Daca modificarile hardware au fost realizate (A6 => A3, A3 => A2, A2 => D0) si in soft ai facut modificarile:

/* I/O ports to read the tuning mechanism */
#define ENC_A (A2)  //A3
#define ENC_B (A1)
#define FBUTTON (D0) //A2
.....

#define DBM_READING (A3)    //A6

atunci ar trebui sa functioneze fara probleme.

Scrierea procesorului o faci cu ajutorul programatorului USBasp din IDE-ul Arduino?

L.E. incarci doar aplicatia sau si bootloader-ul?

Editat de Marin1960
Link spre comentariu

Gata, am revenit.

Pentru inceput, fusebitii, erau in regula. Adica corespundeau cu cei cititi direct din Arduino Nano, mai putin Lock Fuse (0xFF / 0xDA / 0xFD / 0xCF).

In Atmega , Lock Fuse era 0x3E. L-am modificat insa nu s-a intamplat nimic.

Am gasit pe net ca fusebitii default pentru Arduino Nano ar fi cu bitul Extended setat 0x05, insa, chiar daca este corect, n-am resuit sa introduc aceasta valoare. 

Oricum ar fi cu aceiasi fuse biti (cei pe care i-am enumerat mai sus) Arduino Nano merge brici, iar Atmega328p, nu .

 

Am facut si proba cu ceas intern de 8MHz.

Am scris hex-urile si direct din Arduino IDE si cu ele exportate si scrise separat. Nimic. Nicio schimbare in bine...

Deci, "ciudatenia" persista...

Sper sa am timp pe seara si sa lipesc niste pini si la Atmega Pro mini ca sa pot face proba si cu el, ca are acelasi tip (capsula) de uC. Se vedem ce se intampla....

 

Link spre comentariu

Am recitit topicul, inteleg ca nu-ti functioneaza corect pe Atmega 328P, citirea analogica pe pinul A3.

Modificarile soft sunt facute la fel in ambele variante hard, varianta Arduino functioneaza, cea cu Atmega, nu. Fusebitii sunt la fel.

In acest caz ar trebui sa verifici conexiunea pinului PC3 la potentiometru (sau unde e legat), la montajul cu Atmega.

Editat de Marin1960
Link spre comentariu

Ca sa fiu sigur ca nu e vreo problema de soft, am copiat un programel de pe arduino.cc si am scris un Arduino Nano si un Atmega 328 (cu fusebitii similar cu Nano), si intrarea anologica PC3 (A3), functioneaza perfect. De aici ideea cu conexiunea dintre pin si potentiometru.

#define DBM_READING (A3) // potentiometer wiper (middle terminal) connected to analog pin 3
                    // outside leads to ground and +5V
int val = 0;  // variable to store the value read
#define led 13

void setup() {
  Serial.begin(9600);           //  setup serial
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);
}

void loop() {
  val = analogRead(DBM_READING);  // read the input pin
  Serial.println(val);          // debug value
  if(val < 512) digitalWrite(led,LOW);
  else(digitalWrite(led, HIGH));
}

 

Link spre comentariu

Eu cred si apreciez mult dorinta si bunavointa de a ma ajuta. Sincer !

Dar nu e nicio problema la potentiometru. Ca sa fie si mai simplu l-am scos din schema si am conectat, alternativ, portul A3 la +5V si GND ceea ce ar fi trebuit sa deterimine o alternare de la min. la max. pe bargraf-ul display-ului. Pe Arduino Nano asa se intampla, pe Atmega328p , nu !

Stiu ca e ciudat si fara sens , dar asa face si nu inteleg de ce.

Nu se pune problema ca un port ADC n-ar functiona in genaral, ci ca are acest fel ciudat de raspuns in cazul de fata.

Voi face proba si pe Pro Mini ca sa vedem si revin cu impresii. Poate incerc si un video...

Link spre comentariu

Salut! Incearca sa introduci doua variabile de tip "uint_8", sa zicem "adcsra_temp" si "adcmux_temp" in care vei scrie continutul registrilor ADCSRA si ADMUX. Apoi faci analiza continutului celor doua variabile si asa iti poti da seama de ce nu functioneaza citirea pe ADC3. Din pacate in acest moment nu te pot ajuta decat cu sfaturi. Suspectez ca continutul unuia dintre cei doi registri, ADMUX si/sau ADCSRA este alterat si de aici lipsa functionarii.

Link spre comentariu

Aaaa, multumesc mult. Sugestia facuta poate ar fi utila, dar aplicarea ei ma depaseste, fiinca n-am abilitati de programare.

Azi am facut, o proba, pe fuga, cu codul recompilat pentru Pro Mini si....face la fel. Nu citeste ADC-ul... Nu stiu ce sa mai zic...

Probabil o sa refac probele, pe indelete, in weekend sa vad care-i treaba.

Cred ca intre timp o sa incerc sa fac cablajul pentru partea analogica...ca sa stiu ca incep de undeva...

Daca pana la urma nu "vrea" partea digitala decat pe Arduino Nano....o s-o fac asa.

 

Link spre comentariu

Cred ca expresia "Nu citeste ADC-ul..." nu este tocmai fericita.

Nu citeste ADC-ul, din cauza ca nu ajunge sa-l citeasca, se inpotmoleste programul pe undeva.

M-am uitat mai atent pe aplicatie si am vazut ca in bucla loop exista un Serial.println(r) unde r este tocmai rezultatul unei citiri ADC.

void loop()
{
  doMenu();

 // doTuning2();
//  checkButton();

  int r = analogRead(DBM_READING);

  if (r != prev){
    takeReading(centerFreq);
    updateMeter();
    prev = r;
    Serial.println(r);
  }
  delay(50);   
}

In varianta cu Mini, probabil ca ai folosit un convertor de la usb la serial ttl, cu el ai putea sa vezi pana unde "merge" programul tau. Ajunge la linia "Serial.println(r);"? Daca ajunge inseamna ca citeste intrarea ADC3 dar nu ajunge informatia mai departe, daca nu, programul este blocat "undeva pe traseu". E foarte important de stiut daca acea linie este executata sau nu (si cu ce continut, bineinteles).

Link spre comentariu

Eu am avut probleme cu bootloaderul la Mega-urile DIL28. Adică mergeau bine doar cu ăla clasic, nu cu varianta nouă cu Optiboot, respectiv nu aveam comunicaţie corectă pe serial, deşi parametrii erau corecţi, respectiv odată scris prin ISP cu hexul funcţiona dar nu mai puteam rescrie pe serial din nou numai cu ISP. Dacă selectam la programare "Old Bootloader" funcţiona corect.

Valoarea citită pe A3 e zero, maximă sau aleatorie?

Ai măsurat tensiunea pe ARef?

Link spre comentariu

Daaa si eu suspectez ceva de genul asta.

Aseara, pe fuga, printre alte treburi, am incarcat din nou, a nu stiu cate oara, codul pe Arduino Nano, ca sa ma conving.

Merge fara probleme. Pe bune ! Am vrut sa si filmez , dar e complicat rau cu o singura mana...

Acelasi hex, pus pe 328p, nuuuu merge.

Treaba e ca am pus codul si pe Arduino Mini, care are tot 328p in capsula cu 32 de pini si tot nu vrea. Pana acum pare ca doar Arduino Nano e "castigator".

Ma gandesc sa incerc sa pun un bootloader pe Nano, pe Mini (sau pe 328 DIL28) si dupa aia sa incarc din nou codul compilat direct pe Mini cu un adaptor USB TTL. Poate asa ma lamuresc...  

Sper sa reusesc in weekend...

Acum, eu nu vreau sa despic firul in patru. Pana la urma fac proiectul cu Nano si aia e. Dar poate totusi ii dam de cap si pentru altii care s-or lovi de asa ceva.

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări