Vai al contenuto
PLC Forum


Rabbit (Progetto on-line)


Gabriele Riva

Messaggi consigliati

  • 1 month later...

  • Risposte 400
  • Created
  • Ultima risposta

Top Posters In This Topic

  • walterword

    154

  • dlgcom

    85

  • Livio Orsini

    46

  • ifachsoftware

    36

E' ARRIVATO FINALMENTE!!!! :D

Mi e' arrivato il tool di sviluppo ... dopo tante peripezie....

Per motivi di urgenza dovro' gia' iniziare ad usarlo .

Il mio primo obbiettivo ( a parte capire come funziona :blink: ) e' di preparare una rete 485 per comunicare con stazioni che saranno dotate di un PIC .

Il secondo di interfacciare una memoria COMPACT FLASH per avere un archivio di eventi.

Il terzo di interfacciare il tutto con un PC , a questo punto le strade sono due : usare le potenzialita' di rete del rabbit o creare un interfaccia tipo scada con VB ... allaciandosi al progetto di Livio.

In tutti i modi , io credo molto in questi moduli per la loro potenza e versatilita'.

Spero che i vecchi adepti :P di questo progetto siano ancora in attivita' per poter scambiare idee ....

Io ho anche avuto fortuna ... comprandolo qui in Brasile ... ho ricevuto anche l'alimentatore :lol::lol:

Chissa' se possiamo aprire un direttorio per depositare i risultati delle esperienze...

Saluti

Link al commento
Condividi su altri siti

Non siamo rimasti in tanti. Io sto preparando qualche cosa sia HW che SW. Avevo anche ipotizzato, nel prosiego del lavoro sugli scada, di interfacciare il Rabbit in ethernet usando VB, sulla falsariga dell'esempio di Tanzilli.

Comunque i miei tempi non hanno certo l'urgenza dei tuoi. Io ho già sperimentato alcune cosa, anche se al momento sono un po' fermo. Sono comunquue disponibibile per scambi di idee.

Auguri di Buon Natale e Felice 2003 (tra l'altro dalle tue parti dovrebbe essere piena estate o sbaglio?)

Link al commento
Condividi su altri siti

Nei prossimi giorni dovrei incontrare Igor & co e vediamo di definire una qualche linea per procedere.

Io delle prove le ho fatte sia come gestione I/O che come gestione di Web Server.

Il problema e' sempre quello del tempo.

Ciao a tutti :)

Link al commento
Condividi su altri siti

Pochi ma buoni... io iniziero propio in queste ferie a studiare e realizzaree qualche cosa in pratica.

Il mo progetto e' collegare un carsosello in rete 485 per scambiare dati tra un master e 26 stazioni .

Questo master ha il compito di gestire il movimento e la priorita' di ogni stazione .

In piu' come ultimo stadio , poter interfacciare il master con una rete locale , per mostrare allarmi e lo stato delle stazioni nel PC della manutenzione.

Per rendere le cose piu', difficili , dovro' fare un ponte radio tra il master e i PC , putroppo il master e' sempre in movimento....

Ma sara una bella sfida...

Buon Natale e felice anno nuovo ... si qui siamo in estate , infatti la notte del 31 e' in progetto di fare il " tradizionale " bagno al mare quando scatta la mezzanotte ....

Saluti

Link al commento
Condividi su altri siti

Ti stai ponendo degli obiettivi abbastanza importanti , speriamo di venire a capo anche della documentazione del Rabbit che e' vasta ma purtroppo non troppo chiara ed approfondita.

Io in queste feste spero di riuscire a provare finalmente la comunicazione in RS232 (figli permettendo) ...

Ciao :)

Link al commento
Condividi su altri siti

Io sto preparando L'HW degli out analogici ed i relativi driver, oltre al disaccoppiatore opto per gli ingressi encoders.

Spero di aver pronto qualche cosa a fine gennaio, cmq sentiamoci periodicamente.

PS per ifach: salutami IGOR

Buone Feste a Tutti

Link al commento
Condividi su altri siti

Ciao a tutti,

Sono un analista/programmatore software, ma con una passione sfrenata (anche se poco applicata, purtroppo) per l'elettronica digitale.

Le mie prime esperienze con i microcontrollori sono state scolastiche, ma molto interessanti e pratiche, grazie ad un ottimo docente. Una basetta di programmazione con uno Z80 e' stata la mia scuola.

Un amico mi ha di recente parlato dei microcontrollori della Rabbit e di questo progetto e il tutto mi ha subito entusiasmato. Ci stiamo apprestando ad ordinare il kit e, sebbene i nostri obiettivi iniziali siano leggermente diversi da quelli che vi proponete in questo progetto, credo si possa instaurare una buona collaborazione.

In queste ferie ho gia' letto buona parte della documentazione scaricabile dal sito Rabbit, per cui spero di riuscire ad essere operativo appena il kit arrivera' nelle mie mani :-)

A risentirci presto,

Stefano Carboni

Modificato: da NULL
Link al commento
Condividi su altri siti

Una basetta di programmazione con uno Z80 e' stata la mia scuola

Allora ti do una bella notizia , li set di istruzioni del Rabbit e' derivato dallo Z80 !

Anche io ho iniziato con questo processore , addirittura ho costruito in micro di NE , il primo quello in esadecimale!

Se leggi il manuale d'uso del rabbit 3000 vedrai che ci sono molte analogie con lo z80.

Anche io sono immerso nella lettura dei manuali , la gestione della memoria non e' una cosa semplicissima , ma per fortuna il dinamic C aiuta un bel po'

Per i moderatori , potremmo aprire un "sottoforum" ;) per il rabbit . cosi avremmo un punto di rifeimento dove depositare i risultati delle nostre peripezie .... potrebbe essere nella sezione ELETTRONICA.

Coraggio Livio , vedi che non e' del tutto morto questo progetto!!

... poi ora che so che e' il nipote dello Z80 , mi sembra di tornare alla mia giovinessa boia ve':D

Link al commento
Condividi su altri siti

Se leggi il manuale d'uso del rabbit 3000 vedrai che ci sono molte analogie con lo z80.

E' proprio questo che mi piace. Ed anche la programmazione in C e' un fattore che mi attrae.

Ho notato anch'io che la gestione della memoria non e' molto semplice. Neppure la gestione della Flash e' semplicissima, sebbene la possibilita' di vederla come file system puo' semplificare le cose a seconda del tipo di applicazione.

Appena arrivera' il kit cerchero' di fare qualche prova soprattutto in questo senso, visto che altri stanno gia' facendo prove di I/O.

Un buon 2004 a tutti :-)

Saluti,

Stefano Carboni

Link al commento
Condividi su altri siti

Coraggio Livio , vedi che non e' del tutto morto questo progetto!!
Io ci spero; se siamo in tanti potrebbo ottenere buoni risultati con minor fatica

Per i moderatori , potremmo aprire un "sottoforum"  per il rabbit ....

Questo forum è specifico per rabbit, anche se è nato per un progetto on line indefinito, si è oramai stabilizzato, lo dice anche il nome del forum: "Rabbit".

Sembra che il 2004 sia foriero di novità positive!

LazyBoy ("lazzarone") potresti raccontare, brevemente, gli obbiettivi che ti proponi di realizzare con rabbit? Magari potremmo trovare qualche obbietivo comune e così potremmo risparmiare energie.

Link al commento
Condividi su altri siti

Vi comunico che sono riuscito a gestire la seriale con modulo autocostruito.

Nel codice che allego c'e' un esempio di gestione lampeggi + send seriale su porta B con convertitore autocostruito che allego come schema nell'area download + gestione antirimbalzi (Debounce).

Spero che uploadi anche qualcun altro del codice ....

Ciao a tutti

/* IFACH Software - Calpe , Costa Blanca
   -------------------------------------

   Program name : ProvaRS232.C
   Last Update  : 30/Dec/2003
   Language ... : Dynamic C SE   
   Edit by .... : Claudio Rossi ... Rouge
                  (I love when a software comes together !)
   Features ... : Test Uscite RCM3010                               
                  07/Sep/2003 Versione con Out funzionanti (Finalmente !)
                  30/Dec/2003 Prova Seriale
   
*/

//#use rcm3000.lib      // Libreria da includere per gestire la seriale

#class auto             // Place local variables on the stack.

/*
   Port    Function            I/O  I/O State
   ====    =============================  ======    ===========================================
   PA0    Configurable external I/O bus  Output    High when not driven by I/O bus
   PA1    Configurable external I/O bus  Output    High when not driven by I/O bus
   PA2    Configurable external I/O bus  Output    High when not driven by I/O bus
   PA3    Configurable external I/O bus  Output    High when not driven by I/O bus
   PA4    Configurable external I/O bus  Output    High when not driven by I/O bus
   PA5    Configurable external I/O bus  Output    High when not driven by I/O bus
   PA6    Configurable external I/O bus  Output    High when not driven by I/O bus
   PA7    Configurable external I/O bus  Output    High when not driven by I/O bus
   PB0    Not used            Input  Pulled-up on core
   PB1    Not used            Input  Pulled-up on core
   PB2    Configurable external I/O bus  Input  Pulled-up on core when not driven by I/O bus
   PB3    Configurable external I/O bus  Input  Pulled-up on core when not driven by I/O bus
   PB4    Configurable external I/O bus  Input  Pulled-up on core when not driven by I/O bus
   PB5    Configurable external I/O bus  Input  Pulled-up on core when not driven by I/O bus
   PB6    Not used            Output    High when not driven by I/O bus
   PB7    Not used            Output    High when not driven by I/O bus
   PC0    Not used            Output    High
   PC1    Not used            Input  Pulled-up on core
   PC2    TXC          Output    High when not driven by RS232 
   PC3    RXC          Input  Pulled-up on core when not driven by RS232
   PC4    TXB          Output    High when not driven by RS232
   PC5    RXB          Input  Pulled-up on core when not driven by RS232
   PC6    TXA          Output    High when not driven
   PC7    RXA          Input  Pulled-up on core when not driven 
   PD0    Realtek RSTDRV          Output    High when not driven by ethernet
   PD1    Not used            Input  Pulled-up on core
   PD2    Not used (jumper not installed)    Output    High 
   PD3    Not used (jumper not installed)    Output    High 
   PD4    Not used            Output    High
   PD5    Not used            Input  Pulled-up on protoboard
   PD6    Not used (jumper not installed)    Output    High 
   PD7    Not used (jumper not installed)    Output    High 
   PE0    Not used (jumper not installed)    Output    High
   PE1    Not used            Output    High
   PE2    Realtek  AEN          Output    High when not driven by ethernet
   PE3    LCD device select      Output    Low
   PE4    Infrared device speed select  Output    Low
   PE5    Not used            Output    High
   PE6    External I/O Strobe        Output    High when not driven by LCD/Keypad
   PE7    Not used            Output    High
   PF1    Not used - future Motor/Encoder    Input  Pulled-up on protoboard
   PF2    Not used - future Motor/Encoder    Input  Pulled-up on protoboard
   PF3    Not used - future Motor/Encoder    Input  Pulled-up on protoboard
   PF4    Not used - future Motor/Encoder    Input  Pulled-up on protoboard
   PF5    Not used - future Motor/Encoder    Input  Pulled-up on protoboard
   PF6    Not used - future Motor/Encoder    Input  Pulled-up on protoboard
   PF7    Not used - future Motor/Encoder    Input  Pulled-up on protoboard
   PG0    Switch S3 (normally open)      Input  Pulled-up on protoboard    (PULSANTE 1)
   PG1    Switch S2 (normally open)      Input  Pulled-up on protoboard    (PULSANTE 2)
   PG2    TXF          Output    Pulled-down when not driven by infrared
   PG3    RXF          Input  Driven by infrared driver  (LED3)
   PG4    Infrared device MD1        Input  Pulled-up on protoboard
   PG5    Infrared device MD0        Input  Pulled-down on protoboard
   PG6    LED LED1            Output    High                       (LED1)
   PG7    LED LED2            Output    High                       (LED2)        
*/

nodebug 
void MyBrdInit()
{
    // configure Port A
    // use SPCR to enable and disable external I/O data bus

    WrPortI(PADR, &PADRShadow, 0xFF);          // set to output all high
    WrPortI(SPCR, &SPCRShadow, 0x84);          // ignore SMODE pins, set to output
    
    // configure Port B
    // use SPCR to enable and disable external I/O address bus

    WrPortI(PBDR, &PBDRShadow, 0xC0);          // set bits 7,6 to output high
                      // bits 5-0 are normally inputs  
    
    // configure Port C
    // serial port A communicates with Dynamic C
    // using serXopen in application code will configure serial ports B and C automatically
    // so configuration not needed here

    WrPortI(PCDR, &PCDRShadow, PCDRShadow|0x15);  // set bits 4,2,0 high
    WrPortI(PCFR, &PCFRShadow, PCFRShadow&0xEA);  // clear bit 4,2,0 to normal function
                    // bits 5,3,1 normally inputs

    // configure Port D
    // using ethernet applications will automatically configure bit 0 for strobe
    // so not configured here

    WrPortI(PDCR, &PDCRShadow, PDCRShadow&0x00);  // clear all bits to pclk/2
    WrPortI(PDFR, &PDFRShadow, PDCRShadow&0x00);  // clear all bits to normal function
    WrPortI(PDDCR, &PDDCRShadow, PDDCRShadow&0x2D);    // clear bits 7,6,4,3,2,0 drive high and low
    WrPortI(PDDR, &PDDRShadow, PDDRShadow|0xDD);  // set bits 7,6,4,3,2,0 output high
    WrPortI(PDDDR, &PDDDRShadow, PDDDRShadow|0xDD);    // set bits 7,6,4,3,2,0 to output
    WrPortI(PDDDR, &PDDDRShadow, PDDDRShadow&0xDD);    // clear bits 5,1 to input

    // configure Port E
    // using LCD/Keypad applications will automatically configure bit 6 for external I/O strobe
    // so not configured here
    // using ethernet applications will automatically configure port bit 2 for strobe
    // so not configured here

    WrPortI(PECR, &PECRShadow, PECRShadow&0x00);  // clear all bits to pclk/2
    WrPortI(PEFR, &PEFRShadow, PECRShadow&0x00);  // clear all bits to normal function
    WrPortI(PEDR, &PEDRShadow, 0xE7);        // set bits 7,6,5,2,1,0 output high and
                    // set bits 4,3 output low
    WrPortI(PEDDR, &PEDDRShadow, PEDDRShadow|0xFB);    // set bits 7,6,5,4,3,2,1,0 to output

    // configure Port F
    // originally for motor/encoders but for anything here

    WrPortI(PFCR, &PFCRShadow, 0x00);        // clear all bits for pclk/2
    WrPortI(PFFR, &PFFRShadow, 0x00);        // clear all bits for normal function
    //WrPortI(PFDCR, &PFDCRShadow, ???);    // future bit drive output
    //WrPortI(PFDR, &PFDRShadow, ???);        // future bit output
    WrPortI(PFDDR, &PFDDRShadow, 0x00);        // clear all bits to input

    // configure Port G
    // infrared device sample program will configure serial port F
/*
    WrPortI(PGCR, &PGCRShadow, 0x00);        // clear all bits for pclk/2
    WrPortI(PGFR, &PGFRShadow, 0x00);        // clear all bits for normal function
    WrPortI(PGDCR, &PGDCRShadow, PGDCRShadow|0xC0);    // set bits 7,6 drive open drain
    WrPortI(PGDR, &PGDRShadow, PGDCRShadow|0xC0);    // set bit 7,6 output high
    BitWrPortI(PGDCR, &PGDCRShadow, 0, 2);    // clear bit 2 drive output
    BitWrPortI(PGDR, &PGDRShadow, 0, 2);    // clear bit 2 output low
    WrPortI(PGDDR, &PGDDRShadow, 0xC4);        // set bits 7,6,2 to output and
                                                 // clear bits 5,4,3,1,0 to input

   PG0    Switch S3 (normally open)      Input  Pulled-up on protoboard    (PULSANTE 1) A
   PG1    Switch S2 (normally open      Input  Pulled-up on protoboard    (PULSANTE 2) B
   PG2    TXF          Output    Pulled-down when not driven by infrared
   PG3    RXF          Input  Driven by infrared driver  (LED3)
   PG4    Infrared device MD1        Input  Pulled-up on protoboard
   PG5    Infrared device MD0        Input  Pulled-down on protoboard
   PG6    LED LED1            Output    High                       (LED1)
   PG7    LED LED2            Output    High                       (LED2)    

*/

    WrPortI(PGCR , &PGCRShadow , 0x00);        // clear all bits for pclk/2
    WrPortI(PGFR , &PGFRShadow , 0x00);        // clear all bits for normal function
    WrPortI(PGDCR, &PGDCRShadow, 0xC8);              // Out 3,7,6 open drain
    WrPortI(PGDR , &PGDRShadow , PGDCRShadow|0xC8);    // set bit 3,7,6 output high
    WrPortI(PGDDR, &PGDDRShadow, 0xC8);        // 3,7,6 = Uscite gli altri = Input                                                
}

// Definizioni costanti

#define LED1 6         // LED 1 port G bit 6
#define LED2 7         // LED 2 port G bit 7
#define LED3 3         // LED 3 port G bit 3

#define PULS1  0      // SWITCH 2 port G bit 0
#define PULS2  1      // SWITCH 1 port G bit 1

#define BINBUFSIZE  15   // Dimensione Rx Buffer RS232 Port B
#define BOUTBUFSIZE 15   // Dimensione Tx Buffer RS232 Port B

void LedGOn(int led)
{
    BitWrPortI(PGDR, &PGDRShadow, 0, led);
}

void LedGOff(int led)
{
    BitWrPortI(PGDR, &PGDRShadow, 1, led);    
}

cofunc flashled[2](int led, int ontime, int offtime)
{
    LedGOn(led);
    waitfor(DelayMs(ontime));
    LedGOff(led);
    waitfor(DelayMs(offtime));
}

void main()
{
   auto int sw1;
   auto int Debounce;

    MyBrdInit();                  // Inizializza il modulo

    serBopen(115200);                   // Setta Baudrate
    serBparity(PARAM_NOPARITY);         // Parity None
   serBdatabits(PARAM_8BIT);           // 8 Bit di Dati
    serBwrFlush();                      // Svuota Buffer Trasmissione
    serBrdFlush();                      // Svuota Buffer Ricezione

   sw1 = 0;
   Debounce = 1;                       // Pulsante di Debounce
   
    for(;;)
    {
  costate
  {    
         if(!Debounce)
         {
        if (!BitRdPortI(PGDR, PULS2)) abort;    // Controlla se PULS2 e' Premuto
            serBputs("IFACH Software - Calpe , Costa Blanca\n");    // Invia s sulla seriale B
            serBputs("Welcome to the Rabbit !\n");                  // Invia s sulla seriale B            
            Debounce = 1;                       // Attiva debounce
         }
         else  // Se Debounce attivo 
         {
        if (!BitRdPortI(PGDR, PULS2))           // Controlla pulsante rilasciato
            {
               Debounce = 0;
            }
         }

         
  }    

  costate
  {    
      if (BitRdPortI(PGDR, PULS1)) abort;  // wait for switch PULS1 press
      waitfor(DelayMs(5));             // switch press detected if got to here
      if (BitRdPortI(PGDR, PULS1))            // wait for switch release
      {
    sw1=!sw1;                  // set valid switch
      BitWrPortI(PGDR, &PGDRShadow, sw1, LED3);
    abort;
      }
  }
    
  costate
  {        
       wfd
       {
    // 50 ms on/off
    flashled[0](LED1,50,50);  // flashes LED1 (PG6)
     }
  }
  
  costate
  {
      wfd
      {
    // 200 ms on/100 ms off
    flashled[1](LED2,200,100);    // flashes LED2 (PG7)
      }
  }
    }
}

Modificato: da Gabriele Corrieri
Link al commento
Condividi su altri siti

LazyBoy ("lazzarone") potresti raccontare, brevemente, gli obbiettivi che ti proponi di realizzare con rabbit? Magari potremmo trovare qualche obbietivo comune e così potremmo risparmiare energie.

L'idea e' quella di realizzare un sistema modulare di home automation.

Lo so, in commercio ce ne sono tanti, ma a qualcuno manca qualcosa, altri costano un occhio nella testa.

Inoltre, se si sceglie un sistema, si deve fare tutto con i pezzi forniti da quella casa.

Facendo qualche conto ci siamo resi conto che, progettando un sistema del genere in casa, si risparmierebbe parecchio ed inoltre si potrebbe fare tutto quello che ci passa per la testa.

L'obiettivo principale e' quindi progettare un sistema con il core del rabbit che consenta l'aggiunta semplice di schede I/O.

Per aumentare le capacita' I/O del rabbit e vista la relativamente bassa velocita' di risposta necessaria in un sistema home, ho pensato di multiplexare gli I/O per aumentarli, visto che da un rapido calcolo eseguito i punti necessari avrebbero superato quelli forniti dal controllore.

Direi che in questo progetto, la parte maggiore la dovra' fare il software perche', a parte l'utilizzo di qualche ADC o DAC, il resto sono parti elettronicamente semplici.

Il tutto dovra' essere ovviamente progettato utilizzando componenti economici e facilmente reperibili.

La ricerca e' gia' cominciata e alcuni punti li abbiamo gia' risoliti e/o decisi.

L'applicare poi tutto questo a livello industriale e' sicuramente interessante, ma vista la non abbondante richiesta in questo campo nella nostra zona, e' un obbiettivo che dobbiamo ahime' posticipare :-)

Il secondo obiettivo e' poi quello di interfacciare il sistema di gestione con un modem gsm o gprs per la gestione remota.

Link al commento
Condividi su altri siti

Bel colpo Ifach, chiudi bene il 2003! Penso di sfruttare presto le tue routines per fare delle prove di comunicazione.

Per LazyBoy.

I tuoi obbiettivi coincidono in buona parte con lo scopo iniziale del progetto: realizzare un controllore per ambiente industriale.

Un paio di appunti sulle tue ipotesi di soluzione.

Si è vero che i tempi di risposta, richiesti della domotica ,sono più lunghi dei corrispettivi medi richiesti dall'automazione industriale, questo però non implica che la scelta di multiplexar gli I/O sia la migliore.

Multiplexare significa avere comunque un bus parallelo; un bus parallelo diminuisce l'immunità ai disturbi. Il sistema non opera in uno stabilimento dove sono presenti inverter, motori ed altri generatori di disturbi, ma anche in casa non si scherza: basta accendere un macinacaffè e rischi di mandare in blcco il controllore.

Io ti consiglerei di pensare seriamente all'uso di bus seriale come I2C e/o SPI. Tra l'altro è l'espansione di I/O che sto implementando: parto con i D/A C e proseguo con A/D C e digitali. In commercio esistono numerosi dispositivi che convertono I2C eSPI in linee di In Out. Sto provando Philips, ma ce ne sono anche prodotti da Motorola, Maxim, ST, etc.

Tra l'altro i bus di espansione della Siemens S7-200 e 300 sono di tipo seriale proprio per aumentare l'immunità.

Prova a pensarci sopra e facci sapere, potremmo sviluppare assieme l'I/O.

Felice 2004 a tutti

Link al commento
Condividi su altri siti

Io ti consiglerei di pensare seriamente all'uso di bus seriale come I2C e/o SPI

Aggiungerei anche la RS485 per poter remotare in giro dei moduli intelligenti con magari a bordo dei micro piu' a buon mercato quali i PIC , avendo il vantaggio di andare fino a 2Km con solo 2 fili twistati.

Ciao :)

Link al commento
Condividi su altri siti

Io ti consiglerei di pensare seriamente all'uso di bus seriale come I2C e/o SPI. Tra l'altro è l'espansione di I/O che sto implementando: parto con i D/A C e proseguo con A/D C e digitali. In commercio esistono numerosi dispositivi che convertono I2C eSPI in linee di In Out. Sto provando Philips, ma ce ne sono anche prodotti da Motorola, Maxim, ST, etc.

Ho pensato anch'io ai disturbi, ma non avendo ancora il kit sottomano (quanto vorrei che il tempo 0 non fosse solo teorico) non ho potuto fare alcuna prova.

L'I2C non l'ho mai usato e nonostante ci abbia pensato mi prefiggevo di fare qualche prova sul campo sulle prestazioni di velocita'.

comunque sono aperto ad ogni soluzione e confronto, vista anche la mia poca esperienza in campo elettronico.

Appena arrivera' il kit vorrei fare (come gia' sta facendo ifach) qualche prova con il software, per stabilire limiti e velocita' operative. A quel punto si dovra' combinare con l'hardware per ottenere prestazioni accettabili.

Per quanto riguarda il multiplexer credo che i disturbi si potrebbero limitare con qualche accorgimento, ma mi riservo di fare qualche prova sul campo :-)

Il bus I2C lo sfrutterei sicuramente per una periferica opzionale ma quasi indispensabile in un sistema di domotica serio: un tastierino/display per la modifica delle opzioni del sistema e il controllo degli stati, come anche la segnalazione di allarmi. In quel caso userei un PIC (o un altro Rabbit, tanto per non cambiare sistema di sviluppo... magari un 3110 che e' abbastanza economico) per gestire il tutto, collegandolo al Rabbit di controllo attraverso bus I2C o un'altra delle seriali che ha a disposizione.

Per quanto riguarda il display ci sono tante opzioni: testo, grafico, grafico a colori. C'e' solo da scegliere. Ho trovato dei bellissimi display a colori che, compresi di controllore, hanno un costo abbordabile.

Diciamo che l'inizio del nuovo anno (e l'arrivo tardivo della mia tredicesima) daranno sfogo allo sperimentatore elettronico che giaceva in letargo nel mio cervellino :-)

Link al commento
Condividi su altri siti

Sul medesimo bus I2C o SPI puoi mettere molte periferiche. Per la velocità ne hai da vendere. Con un Pic 16F876 acquisisco 8 canali A/D ad 1 ms. senza stress.

Link al commento
Condividi su altri siti

Salve ragazzi

mi sono appena letto tutta la lunga discussione e dovrei dire che è molto interessante.

Ho solo un dubbio come mai sono stati inseriti due progetti quasi identici (quello di Dario e questo "Rabbit") e con anche gli stessi obbiettivi o simili?

Anche perchè unire tutti gli sforzi dei singoli si può ottenere un prodotto veramente GRANDE.

Link al commento
Condividi su altri siti

Non sono due progetti quasi identici, anzi hanno molte differenze; inoltre i tempi sono molto diversi: questo progetto è iniziato nel primo trimestre dello scorso anno poi, verso la fine dell'anno è arrivato il progetto di Dario.

Il progetto di Dario propone, come scopo primario, l'acquisizione di conoscenze per sviluppare e progettare con i microprocessori, infatti ha realizzato una scheda con funzioni di sistema di sviluppo.

Il progetto con Rabbit si basa sull'adozione di un HW consolidato con caratteristiche ben precise, su del FW consolidato e preciso. Su queste basi si intende sviluppare un sistema di controllo, costruendo le periferiche di campo e sviluppando il SW necessario.

E' altresì evidente che ci sono punti di ricopertura, come ci sono punti di ricopertura con il progetto SCADA; ebbene queste ricoperture si cercherà di sfruttarle al meglio.

Siamo sempre molto contenti se vengono avanzate proposte concrete.

Link al commento
Condividi su altri siti

Grazie Livio per la delucidazione

vedo molto interessante ambedue i progetti e...

però vorrei a provare a darvi una mano con il rabbit (anche se non ho più preso in mano il C da molto tempo).

Per reperirlo (siccome ami serve la fattura) posso fare riferimento ad AreaSX?

Modificato: da ELMO
Link al commento
Condividi su altri siti

Io l'ho acquistato da Esprinet (il sito lo trovi sul webb), la persona di riferimento è Michele Conti che è il product manager di Rabbit (info di Luglio 03). A suo tempo avevamo negoziato un prezzo scontato per gli iscritti a PLCForum. Puoi acquistare anche da areasx: le info che ho la danno come società seria.

Link al commento
Condividi su altri siti

ifachsoftware
siccome ami serve la fattura

La fattura te la fanno tutti , il vantaggio principale di AreaSx e' che in 2-3 giorni hai in mano il tutto e che vende anche a privati , mentre Comprel vende solo a societa' , se devi acquistare come privato ti gira ad una consociata con naturalmente prezzi differenti ...

Considera che AreaSX e' leggermente piu' cara di Comprel.

Ciao :)

Link al commento
Condividi su altri siti

ifachsoftware

Eccovi l'esempio con gestione in ricezione della seriale con time-out se non vengono processati i caratteri per piu' di 2 secondi.

/* IFACH Software - Calpe , Costa Blanca
   -------------------------------------

   Program name : ProvaRS232.C
   Last Update  : 02/Jan/2004
   Language ... : Dynamic C SE   
   Edit by .... : Claudio Rossi ... Rouge
                  (I love when a software comes together !)
   Features ... : Test Uscite RCM3010                               
                  07/Sep/2003 Versione con Out funzionanti (Finalmente !)
                  30/Dec/2003 Prova Seriale
                  02/Jan/2004 Versione con capito il Fronte con i costate
                              + gestita ricezione seriale
*/

//#use rcm3000.lib      // Libreria da includere per gestire la seriale

#class auto             // Place local variables on the stack.

/*
   Port    Function         I/O  I/O State
   ====    =============================  ======    ===========================================
   PA0    Configurable external I/O bus  Output    High when not driven by I/O bus
   PA1    Configurable external I/O bus  Output    High when not driven by I/O bus
   PA2    Configurable external I/O bus  Output    High when not driven by I/O bus
   PA3    Configurable external I/O bus  Output    High when not driven by I/O bus
   PA4    Configurable external I/O bus  Output    High when not driven by I/O bus
   PA5    Configurable external I/O bus  Output    High when not driven by I/O bus
   PA6    Configurable external I/O bus  Output    High when not driven by I/O bus
   PA7    Configurable external I/O bus  Output    High when not driven by I/O bus
   PB0    Not used         Input  Pulled-up on core
   PB1    Not used         Input  Pulled-up on core
   PB2    Configurable external I/O bus  Input  Pulled-up on core when not driven by I/O bus
   PB3    Configurable external I/O bus  Input  Pulled-up on core when not driven by I/O bus
   PB4    Configurable external I/O bus  Input  Pulled-up on core when not driven by I/O bus
   PB5    Configurable external I/O bus  Input  Pulled-up on core when not driven by I/O bus
   PB6    Not used         Output    High when not driven by I/O bus
   PB7    Not used         Output    High when not driven by I/O bus
   PC0    Not used         Output    High
   PC1    Not used         Input  Pulled-up on core
   PC2    TXC          Output    High when not driven by RS232 
   PC3    RXC          Input  Pulled-up on core when not driven by RS232
   PC4    TXB          Output    High when not driven by RS232
   PC5    RXB          Input  Pulled-up on core when not driven by RS232
   PC6    TXA          Output    High when not driven
   PC7    RXA          Input  Pulled-up on core when not driven 
   PD0    Realtek RSTDRV       Output    High when not driven by ethernet
   PD1    Not used         Input  Pulled-up on core
   PD2    Not used (jumper not installed)    Output    High 
   PD3    Not used (jumper not installed)    Output    High 
   PD4    Not used         Output    High
   PD5    Not used         Input  Pulled-up on protoboard
   PD6    Not used (jumper not installed)    Output    High 
   PD7    Not used (jumper not installed)    Output    High 
   PE0    Not used (jumper not installed)    Output    High
   PE1    Not used         Output    High
   PE2    Realtek  AEN       Output    High when not driven by ethernet
   PE3    LCD device select      Output    Low
   PE4    Infrared device speed select  Output    Low
   PE5    Not used         Output    High
   PE6    External I/O Strobe     Output    High when not driven by LCD/Keypad
   PE7    Not used         Output    High
   PF1    Not used - future Motor/Encoder    Input  Pulled-up on protoboard
   PF2    Not used - future Motor/Encoder    Input  Pulled-up on protoboard
   PF3    Not used - future Motor/Encoder    Input  Pulled-up on protoboard
   PF4    Not used - future Motor/Encoder    Input  Pulled-up on protoboard
   PF5    Not used - future Motor/Encoder    Input  Pulled-up on protoboard
   PF6    Not used - future Motor/Encoder    Input  Pulled-up on protoboard
   PF7    Not used - future Motor/Encoder    Input  Pulled-up on protoboard
   PG0    Switch S3 (normally open)   Input  Pulled-up on protoboard    (PULSANTE 1)
   PG1    Switch S2 (normally open)   Input  Pulled-up on protoboard    (PULSANTE 2)
   PG2    TXF          Output    Pulled-down when not driven by infrared
   PG3    RXF          Input  Driven by infrared driver  (LED3)
   PG4    Infrared device MD1     Input  Pulled-up on protoboard
   PG5    Infrared device MD0     Input  Pulled-down on protoboard
   PG6    LED LED1         Output    High                       (LED1)
   PG7    LED LED2         Output    High                       (LED2)        
*/

nodebug 
void MyBrdInit()
{
    // configure Port A
    // use SPCR to enable and disable external I/O data bus

    WrPortI(PADR, &PADRShadow, 0xFF);          // set to output all high
    WrPortI(SPCR, &SPCRShadow, 0x84);          // ignore SMODE pins, set to output
    
    // configure Port B
    // use SPCR to enable and disable external I/O address bus

    WrPortI(PBDR, &PBDRShadow, 0xC0);          // set bits 7,6 to output high
                      // bits 5-0 are normally inputs  
    
    // configure Port C
    // serial port A communicates with Dynamic C
    // using serXopen in application code will configure serial ports B and C automatically
    // so configuration not needed here

    WrPortI(PCDR, &PCDRShadow, PCDRShadow|0x15);  // set bits 4,2,0 high
    WrPortI(PCFR, &PCFRShadow, PCFRShadow&0xEA);  // clear bit 4,2,0 to normal function
                 // bits 5,3,1 normally inputs

    // configure Port D
    // using ethernet applications will automatically configure bit 0 for strobe
    // so not configured here

    WrPortI(PDCR, &PDCRShadow, PDCRShadow&0x00);  // clear all bits to pclk/2
    WrPortI(PDFR, &PDFRShadow, PDCRShadow&0x00);  // clear all bits to normal function
    WrPortI(PDDCR, &PDDCRShadow, PDDCRShadow&0x2D);    // clear bits 7,6,4,3,2,0 drive high and low
    WrPortI(PDDR, &PDDRShadow, PDDRShadow|0xDD);  // set bits 7,6,4,3,2,0 output high
    WrPortI(PDDDR, &PDDDRShadow, PDDDRShadow|0xDD);    // set bits 7,6,4,3,2,0 to output
    WrPortI(PDDDR, &PDDDRShadow, PDDDRShadow&0xDD);    // clear bits 5,1 to input

    // configure Port E
    // using LCD/Keypad applications will automatically configure bit 6 for external I/O strobe
    // so not configured here
    // using ethernet applications will automatically configure port bit 2 for strobe
    // so not configured here

    WrPortI(PECR, &PECRShadow, PECRShadow&0x00);  // clear all bits to pclk/2
    WrPortI(PEFR, &PEFRShadow, PECRShadow&0x00);  // clear all bits to normal function
    WrPortI(PEDR, &PEDRShadow, 0xE7);     // set bits 7,6,5,2,1,0 output high and
                 // set bits 4,3 output low
    WrPortI(PEDDR, &PEDDRShadow, PEDDRShadow|0xFB);    // set bits 7,6,5,4,3,2,1,0 to output

    // configure Port F
    // originally for motor/encoders but for anything here

    WrPortI(PFCR, &PFCRShadow, 0x00);     // clear all bits for pclk/2
    WrPortI(PFFR, &PFFRShadow, 0x00);     // clear all bits for normal function
    //WrPortI(PFDCR, &PFDCRShadow, ???);    // future bit drive output
    //WrPortI(PFDR, &PFDRShadow, ???);     // future bit output
    WrPortI(PFDDR, &PFDDRShadow, 0x00);     // clear all bits to input

    // configure Port G
    // infrared device sample program will configure serial port F
/*
    WrPortI(PGCR, &PGCRShadow, 0x00);     // clear all bits for pclk/2
    WrPortI(PGFR, &PGFRShadow, 0x00);     // clear all bits for normal function
    WrPortI(PGDCR, &PGDCRShadow, PGDCRShadow|0xC0);    // set bits 7,6 drive open drain
    WrPortI(PGDR, &PGDRShadow, PGDCRShadow|0xC0);    // set bit 7,6 output high
    BitWrPortI(PGDCR, &PGDCRShadow, 0, 2);    // clear bit 2 drive output
    BitWrPortI(PGDR, &PGDRShadow, 0, 2);    // clear bit 2 output low
    WrPortI(PGDDR, &PGDDRShadow, 0xC4);     // set bits 7,6,2 to output and
                                                 // clear bits 5,4,3,1,0 to input

   PG0    Switch S3 (normally open)   Input  Pulled-up on protoboard    (PULSANTE 1) A
   PG1    Switch S2 (normally open   Input  Pulled-up on protoboard    (PULSANTE 2) B
   PG2    TXF          Output    Pulled-down when not driven by infrared
   PG3    RXF          Input  Driven by infrared driver  (LED3)
   PG4    Infrared device MD1     Input  Pulled-up on protoboard
   PG5    Infrared device MD0     Input  Pulled-down on protoboard
   PG6    LED LED1         Output    High                       (LED1)
   PG7    LED LED2         Output    High                       (LED2)    

*/

    WrPortI(PGCR , &PGCRShadow , 0x00);     // clear all bits for pclk/2
    WrPortI(PGFR , &PGFRShadow , 0x00);     // clear all bits for normal function
    WrPortI(PGDCR, &PGDCRShadow, 0xC8);           // Out 3,7,6 open drain
    WrPortI(PGDR , &PGDRShadow , PGDCRShadow|0xC8);    // set bit 3,7,6 output high
    WrPortI(PGDDR, &PGDDRShadow, 0xC8);     // 3,7,6 = Uscite gli altri = Input                                                
}

// Definizioni costanti

#define LED1 6         // LED 1 port G bit 6
#define LED2 7         // LED 2 port G bit 7
#define LED3 3         // LED 3 port G bit 3

#define PULS1  0      // SWITCH 2 port G bit 0
#define PULS2  1      // SWITCH 1 port G bit 1

#define BINBUFSIZE  15   // Dimensione Rx Buffer RS232 Port B
#define BOUTBUFSIZE 15   // Dimensione Tx Buffer RS232 Port B

void LedGOn(int led)
{
    BitWrPortI(PGDR, &PGDRShadow, 0, led);
}

void LedGOff(int led)
{
    BitWrPortI(PGDR, &PGDRShadow, 1, led);    
}

cofunc flashled[2](int led, int ontime, int offtime)
{
    LedGOn(led);
    waitfor(DelayMs(ontime));
    LedGOff(led);
    waitfor(DelayMs(offtime));
}

void main()
{
   auto int                sw1;
   auto int                nEntrambi;
   auto char               Buff[80];
    auto unsigned long int    timer;
   auto int                OldNChars;
          
    MyBrdInit();                  // Inizializza il modulo

    serBopen(115200);                   // Setta Baudrate
    serBparity(PARAM_NOPARITY);         // Parity None
   serBdatabits(PARAM_8BIT);           // 8 Bit di Dati
    serBwrFlush();                      // Svuota Buffer Trasmissione
    serBrdFlush();                      // Svuota Buffer Ricezione

   sw1       = 0;
   nEntrambi = 0;
   timer     = 0;
   OldNChars = 0;
      
    for(;;)   // Main Loop
    {
      // Premendo il Puls1 viene fatto un toggle sul Led3

  costate
  {    
   if(!BitRdPortI(PGDR, PULS1)) abort;                            // Se ho la condizione di attivazione annullo perche' non e' un fronte
   waitfor(DelayMs(5));                                     // Aspetto il fronte entro 5ms
   if(!BitRdPortI(PGDR, PULS1))                                   // Se ho la condizione e' un fronte !
   {
    sw1=!sw1;                                         // Inverte lo stato dell'uscita
      BitWrPortI(PGDR, &PGDRShadow, sw1, LED3);                   // Scrive l'uscita
   }
  }

      // Premendo il Puls2 viene inviata una stringa con la seriale
  
  costate
  {    
   if(BitRdPortI(PGDR, PULS1) &! BitRdPortI(PGDR, PULS2)) abort;  // Se ho la condizione di attivazione annullo perche' non e' un fronte
   waitfor(DelayMs(5));                                     // Aspetto il fronte entro 5ms
   if(BitRdPortI(PGDR, PULS1) &! BitRdPortI(PGDR, PULS2))         // Se ho la condizione e' un fronte !
   {
            serBputs("IFACH Software - Calpe , Costa Blanca\n");        // Invia s sulla seriale B
            serBputs("Welcome to the Rabbit !\n");                      // Invia s sulla seriale B
         }
   }    

      // Lampeggio 50ms On / 50ms Off
    
  costate
  {        
       wfd
       {
    // 50 ms on/off
    flashled[0](LED1,50,50);                                  // Fa lampeggiare il LED1 (PG6)
     }
  }

      // Lampeggio 200ms On / 200ms Off
    
  costate
  {
   wfd
   {
    // 200 ms on/200 ms off
    flashled[1](LED2,200,200);                                    // Fa lampeggiare il LED2 (PG7)
   }
  }

      // Invia messaggio se premuti contemporaneamente Puls1 e Puls2
  
  costate
  {    
   if(!BitRdPortI(PGDR, PULS1) &! BitRdPortI(PGDR, PULS2)) abort;   // Se ho la condizione di attivazione annullo
   waitfor(DelayMs(5));                                       // Se Non avevo la condizione di attivazione ma arriva entro 5ms allora ho un fornte di salita !
   if(!BitRdPortI(PGDR, PULS1) &! BitRdPortI(PGDR, PULS2))          // Se ho la condizione
   {
            sprintf(Buff,"Premuti Entrambi [%d]\n",++nEntrambi);          // Preparo la stringa da inviare
            serBputs(Buff);                                               // Invia s sulla seriale B
   }
  }


      // Gestione seriale con time-out
  
  costate
  {
         if(timer == 0)           // Se ci sono caratteri in attesa nel Buffer
         {
            if(serBrdUsed() > OldNChars)  // Se e' aumentato il numero di dati Resetta il time-out
            {
               OldNChars = serBrdUsed();
               timer = MS_TIMER;   // get current time in milliseconds
            }
            else
            {
               OldNChars = serBrdUsed();
               if(!OldNChars) timer = 0;
            }  
         }

         if(serBrdUsed())
         {
            if(MS_TIMER > (timer + 2000))  // Se time-out a 2 sec
            {
               timer = 0;
               OldNChars = 0;
               serBrdFlush();             // Svuota Buffer Ricezione
               serBputs("\nTime-Out RS232 Port B !");                 
            }            
         }
         
         if(serBrdUsed() > 3)  // Se ci sono > di 3 caratteri in attesa nel Buffer
         {
             if(!serBread(Buff,4,200))   // Se c'e' errore nella lettura
             {
                serBputs("\nErrore Lettura Buffer !");  
             }
             else
             {
                serBputs("\nBuffer Letto = ");
                Buff[4] = '\0';  // Termina il Buffer
                serBputs(Buff); 
             }
             
             serBrdFlush();  // Svuota Buffer Ricezione
         }                 
  }
    
    }
}

Ciao a tutti :)

Link al commento
Condividi su altri siti

Grazie per l'informazione Livio e Ifach

Per Comprel mi sono registrato ma per fare l'ordine mi manca il codice cliente (te lo forniscono tramite e-mail la prima volta?)

Volevo chiedere se con questo tool di sviluppo si possono poi programmare anche le cpu più piccole(o piu grandi) o solo quelle della serie 3000?

Io avrei intenzione di utilizzarlo per controllare temperatura e umidità in processi alimentari (quindi anche utilizzare diversi I/O ) per poi collegarli in una rete tra loro (RS485) per acquisire i vari dati di lavoro da PC (progetto SCADA)

Modificato: da ELMO
Link al commento
Condividi su altri siti

ifachsoftware
Volevo chiedere se con questo tool di sviluppo si possono poi programmare anche le cpu più piccole(o piu grandi) o solo quelle della serie 3000?

C'e' la versione Premiere che programma tutti i moduli , anche se i kit di sviluppo sono dedicati al core che scegli.

Inoltre devi considerare che ci sono Cavi di programmazione differenti per la serie 2000 , 3000 e 3400.

Il modulo che stiamo usando per le prove e' l'RCM3010 che e' lo stesso fornito con il kit.

Ciao :)

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...