Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it L'avatar di Fado84
    Registrato dal
    Feb 2004
    Messaggi
    347

    [Assembler] Pic16f84 comandato da pc

    salve a tutti, ho realizzato questa scheda utilizzando questo componente.. QUI
    ora dopo aver letto un pò di documenti su linguaggio assembler e come programmare i pic (pic16f84) sono incappato in un grosso problema.. come faccio a portare a livello alto un'output del chip da pc???
    per favore aiutatemi.. sono nuovo del campo.. se non sono stato chiaro chiedete che cercerò di rispondere in modo più chiaro..
    ciao e grazie in anticipo

  2. #2
    Premetto che ho lavorato solo con il uC 18F452 della microchip. Quello che usi te è un po' vecchio, ma le funzioni basilari dovrebbero essere le medesime. Quindi non so se quello che ti dirò sarà corretto al 100%...

    Se vai nel sito della microchip puoi scaricare il manuale specifico per il tuo uControllore. Lì puoi capire come funziona nei minimi dettagli; in più è presente la lista, spiegata, di tutti i comandi assembly che riconosce.
    In più puoi scaricare il loro compilatore gratuito "MPLab" col quale scrivere il programma in "PICC" o "Assemby".

    Dopo questa premessa vorrei sapere una cosa: hai sostituito il uC dello schema con il PIC16F84? Come mai? Lo sai vero che adesso devi cambiare leggermente il ciruito?

    Comunque arrivando a come cambiare lo stato dei pin d'uscita devi sapere su che PORT vuoi posizionare le uscite, devi renderle digitali (solo se hanno la possibilità di ricevere anche dati analogici), sapere il loro indirizzo esadecimale e predisporli per l'output. [Per esempio prendo i pin 7-8-9, rispettivamente RB1-2-3] A questo punto all'interno del tuo programma (quello che risiede nel uC) dovrai aggiungere queste line per l'inizializzazione:
    codice:
    TRISB=0x00 //Configura tutto il PORTB in uscita
    mentre nella parte di programma in cui devi modificare lo stato dell'output scrivi
    codice:
    RB1=0; //Pin 7 = 0
    RB1=1; //Pin 7 = 1
    RB2=0; //Pin 8 = 0
    RB2=1; //Pin 8 = 1
    RB3=0; //Pin 9 = 0
    RB3=1; //Pin 9 = 1
    Questo lo puoi scrivere in "PICC" se hai già un header in cui assegni ad ogni parola il corrispondente indirizzo.

    in Assembly, invece, la parte di inizializzazione sarà
    codice:
    MOVLW 0x00 ;Scrive 0 nel registro W
    MOVWF 86h ;Copia ciò che c'è in W all'indirizzo esadecimale 86 (TRISB)
    E poi
    codice:
    BCF 06h, 1 ;Bit Clear File -> Azzera il bit 1 all'indirizzo 06h (RB1)
    BSF 06h, 1 ;Bit Set File -> Pone a 1 il bit 1 all'ndirizzo 06h (RB1)
    BCF 06h, 2 ;Bit Clear File -> Azzera il bit 2 all'indirizzo 06h (RB2)
    BSF 06h, 2 ;Bit Set File -> Pone a 1 il bit 2 all'ndirizzo 06h (RB2)
    BCF 06h, 3 ;Bit Clear File -> Azzera il bit 3 all'indirizzo 06h (RB3)
    BSF 06h, 3 ;Bit Set File -> Pone a 1 il bit 3 all'ndirizzo 06h (RB3)
    (in assembly il ";" serve per iniziare il commento mentre in PICC va messo alla fine di ogni stringa.)

    Ovvio che dal lato PC dovrai avere un programma che manda in seriale un dato al PIC, il quale lo riceve, lo interpreta e da il comando in out.

    Spero di essere stato chiaro.


    Ciao

  3. #3
    Utente di HTML.it L'avatar di Fado84
    Registrato dal
    Feb 2004
    Messaggi
    347
    ciao, prima di tutto grazie per la risposta.. ma evidentemente non sono stato chiaro nella spiegazione..
    quello che mi hai postato +/- lo so gia fare.. il problema è un altro.. volevo sapere come portare a livello alto un'output del chip inviando un segnale da pc tramite rs232.. per farti capire tramite visual basic inviando questo comando:
    codice:
    MSComm1.Output = "KEY1"
    portavo a livello alto un'uscita che mi eccitava un relè.
    ora volevo sapere come far questo con questo chip (16f84) o con un altro chip della microchip.. dato che il linguaggio assembly per ora non lo conosco ancora bene.. solo teoria da un giorno e niente pratica..
    spero di essere stato chiaro ora.. cmq grazie mille per la risposta!!
    CIAO!

  4. #4
    Utente di HTML.it L'avatar di Fado84
    Registrato dal
    Feb 2004
    Messaggi
    347
    dimenticavo: si, lo modifico il circuito, lo faccio nuovo con almeno 7 relè ciao!

  5. #5
    Io uso il C++, ma credo che le cose siano simili (come logica intendo)al VB, quindi spero di esserti d'aiuto...

    Credo che il PIC16F84 non possegga la possibiltà di trasmettere e ricevere serialmente. Ti conviene dare un occhio al manuale. Ti spiego comunque come farlo con un PIC che abbia queste caratteristihe (per esempio il 16f452 o 18f452)

    Il dato che trasmetti dal pc deve essere una variabile unsigned char poiché è costituita da 8 bit. Infatti, secondo il protocollo RS232, il dato spedito in seriale deve essere costituito da un bit di start, 8 di dati ed uno di stop.
    Così, invece di porre sulla seriale il termine "KEY1" (che immagino sia una costante per attivare il primo relé), mettendoci questa variabile hai la possibilità di attivare fino a 255 relé.

    Non ho la più pallida idea di come farlo in assembly (perché il tutto va fatto in interrupt)...in PICC invece è più semplice.
    Prima di tutto devi cercare nel manuale del PIC che intendi utilizzare quali flag alza la ricezione seriale e quali sono i parametri di inizializzazione (MOLTO IMPORTANTI PERCHE' FUNZIONI).

    Per il 18F452 ci sono molti parametri da impostare prima di poter ricevere o spedire, ma siccome sono in ufficio e non ho sotto mano alcuni appunti aspetto stasera verso le 19.00 e ti posto un programma che ha tutte le funzioni che ti servono.

    Il main program dovrà essere vuoto o comunque non contiene nulla che possa servire alla ricezione. Il tutto avviene nella routine di interrupt:
    codice:
    {if(RCIE&&RCIF) //Se Rx attivato e il flag(RCIF) è 1 (C'è dato in arrivo)
      {unsigned char Input=RCREG;
       if(Input==0x01)//Se 1
         {[...];} //Qui attivi o disattivi i relé
                  //a seconda delle tue esigenze
       if(Input==0x02)//Se 2
         {[...];} //Come prima
       if(Input==0x10)//Se 16
         {[...];} //Idem
       //Ecc.
       //Ecc.
      RCIF=0; //Resetti il flag e rimani in attesa del prossimo dato
      }
    Questa è la base, ma da sola non basta. Dopo inserisco un paio di sorgenti perfettamente funzionanti che ti aiuteranno molto (spero)


    Ciao e scusa se non posso farlo subito, ma a memoria non me li ricordo...

  6. #6
    Utente di HTML.it L'avatar di Fado84
    Registrato dal
    Feb 2004
    Messaggi
    347
    sei stato gentilissimo se stasera mi posti i sorgenti sarei a cavallo ed inizierei a studiarmi un pò il codice ed il chip..
    quello che voglio fare è semplice penso ma per uno come me all'inizio inizio è difficile.. voglio alzare il livello di un output da pc tramite l'invio9 di una stringa di comando da vb.. quello che non riesco a fare è proprio la programmazione del chip..
    da adesso uso picc dato che è più semplice..
    per la scelta del chip opterò per il tuo chip, pensavo che tutti i chip avessero questa funzione all'interno..
    grazie ancora mille!!!!
    ciao!

  7. #7
    Come promesso:
    codice:
    /*********************
    *      RICEZIONE     *
    *********************/
    
    #include <pic18.h>
    #include <sci18.h>
    #include <del18.h>
    #include <config.h>
    
    unsigned char Stato;
    unsigned char Muovi;
    unsigned char FaseSopra=0x04;
    unsigned char FaseSotto=0x04;
    unsigned char FSopra;
    unsigned char FSotto;
    unsigned char Fase;
    unsigned char CwSp=0;
    
    unsigned char CwSt=0;
    int FSx, FUp, FDx, FDw, i;
    
    
    void main(void)
    {TRISD=0;//PORTD OUT
     TRISC=0xFF;//PORT C IN 
     sci_Init(4800, SCI_EIGHT);
     PIR1 = 0;	/* clear any pending interrupts */
    
     PEIE = 1;	/* enable perhipheral interrupts */
     TXIE = 1;	/* enable tx interrupts */
     RCIE = 1;	/* enable rx interrupts */
     GIE  = 1;	/* global interrupts enabled */
     while(1) {}	//Ciclo infinito in attesa di un interrupt
    }
    
    void interrupt isr(void)
    {if(RCIF && RCIE)
       {Stato=sci_GetByte();
        Muovi=Stato&0x0F;
        FSx=(PORTC&0x01)<<4;
    	FDw=(PORTC&0x02)<<4;
    	FDx=(PORTC&0x04)<<4;
    	FUp=(PORTC&0x08)<<4;
        if(FSx) Muovi=Muovi&(~0x01);
    	if(FUp) Muovi=Muovi&(~0x02);
       	if(FDx) Muovi=Muovi&(~0x04);
    
       	if(FDw) Muovi=Muovi&(~0x08);
    
    //Muovo motore	
    	switch(Muovi)
    		{case 0x04: {FaseSotto=FaseSotto>>1;	//Sx
    		 			 FaseSopra=FaseSopra;
    		 			 CwSt=1;
    		             break;}			
    		 case 0x08: {FaseSopra=FaseSopra>>1;	//Up
    		 			 FaseSotto=FaseSotto;
    		 			 CwSp=1;     
    
    			         break;}
    		 case 0x01: {FaseSotto=FaseSotto<<1;	//Dx
    			         FaseSopra=FaseSopra;
    			         CwSt=0;
    			         break;}
    		 case 0x02: {FaseSopra=FaseSopra<<1;	//Dw
    			         FaseSotto=FaseSotto;
    			         CwSp=0;
    			         break;}
    		 case 0x0C: {FaseSotto=FaseSotto>>1;	//Sx-Up
    		  			 FaseSopra=FaseSopra>>1;
    			         CwSt=1;
    			         CwSp=1;
    			         break;}		 
    		 case 0x09: {FaseSotto=FaseSotto<<1;	//Dx-Up
    		             FaseSopra=FaseSopra>>1;
    			         CwSt=0;
    			         CwSp=1;
    			         break;}
    		 case 0x03: {FaseSotto=FaseSotto<<1;	//Dx-Dw
    		 			 FaseSopra=FaseSopra<<1;
    			         CwSt=0;
    			         CwSp=0;
    			         break;}
    		 case 0x06: {FaseSotto=FaseSotto>>1;	//Sx-Dw
    		 			 FaseSopra=FaseSopra<<1;
    			         CwSt=1;
    			         CwSp=0;
    			         break;}
    		 default: {FaseSotto=FaseSotto; FaseSopra=FaseSopra; break;}
    		}
       if((CwSp)&&(FaseSopra==0x02)) FaseSopra=0x20;
       if((!CwSp)&&(FaseSopra==0x40)) FaseSopra=0x04;
       if((CwSt)&&(FaseSotto==0x02)) FaseSotto=0x20;
       if((!CwSt)&&(FaseSotto==0x40)) FaseSotto=0x04;
       FSopra=FaseSopra<<2;
       FSotto=FaseSotto>>2;
       Fase=FSopra|FSotto;
       PORTD=Fase;
       DelayMs(4);
       }
    }
    //-------------------------------------------
    Da notare che questo programma deve essere compilato obbligatoriamente con MPLab perché gli include all'inizio sono specifici per i uC della microchip.

    Piccolo appunto -> Probabilmente la funzione DelayMs(x); non ti funzionerà perché le librerie sono state modificate dal mio prof. qualche anno fa...lo stesso vale per sci_GetByte(); ma non ne sono certo...:master:

    Se ci sono errori è a causa delle librerie...ed allora dimmelo che provvederò a procurartele o aggirarle...

    Ciao

  8. #8
    Utente di HTML.it L'avatar di Fado84
    Registrato dal
    Feb 2004
    Messaggi
    347
    grazie, sei di parola!
    adesso ti farò una serie di domande stupide e ti prego di scusarmi fin da ora..
    1) dove trovo qualche doc su mplab? io caccio dentro il codice ma poi premo semaforo verde ma non funge come anche il debug.. cmq è un compilatore C.
    2) ma con mplab programmo il chip o comunico tramite rs232 e basta?
    3) in che riga imposto con che parola mi porta a livello alto un'output? questa parola la definisco con
    codice:
    unsigned char FSopra;
    scusa ma con il C sono un pò arruginito anche se informatica B l'ho data 6 mesi
    mi trovo un pò spaesato.. dopo assembler che avevo +/- capito mi ritrovo questo... adesso cerco di informarmi di più si mslab.. cmq grazie ancora..
    ciao

  9. #9
    Originariamente inviato da Fado84
    1) dove trovo qualche doc su mplab? io caccio dentro il codice ma poi premo semaforo verde ma non funge come anche il debug.. cmq è un compilatore C.
    2) ma con mplab programmo il chip o comunico tramite rs232 e basta?
    3) in che riga imposto con che parola mi porta a livello alto un'output? questa parola la definisco con
    codice:
    unsigned char FSopra;
    1) A dire la verità non so dove trovare dei documenti cartacei su quel programma...probabilmente sul sito della microchip trovi qualcosa... E' sì un compilatore, ma siccome deve scrivere il programma sul PIC lui non fa altro che trasformarlo in assembly e cercare enventuali errori. Se alla fine del processo è andato tutto bene, puoi scrivere il programma sul PIC (devi selezionare il tipo di programmatore hardware che usi) altrimenti controlli gli errori che risulatano. In più puoi simulare cosa accadrebbe se fosse già su uC tramite gli strumenti Pin Stimulus, WatchTimer ed altri che trovi nel pannello in alto.

    2) Non scrivi tramite RS232 direttamente sul PIC, ma passi attraverso un programmatore hardware (ad esempio PICStartPlus o altri della lista)...(ops ma tu programmavi tramite il programma di nutchip?? Boia... mi sa di averti complicato un po' le cose....)

    3) Tu definisci una variabile di 8 bit. Questa sarà settata da te in un certo modo in VB
    codice:
    unsigned char PippoPC;
    PippoPC=0x01; //0x indica esadecimale ma puoi scriverlo in
                //binario o decimale o ottale a seconda dei tuoi gusti
    e spedita in seriale. Il PIC lo riceverà e verrà posto in un suo registro
    codice:
    unsigned char PippoPIC;
    PippoPIC=sci_GetByte();
    e a seconda del valore che gli hai dato da tastiera farà operazioni diverse
    codice:
    switch(PippoPIC)
      {case 0x01: {operazione1;
                   operazione2;
                   break;}
       case 0x02: {operazione3;
                   break;}
       ecc.ecc.ecc.
      }
    Per portare una sola uscita bassa (ad esempio RB0) il comando è
    codice:
    RB0=0;
    oppure
    PORTB=0x00;
    Per portarla alta:
    codice:
    RB0=1;
    oppure
    PORTB=0x01;
    Ricorda che col comando PORTB=numero; setti tutti gli 8 bit.


    Mi spiace se non sono molto chiaro, ma solitamente spiego meglio davanti a una lavagna....

    E per il fatto del programmatore...non ci avevo pensato...costa un fottio effettivamente...chissà se a basso costo trovi qualcosa..

    Per sdebitarmi in questi giorni cerco un progetto di un programmatore e lo posto o ti mando il link tramite PM (sempre se lo trovo)


    Ciao

  10. #10
    Utente di HTML.it L'avatar di Fado84
    Registrato dal
    Feb 2004
    Messaggi
    347
    cosa e dove insegni??.. che mi intrufulo in aula!!
    per il programmatore posso scroccarlo ad un mio amico.. cmq ho un programmatore molto artigianale per il pic16f84....
    adesso, cioè domani mattina do un'occhiata.. e vediamo se finalmente ho capito..
    ciao!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.