+ Rispondi
Pagina 1 di 2 1 2 UltimaUltima
Risultati da 1 a 10 su 13

Discussione: Decoder Pelco D

  1. #1
    TecnicoERMETICO riciclato
    Iscritto dal
    03/12/2011
    Località
    Monopoli
    Messaggi
    6,760

    Decoder Pelco D

    Salve a tutti.
    Chioedevo per sto progettino, ho cercato in giro ma ho trovato solo un progettino su arduino che comanda dei servo per modellismo.
    Spiego per chi non sa.
    Pelco D è un protocollo che viaggia su 485 che serve a comandare telecamere dome o speed dome.
    in una word contiene comandi ecc ecc che la telecamera interpreta ed esegue.
    Nel mio caso, il sistema di videosorveglianza dispone di 3 telecamere fisse ed una speed dome che richiamo a puntare una zona se una delle fisse rileva un movimento.
    La necessità di rilevare il comando Pelco è dato dal fatto che anche i più costosi DVR NON dispongono di uscite allarmi relative, ma UNA sola generica.
    Io vorrei, usando un pic,(16F876) intercettare il comando e attivare una o più uscite, in maniera da avere un sistema di rilevamento più completo ed interattivo.
    La word in oggetto è la seguente:
    FF 0X 00 07 00 XX xx
    Vado a spiegare i Bytes
    FF è sempre FF ed indica l'inizio del comando
    0X è l'indirizzo 485 che io al massimo userò da 00 a 09 per comandi "virtuali"
    00 resta fermo
    07 indica che è una chiamata a preset, resta fisso
    XX è il preset in richiamo, appunto il valore che devo intercettare
    xx è il checksum, che non vado a verificare, poichè non è fondamentale.
    Sapendo modificare un programma C poco.. ma ci provo, qualcuno ha ideas di come leggere al volo la word?
    Grazie a tutti.
    How much is a life worth? By law,a bank guard can carry a gun to protect his employer's money.
    But a parent here can't be legally armed to protect her children outside of home. [cit]


  2. #2

    Iscritto dal
    13/12/2011
    Località
    Salento!
    Messaggi
    6,849
    Se trovi un hello world che legga da seriale, te lo sistemo.

  3. #3
    TecnicoERMETICO riciclato
    Iscritto dal
    03/12/2011
    Località
    Monopoli
    Messaggi
    6,760
    Ok ci provo.. Grazie intanto
    How much is a life worth? By law,a bank guard can carry a gun to protect his employer's money.
    But a parent here can't be legally armed to protect her children outside of home. [cit]


  4. #4
    TecnicoERMETICO riciclato
    Iscritto dal
    03/12/2011
    Località
    Monopoli
    Messaggi
    6,760
    Sembrava una passeggiata... macchè, avessi trovato uno che vuole inviare una scritta ad un pic....
    Per ora sto cercando di capire questo.
    Let's GO PIC
    o questo..
    INTERFACCIA SERIALE PER LCD 16X2 - PROTOCOLLO DI COMUNICAZIONE
    How much is a life worth? By law,a bank guard can carry a gun to protect his employer's money.
    But a parent here can't be legally armed to protect her children outside of home. [cit]


  5. #5

    Iscritto dal
    04/09/2011
    Messaggi
    5,404
    ho dato un occhio veloce al primo link e non vedo niente di astruso... dove ti blocchi?

    la parte interessante potrebbe essere questa

    void interrupt SerChar(void) //prototipo ricezione
    {
    if (RCREG==0x40 | RxPos > 6) //se arriva la chiocciola dimensiona la stringa
    { C1=0,C2=0,C3=0,C4=0; //azzero la stringa
    RxPos=0,Flags=0;
    }

    if (RxPos==1) C1=RCREG; //ricezione della stringa comandi
    if (RxPos==2) C2=RCREG;
    if (RxPos==3) C3=RCREG;
    if (RxPos==4) C4=RCREG;
    if ((RxPos==5) && (RCREG==0x0d)) Flags=1; // <CR> terminator
    RxPos++;
    }

    se tipo il tuo devices non invia il CR ( o qualsiasi altro terminatore ), allora per triggerare l'azione ti basi sul numero di char arrivati dopo l'inizio stringa. in questi casi un bel timeout è quello che ci vuole onde evitare di impacchettare mezzi dati di un comando o altra roba persa in giro. Ah, e controllerei anche il checksum

  6. #6
    TecnicoERMETICO riciclato
    Iscritto dal
    03/12/2011
    Località
    Monopoli
    Messaggi
    6,760
    Hehehe dove mi blocco....
    Io sono un perito elettrotecnico, un pò di elettronica analogica autodidatta e programmazione poco e niente.
    Riesco a modificare un codice in C o meglio CCS C che ho il compilatore ecc ecc e mi baso sui loro example.
    Copio di qua e di là e metto insieme codici che a volte funzionano pure ma non penso alle bestemmie del PIC che lo esegue (ottimizzare)
    Realizzare un codice che legga una word non l'ho mai fatto e non ho trovato che quei due esempi.
    Ovvero, la logica dei comandi per me è arabo, per questo cercavo qualcuno che o mi spiega passo passo il significato o devo andare avanti a tentativi
    Grazie
    How much is a life worth? By law,a bank guard can carry a gun to protect his employer's money.
    But a parent here can't be legally armed to protect her children outside of home. [cit]


  7. #7

    Iscritto dal
    13/12/2011
    Località
    Salento!
    Messaggi
    6,849
    Il codice di Beppe è un buon punto. Appena ho un secondo te lo modifico

  8. #8

    Iscritto dal
    04/09/2011
    Messaggi
    5,404
    ma non ho capito
    hai un programma di base a cui aggiungere questa funzionalità oppure devi fare tutto da zero?

    ammesso che questo famoso sopra ti vada bene, direi che puoi modificare molto grezzosamente con:

    ----------
    FF 0X 00 07 00 XX xx
    ----------
    codice:
    void interrupt SerChar(void) //prototipo ricezione
    {
    	if (RCREG==0xFF) //se arriva FF reinizializzo la ricezione indipendentemente da cosa è successo precedentemente
    	{
    		MioValore=0; //azzero il numero di interesse // anche se credo sia superfluo
    		RxPos=0,Flags=0;
    	}
    
    
    
    
    	if (RxPos==5) { MioValore=RCREG; }
    
    
    	if (RxPos==6) { Flags=1; } // attivazione del parsing basato solo sul numero di caratteri ricevuti
    	RxPos++;
    
    
    	if (Rxpos > 7) { RxPos=7; }
    }



    poi ti modifichi la " void Par_ser(void) // Analisi comandi" come vuoi tu, sapendo che in MioValore hai il numero che ti interessa
    potresti anche attivare il parsing quando ricevi il quinto carattere ignorando completamente che ce ne è un sesto

    Ultima modifica: 09-09-2016 alle 10:27, di xam8re Motivo: Piango a vedere il C indentato a cazzum

  9. #9

    Iscritto dal
    13/12/2011
    Località
    Salento!
    Messaggi
    6,849
    codice:
    #include <pic.h> //libreria standard di riconoscimento hardware
    #include "delay.h" //libreria potenziata versione 2010 di MicroChip per creare ritardi
    #define LED0 RB0
    #define LED1 RB1
    #define LED2 RB2
    #define LED3 RB3
    #define LED4 RB4
    #define LED5 RB5
    #define LED6 RB6
    #define LED7 RB7
    #define RESET 0
    #define CHECKSUM 1
    #define DEVICEADDRESS 1
    
    
    
    
    
    
    extern void Par_ser(void); //predichiarazione funzione scansione contenuto stringhe
    extern void Var_Init(void); //predichiarazione funzione inizializzazione variabili
    unsigned char chk = 0, okaddress = 1,okchk = 0;
    
    
    //unsigned char C1,C2,C3,C4,RxPos,Flags; //dichiarazione variabili contenute in stringa e di riconoscimento stringa
    unsigned char gAddress,gCommand;
    main(void) //inizia la funzione principale
    {
        TRISA = 0x00; // tutte uscite per evitare interferenze
        TRISB = 0x00; // uscite comandi
        TRISC = 0xf8; // bit 6-7 Seriale
    
    
        PORTA = 0x00; // azzera le porte
        PORTB = 0x00; // azzera il PORT B
        PORTC = 0x00;
        Var_Init(); //inizializza le variabili di trasmissione seriale
        ADCON1= 0x87; // PORTA all digital mode
    
    
    //Inizializzazione uart
        TXSTA= 0x20; // TX abilitato
        RCSTA= 0X90; // Registro RX USART
        BRGH = 1; // USART alta velocità
        SPBRG= 25; // Generatore di Baud Rate (25=9600 baud)
    
    
    //Inizializzazione TIMER1
        T1CON = 0; // TIMER 1 resettato
        T1CKPS1 = 0,T1CKPS0=0; // TIMER1 prescaler = 1
        T1OSCEN = 0; // TIMER1 external oscillator disable
        TMR1CS = 0; // TIMER1 internal clock (fosc/4)
        TMR1ON = 0; // TIMER1 in STOP
    
    
    //Inizializzazione interrupt
        INTCON = 0; // Interrupt disabilitato
        PIE1 = 0; // Interrupt di periferica disabilitati
        GIE = 1; // Global Interrupt Enable
        PEIE = 1; // Periferal Interrupt Enable
        RCIE = 1; // USART Receive Interrupt Enable
    
    
        for (;; ) {
            if (Flags==1) Par_ser();
            DelayMs(2); // Delay aggiuntivo
        }
    }  //fine del main
    
    
    
    
    //FF 0X 00 07 00 XX xx
    void interrupt SerChar(void) //prototipo ricezione
    {
        if (RCREG==0xFF) //se arriva FF considero SEMPRE come START FRAME
        {
            RxPos=0;
            gAddress = 0;
            gCommand = 0;
            okaddress = 1;
            chk = 0;
        }
    
    
    
    
        if(okaddress)
        {
            if(RxPos==1)
            {
                gAddress = RCREG;
                okaddress = (gAddress==DEVICEADDRESS);
            }
            if(RxPos==2)
            {
                //NOOP
            }
            if(RxPos==3)
            {
                //NOOP
            }
            if(RxPos==4)
            {
                gCommand = RCREG;
            }
            if(RxPos==5)
            {
                okchk = (chk==RCREG);
                #IF CHECKSUM==1
                flag= (okchk && okaddress) ? 1 : 0;
                #ELSE
                flag= (okaddress!=0) ? 1 : 0;
                #ENDIF
            }
            if(RxPos>5)
            {
                //reset
            }
        }
    
    
        chk+=RCREG;
    
    
        RxPos++;
    }
    
    
    
    
    void Var_Init(void){
        RxPos=0;
        Flags=0;
    }
    
    
    
    
    void Par_ser(void) // Analisi comandi
    {
        Flags=0;
        switch (gCommand) {
        case 0x49: //carattere I Accensione LED 0
            LED0 = 1;
            break;
        }
    }
    Ciao.
    Allora
    #define CHECKSUM 1
    cosi controllo il checksum
    #define CHECKSUM 0
    cosi no.
    Controllo sempre indirizzo, quindi
    #define DEVICEADDRESS 1
    al posto dell'uno metti indirizzo che vuoi assegnare.
    Nel metodo ParSer(void)
    devi gestire i comandi.

  10. #10
    TecnicoERMETICO riciclato
    Iscritto dal
    03/12/2011
    Località
    Monopoli
    Messaggi
    6,760
    Intanto grazie a tutti, di vero cuore... ci sono stati temporali a raffica... sono più i danni che il resto, ma appena posso mi metto a provare
    How much is a life worth? By law,a bank guard can carry a gun to protect his employer's money.
    But a parent here can't be legally armed to protect her children outside of home. [cit]



 

Autorizzazioni

  • Non puoi iniziare nuove discussioni
  • Non puoi rispondere alle discussioni
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
Powered by vBulletin™ Version 4.1.5
Copyright © 2019 vBulletin Solutions, Inc. All rights reserved
SEO by vBSEO ©2011, Crawlability, Inc.
Fuso orario: UTC +1, sono le 12:26.