Jump to content
PLC Forum


Rabbit (Progetto on-line)


Gabriele Riva
 Share

Recommended Posts

ifachsoftware

x Dlgcom il problema di comunicazione non e' che e' legato al cavo o al tipo di Hub ? , perche' le prove che avevo fatto andavano alla grande.

Ciao B)

Link to comment
Share on other sites


  • Replies 400
  • Created
  • Last Reply

Top Posters In This Topic

  • walterword

    154

  • dlgcom

    85

  • Livio Orsini

    46

  • ifachsoftware

    36

X Luciano

se usi un chip standard vede solo 32 nodi

comunque 32 nodi li vedono tutti

X ifach

Infatti penso che siano problemi con la configurazione , non uso hub , ma un cavo invertito.

La comunicazione c'e' perche' se faccio un pinga dal rabbit al pc funziona.

Ma se faccio un ping dal pc al rabbit , non va , mi dice che non riesce a collegarsi .

Penso che sia una configurazione del pc , ma chssa' quale.

Neanche il firewall si arrabbia , non mi chiede niente.

Tutte le prove di accesso scatenano il dialer di internet , chidendomi di accessare ad internet o rimanere offline .

É' come se non riconoscesse la intranet...

pero' il rabbit e' in rete , se cerco di dare lo stesso indirizzo del rabbit al pc me lo rifiuta ... quindi XP riconosce che il rabbit sia in rete , ma non so come dirgli di cercare un indirizzo nella rete interna ... sara una questione di proxy?

Come avete configurato la rete sul pc?

X Walter.

Adesso che un cliente mi ha commissionato un progetto dove usero' il rabbit , posso permettermi il lusso di smanettare sul coniglio ...

Dovro' fare delle prove in ic2 con il pic , ti faro' sapere .

Per il C , attento che alcune versioni del CCS avevano problemi e alcuni bug...

Io per avere un compilatore C valido e gratis .. o quasi ... sto' passando ai microcontrollori della Zilog , esattamante la famiglia Z8Encore! ottimi processori , con caratteristiche quasi uguali ai 18F e con un sistema di sviluppo da meno di 100 euro ...

Hanno anche la moltiplicazione hardware interna e 2 UART!!!

Devo solo trovare chi vende giorni da 35 ore .... nessuno sa dove? :P

Link to comment
Share on other sites

ho un amico che tratta Zilog

tempo fa addirittura ti ritiravano il kit del rabbit e ti davano uno zilog

solo che pero il kit del rabbit , con compilatore ect l'ho pagato di piu di 100 euro e cosi ho deciso di tanaermi il coniglio

hai provato il codice che ti ho postato

,,,non si sa mai , provalo fratello

ciao

walter

Link to comment
Share on other sites

Domani sicuramente lo provero' .

Avevo solo provato i demo e gli esempi di Tanzilli , ma mi danno lo stesso problema.

Domani dal´l'ufficio mi collego e vi faro' sapere.

Ho anche un altro hd , installo il sistema di backup e provo cosi' senza modem...

Non vorrei....

Link to comment
Share on other sites

sto riscontrando dei problemi sulla comunicazione tra pic e pc in rs232

non capisco se il pic mi spedisce dei caratteri diversi da quelli che gli dico di spedire io

uso

int dati[4];

int from8574;

char string[7];

.......

string[0]=dati[0];

string[1]=dati[1];

string[2]=dati[2];

string[3]=dati[3];

string[4]=from8574;

string[5]='\n';

string[6]='\r';

printf(string);

ha funzionato per un po e poi ha iniziato a dare i numeri quando ho implementato l'interrupt del timer2 , che tra l'altro rallentava le varie comunicazioni spedendo in rs232 cosa assurde

Ho tolto l'intrerrupt del timer2 e ha ricominciato il tutto a funzionare ma con cose strane

per esempio ricevo il buffer giusto per pochi secondi e poi lo ricevo shiftato di un byte

ultimamente poi sembrerebbe ch eil pic spedisca cose strane

Sono stato anche attento a compilare il file .c giusto ed a caricarlo in mplab giusto (.hex)

Bo non capisoc , non dovro mica smazzarmi anche la seriale tutta in assembly , va be ho gia in mano il materiale per farlo

Ma questo PCM ha dei bachi mostruosi per caso ????? :blink::unsure:

Edited by walterword
Link to comment
Share on other sites

Dario Valeri

ciao

altola'!

come gestisci la seriale??

usi il suo interrupt?? perche' se usi dei loop......stai fresco.

e' meglio usare l'inerrupt della uart , io non conosco i pic ma c'e', con quello funzionera' al 100%

io ho provato su hitachi (h8) mu motorola e su mitsubishi ed usando il interrupt uart non ci sono problemi

nemmeno se attivi l'interrupt timer (che di solito viene settato con una priorita' piu' alta)

ciao

dario

Link to comment
Share on other sites

all'interno del loop di programma

(nel classico while... ) uso un delay_ms(100) di 100 millisecondi , poi faccio due letture ed 1 scrittura a 2 devices

in I2C con una libreria che ho scritto che manipola l'SDA e SCL e funziona da dio

poi scrivo su seriale con printf e gli passo l'array di char o interi , segue poi "\n\r" per chiudere .

quindi ritorno all'inizio del loop ed aspetto ancora 100 ms (ad ogni ciclo )

poi ho provato ad usare l'interrupt che viene richiamato quando il il buffer di trasmissione

di 1 byte e' vuoto , ho provato indicizzando ed anche a spedire un solo carattere

Di peggio in peggio

Nel pc scrivo un'applicazione in Vc#.net dove utilizzo una dll scritta in vb.net che wrappa le api per la seriale

Se uso l'interrupt mi rallenta tutto il resto e lo vedo da un diodo che si accende a fine scrittura , e si resetta

per poi settarsi dopo i 100 ms di delay

le ho provate tutte , non so piu cosa fare , mi tocchera scrivere una libreria come ho fatto per l'I2C

La guida del PCM la racconta facile , peccato che non vada un ca**o pero '

Sto perdendo troppo tempo e denaro , se non riesco a far funzionare domani il discorso dovro mollare

e ributtarmi sul vc# e Asp.net e database

Sto girando tutto internet come un pazzo e trovo solo le stesse cose

Del resto non c'e' nemmeno nessuno che mi dica qualcosa , sto facendo tutto da solo con grande fatica , quando basterebbero 4 righe di codice per far funzionare tutto .

Sto gia facendo fin troppo

ciao

walter

Link to comment
Share on other sites

ok ho capito il problema

in sostanza , nel Pic , spedivo un array di char , pero copiavo dentro ad ogni singolo caratteri

un valore intero , il compilatore non mi dava errore

Adesso faccio le letture dei pcf8574 e pcf8591 appoggiandomi su dati di tipo char

cosi poi li impacchetto e li spedisco , e arrivano corretti nel mio bufferino di 7 byte in vc# .

Bene cosi funziona anche il software pc , stavo veramente impazzendo , le ho pensate tutte

adesso e' ok

:D:D:D

ciao

walter

Link to comment
Share on other sites

ho provato anche l'interrupt quando il buffer di trasmissione e' vuoto ma e' troppo veloce

mi impalla tutto ed arrivano dati bruttissimi

se invece faccio il printf nel loop del main allora funziona benissimo solo che

ogni volta che eseguo il main loop uso un delay di 100 ms .

Va bene la comunicazione , ma poi ?????

che razzo di automazione tiro fuori a 100 ms ??? una schifezza

D'altronde se uso l'interrupt e' troppo veloce mi impalla tutto

Avete qualche idea ???

ciao

walter

dovrei settare il timer2 a 100ms di overflow e poi scrivere sulla seriale nell'interrupt di questo timer

Edited by walterword
Link to comment
Share on other sites

Dario Valeri

ciao

attenzione che devi sospendere l'interrupt di trasmissione quando il buffer e' vuoto. io , sul mitsubishi (che ha 5 seriali)faccio cosi:

1) preparo i dati un un buffer

2) metto il primo dato (puntato da un puntatore) nel buffer di trasmissione

3)abilito la trasmissione (con un suo flag particolare)che parte immediatamente

4)quando il micro ha spedito il byte genera un unterrupt che io faccio puntare

a una mia routin che incrementa il puntatore e carica nel buffer di trasmissione il successivo byte

5)quando il mio puntatore punta l'ultimo byte+1 della stringa da trasmettere disabilito la seriale

bisogna disabilitare la seriale perche' essa continua a sparare fuori dei caratteri 0h in eterno.

il tutto essendo temporizzato dal sistema stesso funziona alla perfezione.

chiaramente chi riceve deve essere pronto.

ciao

dario

Link to comment
Share on other sites

ciao Dario

intanto grazie per l'aiuto e l'interesse

ho fatto cosi :

uso l'overflow del timer 2 , settato a circa 150 ms

nell'interrupt spedisco col comando printf un array di caratteri precedentemente caricati con i dati che

leggo dai devices in I2C

Nel Pc , tramite timer , ogni 150 ms faccio la lettura del buffer di sicezione e poi butto la visualizzazione

sembrerebbe che non faccia una piega . :rolleyes:

adesso sto preparando altri 2 nodi slaves , solo che pero ho solo 3 Max485 porca miseria

Dovro fare entrare in scena il rabbit che ha gia a bordo i driver del Rs485 , che sara il master dei 2 nodi

e poi sempre il rabbit sara server della rete ethernet con pc client

devo riuscire a far girare almeno una decina di bytes nella rete composta da 3 protocolli

e cioe I2C all'interno dei nodi , rs485 modbus tra nodi slaves e master e tcp\ip modbus tra rabbit e pc

Poi potro considerare gli esperimenti ed i risultati , buoni per le mie conoscenze e capacita in materia

di micro e telecomunicazioni .

poi dovrei riuscire a creare un sito in asp.net e pilotare il tutto da internet , ed archiviero queste ricerche ed esperimenti nel mio curriculum , magari in attesa di richieste particolari

Poi dovro anche iniziare a far qualcosa per lavoro , visto che mi stan gia martellando

Una volta infarinato coi pic , vorrei conoscere meglio i rabbit e magari perche no anche il mitsubishi

e lo zilog , mi piace la storiella che si possan fare tante cose

ciao dario e di nuovo grazie

walter

Link to comment
Share on other sites

ok ho rivisto tutto l'hw , praticamente e' cosi composto , ho appena finito di montarlo

-NODO1----- PIC16F876 + PCF8591(5 analog,4 in +1 out ) + PCF8574(configurato in 4 input + 4 output)

-NODO2----- PIC16F876 + PCF8591(5 analog,4 in +1 out ) + PCF8574(8 input) + PCF8574(output)

ho gia montato e collegato i rispettivi max485 in ogni scheda

Domani faro delle prove in Rs485 , dalla scheda 1 alla scheda2

Se funziona entra in scena il rabbit che sara il master delle 2 .

Ciao

walter

Link to comment
Share on other sites

Bene Walter ,

Io invece ho risolto i miei problemi con il Rabbit , adesso va che e' una meraviglia...

Iniziero a fare le prove di comunicazione tra pic e Rabbit in 485.

Link to comment
Share on other sites

ho visto degli esempi che trattano di come utilizzare l'interrupt del buffer di ricezione e trasmissione

potresti delucidarmi in proposito ?

grazie

walter

Link to comment
Share on other sites

bisogna disabilitare la seriale perche' essa continua a sparare fuori dei caratteri 0h in eterno

Nel pic no, basta non scrivere niente nel registro di tx .

ho provato anche l'interrupt quando il buffer di trasmissione e' vuoto ma e' troppo veloce

mi impalla tutto ed arrivano dati bruttissimi

Ma quanti dati devi scrivere ? , perche' se non sono molti potresti fare un loop di trasmissione.

oppure creare una routina di interrupt a tempo per trasmettere i dati ad intervalli regolari , mantenedo libero il loop principale.

Altra cosa, se i tuoi pic sarano slave del Rabbit, io associerei la trasmissione all' interrupt di ricezione della seriale.

Se spieghi un po' il tuo ciclo , ti posso dare una mano.

Link to comment
Share on other sites

ho chiesto anche la collaborazione del gentile dario valeri

in sostanza vorrei implementare un protocollo modbus , con un buffer di al massimo 20 byte per ogni slave.

Pero adesso a parte il modbus vorrei comunicare semplicemente cosi senza processare il buffer lo faro dopo esser sicuro la comunication funzioni , pensavo di fare cosi :

#define DEtrasm output_high(PIN_C2)

char buffer[20];

int count=0;

main()

{

buffer[0]='A';

buffer[1]='B';

..............

buffer[19]='W';

if(condizione per trasmettere oppure sempre )

{

DEtrasm;

putchar[buffer[count];

}

}

#int_TBE //interrupt quando e' stato spedito un byte

TBE_isr()

{

count++;

if(count==19){count=0;}

}

poi dovro fare un qualcosa di simile anche con l'interrupt di ricezione

nella guida del PCM non c'e' molto materiale per capire bene , comunque credo non sia proprio cosi complicato

cosa ne dite , secondo voi potrebbe funzionare ??

dunque adesso devo provare tra 2 pic , di cui uno master e l'altro slave , ho gia montato i Max485

e collegato il DE (driver eneble) che dovra essere a 1 quando devo trasmettere e 0 in ricezione

quindi lo slave sara a 0 il DE .

Il master lo mette a 1 e poi nel main loop inizia a spedire un byte del buffer precedentemente caricato a dovere

in altre routine .

L'interrupt mi dice che il byte e' stato spedito , cosi incremento il puntatore al byte successivo e cosi ritorno nel loop main e scrivo il 2° byte , e via fintanto che non arrivo con l'indice a 19 e lo azzero .

Ho usato anche una macro giusto per provare se funziona (DEtrasm )

cosa dite , e' una logica farlocca o potrebbe con qualche accorgimento stare in piedi ???

ciao e grazie

walter

p.s. poi entrera in scena il Rabbit e sara lui il master e i due Pic i relativi slaves , con la loro circuiteria interna

quindi 2 PIC dovranno ricevere le richieste del master e rispondere

semplice no ?

Edited by walterword
Link to comment
Share on other sites

Funziona , ma io non la metterei nel main.

Io farei una routine di trasmissione per inviare i 20 byte e questa routine sarebbe scatenata da un evento a tua scelta oppure a tempo con l'interrupt di un timer .

Calcola che a 19200 bit/s , per trasmettere un byte ci impieghi 0,00046 sec x 20 = 0,0095 sec.

Io uso un loop e solo controllo il flag di avvenuta trasmissione .

Se vuoi il ccs ha una libreria pronta per 485, si chiama rs485.c .

Se non la trovi te la mando.

Link to comment
Share on other sites

si questa libreria la cercavo anche ieri

dove dal sito CCs dicono che sia nella cartella Exaples o drivers

Be ci sono un sacco di esempi , driver ect ma questa non c'e '.

Se me la mandi mi fai un favore

grazie

walter

Edited by walterword
Link to comment
Share on other sites

i giorni ch emi rimanogno devo poi dedicarli al rabbit , ho gia una dll che avevo scritto per modbus tcp\ip

cosi vedo di implementare anche il modbus tcp\ip anche sul rabbit

una volta finita con questa rs485

devo fare anche delle prove con web server e rabbit . il tempo stringe

ciao

Link to comment
Share on other sites

     for(i=0,cs=rs485_id^to^len; i<len; i++) {
          cs^=*data;
          fputc(*data,RS485_CD);
          ++data;
       }

Questo e' quello che fa il driver 485....

Link to comment
Share on other sites

be devo ancora approfondire alcuni concetti del C

per esempio un ciclo For cosi composto non l'ho mai usato

con gli Xor e con 2 variabili cioe "i" e "cs"

sarebbe bello saperne qualcosa di piu

Ho scaricato un dossier di centinaia di pagine , si chiama trickyC

e' scritto da un tipo in gamba in italiano

Tratta del linguaggio e , delle direttive al compilatore ect

Ho stampato le pagine fintanto che non si addentravano all'uso delle librerie del dos

Niente male

Link to comment
Share on other sites

#define RS485_RX_ENABLE PIN_B5

usa anche l'abilitazione della ricezione ?

io sulla basetta i due pin relativi del max485 li ho messi insieme

e ho solamente il DE

quindi devo scollegare il ponticello ed usare un'altra uscita del Pic per questo scopo?

ma tutti quei #if ....#else ect nel codice a cosa servono

forse in fase di debug ?

certo che pero ho visto un po cosi la libreria , mica male :blink:

quindi la devo includere nel file del mio progetto e poi utilizzare com ein tutti i linguaggi le sue funzioni

correggendo in base alle mie configurazioni hw gli eventuali #define sui pin

Di tutte le funzioni , presumo che la prima da richiamare sia init() prima di entrare nel loop main , o sbaglio ?

Edited by walterword
Link to comment
Share on other sites

Se non lo usi , lo puoi eliminare dalla dichiarazione

  #define RS485_RX_PIN       PIN_B0
   #define RS485_TX_PIN       PIN_B3
   #define RS485_ENABLE_PIN   PIN_B4   //controls DE pin.  low for RX, high for TX
 //  #define RS485_RX_ENABLE    PIN_B5   //controls RE pin.  should keep l

E usare solo il pin di tx

Link to comment
Share on other sites

cioe quando il De e' alto abilito la trasmissione

mentre quando e' basso sono in ricezione

giusto ? funziona cosi '

ciao

walter

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share


×
×
  • Create New...