Vai al contenuto
PLC Forum


sorgente arduino in atmel studio si può convertire?


kym

Messaggi consigliati

ho un sorgente con delle istruzioni che mi servono ma è fatto con arduino.

io uso atmel studio, c'è modo di convertirlo in C ?

devo fare delle modifiche non mi basta compilarlo....

 

grazie

Link al commento
Condividi su altri siti


Ho un sorgente o sketch credo si chiami, creato per arduino lo vorrei convertire in C e portarlo dentro ad Atmel studio è possibile in qualche modo?

Link al commento
Condividi su altri siti

il lingaggio di arduino è C/C++ ....non capisco , prova a postare il codice

Se non usi le funzioni del framework Arduino devi conoscere le funzioni e/o built in del micro che stai usando con atmel studio.

Si chiama attività di porting 

Link al commento
Condividi su altri siti

Gli sketch di arduino sono praticamente scritti in "C". Comunque c'è un'opzione di Atmel studio per avere direttamente l'interfaccia con arduino.

 

PS Come moderatore

Non aprire più discussioni sul medesimo argomento.

Ho riunito le due discussioni; continua solo con questa.

Link al commento
Condividi su altri siti

Grazie Livio, non sapevo dove postarlo ho visto dopo anche la sezione arduino.

 

#include <avr/sleep.h>

int led = 0;
boolean On = 1;
int Power __attribute__ ((section (".noinit")));

void PowerDown () {
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  ADCSRA &= ~(1<<ADEN);       // Turn off ADC to save power
  sleep_enable();
  sleep_cpu();
}
 
void setup() {
  Power = !Power;
  if (!Power) PowerDown();
  pinMode(led, OUTPUT);
}

void loop() {
  digitalWrite(led, HIGH);  // LED on
  delay(5000);              // Wait for a second
  digitalWrite(led, LOW);   // LED off
  PowerDown();
}

 

Questo codice (un esempio di poche righe) è scritto con il core Tiny in arduino, se prendo questo codice e lo porto in atmel e cerco di compliarlo mi da una marea di errori non riconosce i comandi.

 

Livo immagino tu ti riferisca al visualmicro, l'ho installato, mi son scaricato pure arduino ma non son riuscito a combinare nulla, se apro i sorgenti in Atmel li vedo, ma usano sempre i comandi arduino e se cerco di compilarlo con atmel mi da errore con arduino mi crea un HEX che se poi vado a metterlo dentro al micro mi dice che è per altro micro (l'ATmega di arduino appunto) anche se io ho specificato nel progetto tiny85 .....  Se li compilo e programmo tramite arduino vanno perfettamente, perché anche l'HEX fatto da arduino mi da errore se cerco di programmarlo tramite atmelstudio

 

Quello interessante è questo: http://www.technoblogy.com/show?ZR2

 

Opportunatamente modificato (Livio ti ricordi il discorso accelerometro?) usa il convertitore analogico/digitale del tiny, cosa che a me servirà prossimamente per un altro progetto e volevo prendere spunti da qui per poi esporre il problema nel forum, anche avendo poi in mano i valori che mi servono in base alla decelerazione.

Link al commento
Condividi su altri siti

Gli errori ci sono perchè, per prima cosa, ti mancano tutte le librie di arduino.

Se vai a vedere i sorgenti delle librerie di arduino vedrai che son scritti in "C".

Link al commento
Condividi su altri siti

le librerie di arduino sono scritte in C/C++ non solo ed esclusivamente in C ....vai a vedere le librerie .

Il fatto di scrivere in C non significa che non supporti e che non ci siano parti di codice scritte in C++ .

Il C non è OOP e le librerie in C si scrivono diveramente dal C++, sintatticamente parlando .

In C non esiste il concetto di classe ed oggetti , rimane tutto alla struttura .In C++ la struttura viene potenziata con l'aggiunta anche di funzioni etc etc etc .

Se vai a vedere la toolchain .....

Dopodichè vengono caricati ,in modo automatico, i moduli di arduino che sono scritti in C/C++ .Questo perchè l'ambiente è scritto su piattaforma Processing che si occupa di includere molte delle librerie arduino , per esempio se usi la print non c'e' bisogno di includere nulla perche lo fa il framework .

Io le librerie le scrivo in C++ e le compilo con il framework arduino non con C++ manualmente con qualche make ....

Link al commento
Condividi su altri siti

Quote

le librerie di arduino sono scritte in C/C++ non solo ed esclusivamente in C ....vai a vedere le librerie

 

Walter gia le idee sono un poco confuse, se poi vai a fare questi distinguo.... Aspetta che stia almeno a galla da solo, poi si può cominciare a correggere lo stile.;)

Link al commento
Condividi su altri siti

Ma visualmicro le carica .... penso.... Se no a che serve?

Cioè, dopo che ho messo visualmicro non mi da più gli stessi errori però per compilarlo, nonostante abbia configurato il path di arduino in visualmicro etc. mi da una marea di errori....

Poi cerca ovviamente l'atmel mega di arduino io invece ho un tiny85 .....

 

A parte che ogni tanto atmel studio mi va in crash da quando traffico con visualmicro e gli sketch.

 

Walter e Livio, detto in due parole: cosa mi conviene fare?  cercare di capirci tra arduino e atmel studio o separare le due cose senza cercare di andare dritto per la strada di atmel studio? visualmicro e per portarmi dentro atmelstudio sorgenti e librerie di arduino che vantaggi mi darebbe? io pensavo addirittura si potesse convertire poi in atmel studio ma ho capito che non è possibile per le diverse librerie.

 

Ho visto che comunque arduino usa librerie AVR che sono le stesse di atmelstudio ma poi i comandi base non c'entrano niente.

 

Tieni presente che son 3-4 giorni che ho in mano sta "roba" e che non ho mai programmato un atmel in vita mia fino a 3-4 giorni fa.

Avevo molti anni fa approcciato con i PIC modificando qualche sorgente già fatto ma niente di mio.

Link al commento
Condividi su altri siti

Livio . non c'entra niente stare a galla o meno ...

Ho copiato ed incollato il tuo codice in Atmel Studio 6.2 + Visual Micro , configurazione che uso per il WSystem , e compila tutto senza problemi.

Devi selezionare Arduino Uno dalla tendina di visual micro perche se compili per Arduino Due , per esempio, ti da' errori in quanto il compilatore e tutta la tool chain è diversa e di conseguenza anche tutti i file header del sistema. 

Prova a compilare per arduino uno e vedi cosa esce .In alcuni casi includere ed usare dei file header con relativi funzioni da errore perchè sono già implementati dal framework direttamente senza che tu lo sappia ....

Link al commento
Condividi su altri siti

Quote

Livio . non c'entra niente stare a galla o meno ...

 

C'entra, centra.

Potevi dirlo subito cosa doveva fare.;)

Link al commento
Condividi su altri siti

il service con la gente arrogante lo faccio gia durante le ore lavorative ;)

Quando scrivo un messaggio qui , talvolta lo inizializzo ma non lo invio finchè non faccio altre cose o prove .

Io do sempre fiducia all'essere umano , in questo caso presumo che l'utente sappia selezionare la scheda di interesse.

Poi approfondisco ....

 

Link al commento
Condividi su altri siti

Allora....

 

stamattina si è aggiornato il framework di atmelstudio 7 ....

 

ora per esempio se clicco su crea nuovo progetto arduino non mi da più il messaggio d'errore che mi dava ieri e dovevo fare il passaggio nuovo progetto e poi dopo selezionare arduino ed è li che a volte si piantava, ora funziona regolarmente dalla sua funzione iniziale.

 

Quindi ho proceduto così:

 

nuovo progetto arduino direttamente dall'icona arduino

(non si è piantato :-)

incollato il listato

settato nelle proprietà del progetto simulatore e attiny85 (ora nella barra di visualmicro non vedo più atmel328)

però ad ogni tentativo di build&upload o anche solo build cambia e diventa ATMEGA2560

nelle proprietà di visualmicro ho dovuto mettere attiny85 (ho aggiunto l'estensione ad arduino per il tiny85, io non ho aduino ma il tinyusb)

provato a fare build oppure build&upload mi risponde questo:

 

Compiling debug version of 'Test' for 'ATtiny w/ ATtiny85'

Test.ino:In function 'void setup()

Test.ino:14:57: error: 'Serial' was not declared in this scope

:void setup() {

debugger: The error shown above might be caused by invalid breakpoint syntax?

Error compiling project sources

 

14:57 dovrebbero essere le righe? linea 14 corrisponde ma 57 cosa rappresenta?

però se vado con lo start senza debug funziona, programma il micro e il led lampeggia 

però lo stesso listato in arduino ide nativo non da errori.....

non è che ci sono ancora problemi con le versioni di atmelstudio? io uso la 7 ed ho visto che visualmicro per atmel è defunto tra le altre cose....:-(

 

ps: ho modificato loop

 

void loop() {

digitalWrite(led, HIGH); // LED on

delay(1000); // Wait for a second

digitalWrite(led, LOW); // LED off

delay(1000);

loop();

}

Link al commento
Condividi su altri siti

Ho reinstallato atmelstudio e visualmicro.....

Installato prima l'aggiornamento di atmelstudio e SOLO dopo visualmicro.

 

Adesso funziona, non si pianta più niente.

Sto approfondendo un po' tutto, anche se in questi giorni ho poco tempo.

L'esempio su l'ho abbandonato (non ho capito dove era il problema ma non ha senso perderci tempo) 

Quindi mi son dedicato a qualcosa di più interessante un pushbutton 4 in 1.

 

Per ora voglio studiarlo e fare delle prove, poi chiederò aiuto se non riesco a fare una modifica particolare nel listato.

Timerizzare un solo pulsante, ci sono riuscito, il timer funziona ma avviene qualcosa di strano:

 

click singolo ON-----> off dopo 5 secondi.

click singolo non succede niente ---> il micro interpreta il click come lo spegnimento (non memorizza lo spegnimento dato dal timer)

click singolo ON-----> off dopo 5 secondi

 

e la cosa si ripete, e non capisco dove è l'arcano che tiene in memoria che prima era ON e quindi il timer lo mette OFF senza interrompere la funzione o il conteggio dei decimi di secondo che contano se click singolo, doppio, prolungato o molto prolungato. Dopo il timer OFF se clicco deve accendersi senza che debba cliccare due volte.

 

Approfondiremo più avanti ora voglio un po' studiare.

 

Vorrei però una delucidazione da chi programma, mi pare di capire che sia Livio che Walter conoscono molto bene questi sistemi Atmel.

La domanda è sul debug:  quando io faccio il debug mi indica i punti break e mi controlla gli errori, ma finisce li.

 

Io per esempio ho un listato di cui non riesco a capire dopo una funzione dove si ferma il micro, insomma vedere in che punto del listato è al momento e tutti i passi che compie durante il funzionamento: esempio doppio click vorrei vedere tutto a video, riga per riga ad ogni input che do al micro che parte del listato interviene.

 

Si può fare? Come?  con la JTAG ?

 

Vorrei sapere se è questo l'oggetto del desiderio:  http://www.waveshare.com/product/mcu-tools/avr/programmers-debuggers/usb-avr-jtagice-xpii.htm

 

E se quello che chiedo è possibile, con ATtiny85 e con quale collegamento perché in caso affermativo prenderei il suddetto programmatore invece del classico mk2 (usbtiny è molto limitato in atmelstudio).

 

Mi si è aperto un mondo :-)  un solo 8pin al posto di quasi 40 componenti per fare dei timer e bottoni mi facilita moltissimo e scatena la mia fantasia.

 

 

Link al commento
Condividi su altri siti

Stavo provando ad usare la libreria di Walter  (Wtimer)

 

mi chiedevo, funziona solo da loop? a me servirebbe un timer messo qui che mi mandi alta un uscita per X secondi.

 

void clickEvent_on() {
      mytimers.runTimers(millis());
      mytimers.timer[1].Start;
      digitalWrite(ledPin1,mytimers.timer[1].Done);

}

 

Ho provato così ma non va....

Ho ovviamente messo nel setup la configurazione del timer

 

 mytimers.presetTimer(1,3000,TOF);
 mytimers.initTimers(millis());

 

e l'include all'inizio.

 

#include <WTimer.h>

WTimer mytimers;

 

Vorrei capire anche una cosa:   alcuni codici (sempre timer e bottoni)  necessitano di mandare a livello basso il pin del bottone, altri a livello alto (esempio WTOF) pur avendo le stesse identiche istruzioni e comandi di altri codici.... dipende dalle librerie utilizzate? sta cosa non l'ho capita.

Link al commento
Condividi su altri siti

Se usi le librerie standard bloccano il processo.

Tevi usare un interrupts legato ad un timer; io solitamente uso per queste cose timer1 con interrupt a 10ms così da avere una granularità sufficientemente fine ma senza interrompere troppo frequentemente il programma.

Link al commento
Condividi su altri siti

mi daresti un esempio da cui attingere di un timer che usi?

 

Livio con il programmatore che dico su, AVR DEBUGGER, JTAG etc. posso fare quello che penso o .... vorrei qualcosa che non esiste?

Cosa posso fare nel debug con questo dispositivo? cosa posso vedere?

http://www.waveshare.com/product/mcu-tools/avr/programmers-debuggers/usb-avr-jtagice-xpii.htm

Link al commento
Condividi su altri siti

Per quello che lo fan pagare dovresti poter fare tutto, anche il caffè.:smile:

Bisognerebbe leggere le specifiche complete ma mi aspetto che tu possa mettere almeno un breaek point, vedere lo stato dei registri, memorie, istruzioni, etc.

 

void setup 
 {
  ------
  noInterrupts();           // disable all interrupts
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 6491;   // preload timer
  TCCR1B |= (1 << CS12);    // 256 prescaler
  TIMSK1 |= (1 << TOIE1);   // enable timer overflow interrupt
  interrupts();             // enable all interrupts
  -------
 }

ISR(TIMER1_OVF_vect)        // interrupt service routine
  {
    TCNT1 = 64911;   // preload timer per interrupts ogni 10 ms  
   /* routine di servizio interrupt*/
  }

 

Link al commento
Condividi su altri siti

Infatti nel tiny85 non va... Vanno cambiati un sacco di parametri ho dato un occhiata sui datasheet ma mi son perso con un bit del registro B che non c'è proprio o non ho capito io bene i dettagli. Non ho nemmeno arduino per provare. 

 

Il wtof non son riuscito a farlo andare dentro un evento... Se lo metto in loop mi inverte polarità del bottone e mi rimane bloccato fino a quando non finisce ovvero gli altri eventi non vanno idem l'interruzione. 

 

Come me funziona il debug con il programmatore che ho linkato più su? Via seriale? Per sapere che sta facendo il micro va bene? 

Link al commento
Condividi su altri siti

Come funziona non lo so di preciso; posso immaginare che lavori come tutti gli "in circuit" in cui il processore dello strumento fa avanzare il processore target di un passo alla volta e, arrivato al punto di stop, si fermi. Infatti lavorando sotto emulatore il programma è un poco più lento.

Link al commento
Condividi su altri siti

kym , sinceramente non ho ancora capito cosa stai facendo ....i WTimer sono forniti con i sorgenti , ho scritto gli esempi , ho fatto dei video , ho fatto altri video in cui li suo ....non lo so ....se hai un evento setti nel suo interno un bit e con questo fai partire il timer , quando hai il done fai quello che vuoi , e' logica 

Link al commento
Condividi su altri siti

Il problema Walter è che io sono pochi giorni che sono entrato in questo mondo della programmazione, faccio parecchia fatica a comprendere quello che mi dici, per te è semplice ma per me è quasi (lingua che ora non pronuncio per rispetto alle vittime)....

 

Io ho un sorgente che funziona con ATtiny85   http://forum.arduino.cc/index.php?topic=14479.0

 

Funziona tutto, io l'ho modificato qui:

 

void loop() {
    // Get button event and act accordingly
    int b = checkButton();
    if ((b == 1) && digitalRead(ledPin1) == LOW) clickEvent_on();
    else
    if ((b == 1) && digitalRead(ledPin1) == HIGH) clickEvent_off();
    if (b == 2) doubleClickEvent();
    if (b == 3) holdEvent();
    if (b == 4) longHoldEvent();

 

in modo da avere due differenti eventi per il click singolo

 

ed ho modificato il primo richiamo ed aggiunto il secondo in modo da non avere il riconoscimento dello stato precedente del bottone ma un controllo sul led se acceso o spento ed avere la possibilità una volta inserito un timer nel clickEvent_on  (12 minuti) che io possa disattivare tutto premendo nuovamente il bottone con singolo click.

 

void clickEvent_on() {
//    ledVal1 = !ledVal1;
//    digitalWrite(ledPin1, ledVal1);
      mytimers.timer[1].Start;
      digitalWrite(ledPin1,mytimers.timer[1].Done);
}   
void clickEvent_off() {
//    ledVal1 = !ledVal1;
//    digitalWrite(ledPin1, ledVal1); 
      digitalWrite(ledPin1, LOW); 

 

Ho provato a mettere il TOF dentro l'evento ovviamente dopo aver messo il richiamo nel loop, ho provato in diversi modi ma non son riuscito nell'intento.

Devo dire un'altra cosa:  il TOF il file di demo e l'esempio seguendo il tutorial necessita per partire di un livello alto al pin del pulsante invece questo sorgente usa il livello basso quindi il pulsante è a massa.

 

Quindi quando nello stesso micro carico il demo TOF devo cambiare la configurazione elettrica per dare allo stesso pin un +5 invece di una massa.

Quando ho messo tutto il TOF nel loop o si blocca tutto e non vanno nemmeno le altre funzioni (doppio click, etc) oppure mi rimane il led fisso acceso senza che si possa più spegnere, presumo per la differente polarità del pulsante, forse rilevando il livello alto che è sempre alto ad aspettare quello basso il TOF sta fisso come se tenessi premuto costantemente il pulsante.

 

La seconda modifica che vorrei poter studiare e fare è dividere (cosa che l'autore invece ha unito) i due ultimi eventi:

 

se io tengo premuto il bottone più di 1 secondo scatta evento 3 .....

se io tengo premuto il bottone più di 3 secondi scatta prima evento 3 dopo 1 secondo e poi evento 4 dopo 3 ....

 

Io li vorrei isolati:

 

se premo più di 3 secondi non deve scattare anche evento 3 ma solo il 4 ....

 

Perché succede questo:

 

per accendere SOLO evento 4 io devo fare così:

 

tenere premuto più di 3 secondi il pulsante e mi ritrovo acceso evento 3 e 4 poi premere più di 1 secondo per spegnere il 3..

 

e per spegnere devo per forza passare dall'accensione del 3 (premere più di 3 secondi comporta si lo spegnimento del 4 ma anche l'accensione del 3).

 

 

 

 

Link al commento
Condividi su altri siti

Quote

Come funziona non lo so di preciso; posso immaginare che lavori come tutti gli "in circuit" in cui il processore dello strumento fa avanzare il processore target di un passo alla volta e, arrivato al punto di stop, si fermi. Infatti lavorando sotto emulatore il programma è un poco più lento.

 

Ma io a video riesco a vedere esattamente dove è il programma?

 

tipo:  digitalWrite(rel1, HIGH)

         delay(300000)

 

Io a video vedo che è fermo al delay o devo mettere delle istruzioni per scrivere sulla seriale istruzione per istruzione in modo che comunica con il software (AtmelStudio) tramite la seriale? o viene visto in altra maniera?

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...