[OT] PIC, 8051, MCU e CPU varie

come dice lesto anche per me il programma e' scritto bene, ma visto che non funziona facevo ipotesi.
Non mi riferisco a limiti di precisione (che pure ci sono) ma anche ad eventuali overflow che hanno le due funzioni standard ms-us, a memoria mi sembra siano bassi (sui 600 ms ?). Resta il fatto che cmq gli overflow eventuali si presenterebbero anche sui pimi due led.
Ripeto sono solo primi approcci approfonditivi
Sulla sigla non so aiutarti perche' non uso PIC, solo mamma Atmel :slight_smile:

I PIC sono divisi in famiglie, come gli Atmel. I PIC12 sono diversi dai PIC16 che differiscono dai PIC18 ecc.. Sul sito Microchip vedi le caratteristiche comuni. Comunque la famiglia PIC16 mi disse tempo fa AStrobeed che era obsoleta, quindi se puoi sostituiscila con i modelli PIC18.

Detto questo, ocio con l'oscillatore interno dei PIC, ha un casino di cose a cui prestare attenzione per il setup, anch'io ci sbattei la testa all'inizio. Perché poi c'è da considerare il prescaler che usi a seconda della fonte di clock usata.
Per quanto riguarda il delay, non usare quella integrata di funzione, che mi pare sia una semplice funzione basata sull'esecuzione di una istruzione predefinita. Io mi sono rifatto la millis in stile Arduino, per evitare problemi. Nel thread ci dovrebbero essere tra le prime pagine dei codici che misi.

prova a copilare con -00 o con -O1, magari il compilatore erroneamente ottimizza via il delay

Meglio non usare proprio la _delay integrata nel compilatore. Non è affidabile.

ma parlate della _delay_ms e della _delay_us ?
funzioni cosi' importanti universalmente usate in tutti i programmi C hanno problemi ?
Non mi sono mai messo a vedere con un oscilloscopio se sono precise, ma le uso normalmente, si deve solo gestire correttamente la F_CPU perche' su quella si basa, ed essendoci una F_CPU di default nella LibC che puo' essere diversa dalla frequenza del quarzo usato, si possono sbagliare i tempi.

La millis e' altro discorso come ben sai, non e' bloccante, quindi a che pro metterla in campo se di delay bloccante si sta parlando ?

La delay_ms/us non si basa su un timer del micro ma è una funzione che dovrebbe (dico "dovrebbe") usare dei cicli che a tot ms/us eseguono una serie di centinaia/migliaia di semplici istruzioni macchina, che hanno un tempo fisso di numeri di clock per essere eseguite. Ovviamente si spera che il compilatore non ottimizzi il codice, per cui tutto sta, come ti ha detto Lesto, anche a come l'utente chiede di ottimizzare il codice, sperando che l'IDE informi il compilatore di non ottimizzare mai quei cicli, altrimenti saltano le tempistiche. Se io programmo un timer, non c'è compilatore che tenga: se chiedo di mettere un byte in un registro, lui me lo farà sempre, a qualunque livello di ottimizzazione.

insomma, tutto questo per dire che sei libero di usare _delay_ms/us ma io mi ci perderei un attimino a fare una cosina più pulita lo stesso.

in teoria esiste proprioper questo l'istruzione "nop()" che non fa nulla ma perde uno ciclo macchina, e non viene ottimizzata..

AVR dice di non usare NOP() ma delle librerie ad hoc, per i pic non so..

Nel core di Arduino la delayMicroseconds è basata su nop(), e così è anche la delay presente nel core Avr.
Ora non sono a casa e non ho l'ambiente Microchip sotto mano, per cui non so dirti ma credo comunque che anche la delay_ms dei PIC usi lo stesso meccanismo.

ma per tempi così brevi va benissimo. il problema sorge quando si ragiona in ms invece che in us.

Ma esiste una tabella da poter consultare per sapere cosa il compilatore ottimizza e cosa no ? In base ai rispettivi livelli di ottimizzazione.
Perché dovrebbe ottimizzare NOP ? È talmente chiara, l utente la mette per perdere tempo, non per perdere tempo :DD

Io ho provato sia su arduino che su altri ide e la NOP perde il giusto tempo, l'ide arduinica usa un livello alto di ottimizzazione giusto ?

Ma non è possibile/meglio includere dei cicli a vuoto realizzati in assembler in modo che il compilatore non possa ottimizzarli?

la NOP() nasce apposta per non essere ottimizzata, ma se la metti in cicli noon so cosa può succedere.

e zoomx il fulcro della discussione è che no, non puoi mettere istruzioni ASM dato che nessuno assicura che non vengano ottimizzate.

Testato:
Ma esiste una tabella da poter consultare per sapere cosa il compilatore ottimizza e cosa no ? In base ai rispettivi livelli di ottimizzazione.

Forse consultando la documentazione del compilatore.

Perché dovrebbe ottimizzare NOP ? È talmente chiara, l utente la mette per perdere tempo, non per perdere tempo :DD

Non viene ottimizzata la singola istruzione ma i blocchi di codice, come ti ha detto Lesto. Il problema non è "nop" in sé: se la metti nel sorgente, il compilatore la infila anche nel binario senza problemi. Se però spingi l'ottimizzazione, può essere che un compilatore troppo "intelligente", vedendo un ciclo vuoto (immagina un while con dentro una sola nop), inutile, chi ti garantisce che non venga segato via?

Io ho provato sia su arduino che su altri ide e la NOP perde il giusto tempo, l'ide arduinica usa un livello alto di ottimizzazione giusto ?

L'ottimizzazione di Arduino è per la dimensione, se attivi la compilazione verbosa, vedi che ad un certo punto compare "-Os", "s" sta per "size".
Sull'IDE 1.5.x mi pare che dal file platform.txt si possa cambiare l'ottimizzazione.

Ma la Teensy 3.1 con ARM32 Cortex-M4 come vi sembra? PJRC Store
Pinout: Teensy and Teensy++ Pinouts, for C language and Arduino Software
Ha anche una aggiunta a IDE Arduino per programmarlo, molte librerie. Per iniziare su ARM mi pare interessante, non capisco se poi si può passare ad un IDE/compilatore diverso.

Se volete fare una cosa buona e giusta, comprate quel che vi pare ma non usate l'IDE per programmare i micro dei vostri prodotti :wink:
Usate sempre gli IDE ufficiali, e scrivete tutto il codice voi, almeno lo ottimizzate al massimo :wink:

leo72:
Se volete fare una cosa buona e giusta....

dal vangelo secondo matLeo :smiley:

La cosa interessante della Teensy a me pare il poter iniziare con un IDE semplice (Arduinico) come si fa con Arduino.
Poi fatta l'esperienza si potrebbe passare ad un compiler più sofisticato. Come spero per la Zero. Un IDE Arduinico per iniziare ma poi uno più esperto potrebbe passare a un IDE/Compilatore più sofisticato e/o magari ad un RTOS.

il compiler è sempre lo stesso, alla fine dei giri, se stai sul free-open

invece quello che cambia è l'insieme di librerie. Io consiglio anche di studiarsi un rtos come ChibiOS, il fatto che il codice diventi compatibile arduino+cortex+altro val pure qualcosa!

Ho comprato la ST Nucleo F401RE, visto che su ebay un tedesco la vende a prezzo (11,90) competitivo con Farnel e similari con solo 5,50 euro di spedizione.
http://www.ebay.it/itm/281374518227?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1439.l2649

Domanda nuova: ho provato tre semplici sketch e va bene. Però quel che non capisco è come debuggare.
Mi spiego. Negli esempi forniti da Mbed ci sono delle printf() che se non ho capito male dovrebbero essere "dirottate" su seriale. Ora, avendo il cavetto usb collegato ma non un collegamento con connettore SWD, riesco a vedere in qualche modo questi printf() un pò come si fa su Arduino con Serial.print() ? Oppure è obbligatorio STLInk/V2 ?

In teoria la scheda ha già "On-board ST-LINK/V2-1 debugger/programmer with SWD connector"

ci sono 2 vie: dire che la STDOUT è attraverto stlink, oppure usare le fprintf con descrtittore di file che punta al flusso stlink.

come fare ad inizializzare il tutto... guarda chibios, è un RTOS sviluppato tra l'altro da un italiano (molto disponibile sul forum), che permette di usare questo sistema.

Aggiornamento:
con MBED e Nucleo, bisogna solo creare un oggetto Serial, tipo questo esempio e stampare su lui.

#include "mbed.h"
//------------------------------------
// Hyperterminal configuration
// 9600 bauds, 8-bit data, no parity
//------------------------------------
 
Serial pc(SERIAL_TX, SERIAL_RX);
 
DigitalOut myled(LED1);
int main() {
  int i = 1;
  pc.printf("Hello World !\n");
  while(1) {
    wait_ms(1000);
    pc.printf("This program runs since %d seconds.\n", i++);
    myled = !myled;
  }
}

Si compila il programma online, si ottiene un file .bin che si può copiare sulla Nucleo attraverso un driver virtuale (tipo penna usb, bello, copia-incolla !!!) oppure con "STM32 ST-LINK Utility.exe"
Poi anche da Monitor Seriale Arduino sulla porta USB virtuale della Nucleo si vedono le print()

Lo strano è che, 1 alcuni esempi mbed per nucleo hanno una printf() a muzzo senza quel oggetto Serial, 2 ho aggiornato nel workspace online la libreria mbed, altrimenti col cappero che funzionava.