CONVERSIONE

di il
37 risposte

CONVERSIONE

Buonasera a tutti. Sono un programmatore autodidatta, a cui piace creare progetti hardware gestiti da microcontrollore della Microchip. Devo fare una routine che mi converte un carattere numerico in carattere ascii da trasmettere ad un programma simile a Hyperterminal, con un microcontrollore pic; per essere riconosciuto da Hyperterminal dev'essere ascii, ma siccome non mi è mai capitato di farlo, chiedo aiuto. Supponiamo che devo trasmettere la lettera A

37 Risposte

  • Re: CONVERSIONE

    In C il char è già di suo il tipo numerico ASCII a 8 bit
    
    char x ='A';
    
    oppure
    
    char x = 65;
    
    Cercati un esempio di come si imposta una UART sul tuo processore (baud etc.). Quando è pronta, gli carichi x sul registro di trasmissione e il processore ti spedirà il carattere sul pin TX, che poi verrà convertito in RS-232, USB o quello che c'è sulla tua board. Se devi fare anche tu l'hardware, guarda come si attacca una UART a un MAX3232, ma è meglio se inizi con una board già pronta
  • Re: CONVERSIONE

    Forse cerchi una funzione sprintf o una itoa se disponibile con le librerie che usi.
  • Re: CONVERSIONE

    Mah di solito non uso librerie, ma mi costruisco io le funzioni. Lo so che di solito non si fa così, ma io preferisco per capire bene come si programma da zero. Il problema è che a volte, mi trovo in queste situazioni.
  • Re: CONVERSIONE

    La dichiarazione di variabile CHAR l'ho già provata. Uso una funzione che in un altro progetto funziona perfettamente e trasmette un numero che il processore di un'altra scheda riceve perfettamente. Sono sicuro che l'hardware è giusto perché utilizzo esempi fatti da Mauro Laurenti; secondo me è il programma Terminal Laurtec che richiede un formato speciale che io non so. Se però collego insieme i fili di TX ed RX che devono essere collegati alle porte del processore e che escono dal max232, quello che Terminal trasmette lo riceve.
  • Re: CONVERSIONE

    Il loopback serve solo a controllare che le routine che hai scritto siano corrette. Ovviamente TX e RX dello stesso lato funzioneranno tra di loro perché le impostazioni sono le stesse.

    Controlla bene cosa hai impostato come baud, numero di bit in un byte, parità, stop bits. Prova la configurazione 9600 8-N-1 che è la più comune. Puoi usare Hyperterminal, Putty o qualsiasi altro programma su PC se hai dei dubbi su un programma specifico.

    Prova a mandare il carattere di newline '\n' dopo 'A' (rispettando i limiti di tempo per i caratteri consecutivi del tuo processore), perché alcuni programmi bufferizzano i caratteri in arrivo e non te li mostrano fino a quando non arriva il carattere per andare a capo.

    Ce l'hai l'oscilloscopio? Devi controllare per bene quanto durano i pianerottoli dell'onda quadra per vedere se hai impostato giusta la baud. Un errore tipico è quella di sbagliare di poco la baud lato board, di quanto basta per non comunicare più con il PC
  • Re: CONVERSIONE

    Grazie, provo ad applicare i tuoi consigli. Non ho l'oscilloscopio però
  • Re: CONVERSIONE

    Ho fatto alcune prove e siccome trasferire valori da variabile a funzione, mi fa continuamente errore ho caricato la lettera A nel registro di trasmissione TXREG del microcontrollore. Quella che era la funzione di trasmissione, l'ho caricata direttamente nel Main del software, in modo che la scansiona una volta sola, quando do corrente alla scheda; in verità effettuo tre trasmissioni, una dopo l'altra rispettando i criteri di pausa; trasferisco la lettera A, dopo la \ e per ultima n. Il risultato è che nella finestra di ricezione di Terminal appare un quadratino. Bohhh
  • Re: CONVERSIONE

    '\n', è un carattere solo equivalente a 10, non \ e n

    Il quadratino è un indizio che PC e board stiano andando a due baud differenti. Controlla molto bene a quanto hai impostato la UART se non hai l'oscilloscopio
  • Re: CONVERSIONE

    Mi sa che hai veramente poca esperienza con hw e con il sw.

    Il \n è un solo carattere e come detto corrisponde al 10 ASCII. Non ti conviene usarlo per i test.

    Trasmetti continuamente dei caratteri U codice 85 in un ciclo infinito. Controlla le connessioni hw e soprattutto di avere inserito il corretto codice di inizializzazione del device con corretti parametri di start stop baudrate. Di quale chip si tratta? Mostra come l'hai collegato (schema) e tutto il codice usato.
    Con i Microchip non ho avuto mai problemi.
  • Re: CONVERSIONE

    Mi affido ad un programma fatto che permette di fare dialogare 2 pic16f690 (solitamente uso questo processore). Il settaggio è clock 8Mhz, click interno. 9600 baud 8 bit, 1 stop, n.
    Adesso sono fuori casa ma nel pomeriggio ti mando il collegamento. Grazie a dopo
  • Re: CONVERSIONE

    Ecco il codice per comunicare con Terminal di Laurtec; faccio presente che i dati trasmessi da Terminal li ricevo col PIC, ma non riesco a trasmettere col PIC verso Terminal:

    //Microprocessore usato PIC16F690

    //Fusibili di configurazione

    #pragma config FOSC = INTRCIO // Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA4/OSC2/CLKOUT pin, I/O
    //function on RA5/OSC1/CLKIN)
    #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
    #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
    #pragma config MCLRE = OFF // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to
    //VDD)
    #pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled)
    #pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
    #pragma config BOREN = OFF // Brown-out Reset Selection bits (BOR disabled)
    #pragma config IESO = OFF // Internal External Switchover bit (Internal External Switchover mode is disabled)
    #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
    #define _XTAL_FREQ 8000000 //Oscillatore impostato a 8 MHz

    #include <xc.h>
    #include <string.h>
    #include <stdlib.h>
    #include <stdio.h>

    //Dichiarazioni variabili e funzioni
    tempo = 0; //Routine per ritardo
    int Routine_Ritardo(int func); //Ritardo per pause e antirimbalzo
    int ValoreRicevuto;



    //Input

    #define Rx RB5 //Pin di ricezione

    //Output
    #define Tx RB7 //Pin di trasmissione a porta modulo GSM


    //------------------------------------------------------------------------------

    void __interrupt()intervallo(void) //Interrupt di TIMER0 settato a 1 ms
    {
    //RICEZIONE mediante interrupt (verifica ogni millisecondo)
    while (RCIF) {ValoreRicevuto = RCREG;} //Se buffer ricezione pieno
    //e assenza di trasmissione passa valore

    if (T0IF) //Se overflow
    {


    //-------------------------------------------------------------------------------------------
    T0IF = 0; //Reset
    }

    if (tempo != 0)
    {
    tempo--; //Decremento
    }
    T0IF = 0; //Reset
    }

    //----------------------------------------------------------------------------------------------------
    //Funzione di ritardo (ogni oscillazione è uguale a 1 ms)

    int Routine_Ritardo(func)
    {
    tempo = func;

    while (tempo != 0)
    {
    asm("nop");
    }
    return 0;
    }

    //-----------------------------------------------------------------------------


    void main(void)

    {

    // INIZIALIZZAZIONE HARDWARE

    ANSEL = 0x00;
    ANSELH= 0X00; //Esclusione porte analogiche, tutto digitale i/o

    // PORT A
    TRISA = 0b11111100; //Port A tutto IN

    // PORT B
    TRISB = 0b01101111; //Port B tutto IN tranne bit 4, 7

    // PORT C
    TRISC = 0b10111111; //Port C tutto IN tranne bit 6

    // Oscillatore impostato a 8MHz

    OPTION_REG = 0b10000010; //Prescaler 1:4 e disabilitazione Pull-up
    INTCON = 0b11100000;
    OSCCON = 0b01110000; //Settaggio oscillatore interno a 8 MHz
    TMR0 = 6; //Caricamento TIMER0 a 1 ms

    TXEN = 0; //Disabilitazione temporanea della trasmissione
    RCIE = 1; //Interrupt ricezione abilitato
    SYNC = 0; CREN = 1; SPEN = 1;//Settaggi per ricezione
    BRGH = 1; SPBRG = 51; //Settaggio per velocità di comunicazione (9600 baud rate)
    PORTA = 0X00; PORTB = 0X00; PORTC = 0X00; //Reset delle porte


    //----------------------------------------------------------------------------------------

    while (1)
    {


    Routine_Ritardo(100); //Assestamento linea
    RCIE = 0; //Disabilitazione interrupt ricezione
    TXEN = 1; //Abilitazione trasmissione seriale
    Routine_Ritardo(50); //Assestamento linea

    while (TXIF) {Routine_Ritardo(5); TXREG = 'U';}

    Routine_Ritardo(50); //Assestamento linea

    //FINE TRASMISSIONE

    //SETTAGGIO RICEZIONE
    TXEN = 0; //Disabilitazione trasmissione seriale
    Routine_Ritardo(50); //Assestamento linea
    RCIE = 1; //Abilitazione interrupt ricezione
    }
    }
  • Re: CONVERSIONE

    Usa I tag code per il codice nel forum
  • Re: CONVERSIONE


    File.jpg
    File.jpg

    I collegamenti sono questi. Calcola che il pic è un PIC16F690 e la porta tx è RB7 e la porta RX è RB5. Il quarzo non c'è perchè uso il clock interno da 8 MHz
  • Re: CONVERSIONE

    Al posto di

    while (TXIF) {Routine_Ritardo(5); TXREG = 'U';}

    prova

    while(TXIF == 0);
    TXREG = 'U';
Devi accedere o registrarti per scrivere nel forum
37 risposte