Progetti

   

Sponsor

   

Servizi

   
Benvenuto, Ospite
Nome utente: Password: Ricordami

ARGOMENTO: __delay_ms(1000) sembra non funzionare

__delay_ms(1000) sembra non funzionare 1 Anno 3 Mesi fa #6

  • Lello Guidi
  • Avatar di Lello Guidi
  • Offline
  • Platinum Boarder
  • Messaggi: 370
  • Ringraziamenti ricevuti 9
  • Karma: 3
Non non funziona ancora!
:(
Ho semplificato il listato e ho sistemato i registri seguendo le vostre indicazioni, almeno penso...
Il listato è diventato questo:
/**********************          ************************
* Fotocellula v1.0
* modulo: Fotocellula.x
* data: 21 noembre 2019
* descrizione: Lettura del valore di una fotocellula e attivazione 
*	       di un rele' se supera la soglia impostata
* librerie: Microchip
* compilatore: MPLABX IDE v4.01 e XC8 v1.45
* picmicro: PIC12F683
* configurazione:
* 	LDR = GP4/AN3 
*       LEDv = GP1 Rele'
* 	LEDr = GP2 Led giallo
*
/******************************************************************/
#include <xc.h>
 
// CONFIG
#pragma config FOSC = INTOSCIO  // 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)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
#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 Detect (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 
#define LDR GPIObits.GP4    // pin3 AN3
#define Rele GPIObits.GP1  	// pin6 AN1
#define Led GPIObits.GP2	// pin5 AN0
 
// variabili
signed int luce = 512;
signed int lettura = 0;
 
// funzioni
void blink();
 
int main(void) {
 
    OPTION_REG = 0b00000000;    // bit 8 (GPPU) disabilitato)
    GPIO = 0b00000000;        // tutte le uscite a zero
	WPU = 0b00000000;		 // Pull-up disabilitati
    TRISIO = 0;         // GP4/AN3 IN, gli altri OUT , The weak pull-up device is automatically disabled if the pin is in Output mode (TRISIO = 0)
    ANSEL = 0b00101000;       // AN3 ingresso analogico x ADC, Fosc/32
    ADCON0 = 0b10001101;     // risultato giustificato a Dx, Vref=Vdd, AN3(GP4), ADC abilitato
 
	while(1)
        {
        //***************************
        //*    ADC legge la luce    *
        //***************************
        __delay_us(20);     //  delay to GO=1;
        GO_DONE  = 1;       // abilito conversione
        while(GO_DONE);     // attesa fine conversione
        lettura = ADRESL+(ADRESH<<8);
        if (lettura >= luce) 
            { 
            Rele = 1; 
            Led = 0;
           }
        else if (lettura < luce) 
            {
            Rele = 0;
            Led = 1;
	   //blink(); 
            }
		} // end while
	} // end main
 
void blink() {
	Led = Led^1; // pin5 AN2
	__delay_ms(500);
	}
Ho cambiato anche l'uscita testando sia il GP0 che il GP1 ma il relè rimane sempre attivo.
L'unica cosa che funziona variando il potenziometro è il led che cambia di stato, quindi la procedura ADC funziona.
Pensavo fosse più semplice usare un "piccolino" tipo 12F683 per quello che devo fare.
Non volevo usare un 16F877A o peggio il cip che ho sulla Freedom II che mi sembravano sprecati.
Ma neanche ritornare ad un Arduino Nano che era stato troppo facile.
Saluti

Lello
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

__delay_ms(1000) sembra non funzionare 1 Anno 3 Mesi fa #7

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Offline
  • Moderatore
  • Messaggi: 4666
  • Ringraziamenti ricevuti 557
  • Karma: 52
Salve Lello,

le variabili

signed int luce = 512;
signed int lettura = 0;

le puoi dichiarare unsigned.

unsigned int luce = 512;
unsigned int lettura = 0;

ma questo non è il problema.

Il pin usato per l'ADC lo devi impostare come ingresso e non come uscita.

La conversione:

lettura = ADRESL+(ADRESH<<8);

ha un problema di overflow. Lo shift lo devi fare dopo aver convertito il valore del registro a 16 bit e non subito.
ADRESH<<8 ti da altrimenti sempre 0 visto che è un registro a 8 bit.

lettura = ADRESL+(ADRESH<<8);

lo devi cambiare in:

lettura = ADRESL + ((unsigned int) ADRESH ) <<8;

o ancor meglio fai il casting esplicito di entrambi

lettura = (unsigned int) ADRESL + ((unsigned int) ADRESH ) <<8;

Per le altre configurazioni, per sapere se sono corrette dovresti "postare" lo schema elettrico,

Saluti,

Mauro
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

__delay_ms(1000) sembra non funzionare 1 Anno 3 Mesi fa #8

  • Lello Guidi
  • Avatar di Lello Guidi
  • Offline
  • Platinum Boarder
  • Messaggi: 370
  • Ringraziamenti ricevuti 9
  • Karma: 3
Ho fatto le modifiche come consigliato, ma il led sul pin7(GP0), il rele' rimane fisso acceso.
cambia solo il Led sul GP2.
il listato corretto:
/**********************          ************************
* Fotocellula v1.0
* modulo: Fotocellula.x
* data: 21 noembre 2019
* descrizione: Lettura del valore di una fotocellula e attivazione 
*				di un ree'¨ se supera la soglia impostata
* librerie: Microchip
* compilatore: MPLABX IDE v4.01 e XC8 v1.45
* picmicro: PIC12F683
* configurazione:
* 	LDR = GP4/AN3 
*   LEDv = GP0 Rele
* 	LEDr = GP2 Led giallo
*
/******************************************************************/
#include <xc.h>
 
// CONFIG
#pragma config FOSC = INTOSCIO  // 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)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
#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 Detect (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 
#define LDR GPIObits.GP4    // pin3 AN3
#define Rele GPIObits.GP0   // pin7
#define Led GPIObits.GP2    // pin5 
 
// variabili
unsigned int luce = 512;
unsigned int lettura = 0;
 
// funzioni
void blink();
 
int main(void) {
 
    OPTION_REG = 0b00000000;    // bit 8 (GPPU) disabilitato)
    GPIO = 0b00000000;        // tutte le uscite a zero
    WPU = 0b00000000;		 // Pull-up disabilitati
    TRISIO = 0b00001000;      // GP4/AN3 IN, gli altri OUT 
    ANSEL = 0b00101000;       // AN3 ingresso analogico x ADC, Fosc/32
    ADCON0 = 0b10001101;     // risultato giustificato a Dx, Vref=Vdd, AN3(GP4), ADC abilitato
 
	while(1)
        {
        //***************************
        //*    ADC legge la luce    *
        //***************************
        __delay_us(20);     //  delay to GO=1;
        GO_DONE  = 1;       // abilito conversione
        while(GO_DONE);     // attesa fine conversione
        lettura = (unsigned int) ADRESL + ((unsigned int) ADRESH ) <<8;
        if (lettura >= luce) 
            { 
            Rele = 1; 
            Led = 0;
           }
        else if (lettura < luce) 
            {
            Rele = 0;
            Led = 1;
            //blink(); 
            }
		} // end while
	} // end main
 
void blink() {
	Led = Led^1; // pin5 AN2
	__delay_ms(500);
	}
Ho allegato lo schema del circuito con il prototipo.
Saluti

Lello
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

__delay_ms(1000) sembra non funzionare 1 Anno 3 Mesi fa #9

  • Lello Guidi
  • Avatar di Lello Guidi
  • Offline
  • Platinum Boarder
  • Messaggi: 370
  • Ringraziamenti ricevuti 9
  • Karma: 3
Mi era venuto il sospetto che il cip avesse delle porte guaste.
Ho fatto due semplici programmini per testatre le porte del 12F675 e del 12F683.
Uno è :
/*  Name     : main.c
 *  Purpose  : Main file for LED blinking code for PIC12F683.
 *  Date     : 22 novembre 2019
 *  Revision : None
 */
//#include<htc.h>
#include <xc.h>
 
#pragma config FOSC = INTOSCIO   
#pragma config WDTE = OFF       
#pragma config PWRTE = OFF      
#pragma config MCLRE = OFF       
#pragma config BOREN = ON       
#pragma config CP = OFF         
#pragma config CPD = OFF      
 
// Define LED pin
#define LED0 GP0    // pin7
#define LED1 GP1    // pin6
#define LED2 GP2    // pin5
#define LED5 GP5    // pin2
 
// Define CPU Frequency
// This must be defined, if __delay_ms() or 
// __delay_us() functions are used in the code
#define _XTAL_FREQ   8000000    
 
// Main function
void main()
{	
	ANSEL  = 0x00;       // Set ports as digital I/O, not analog input
	ADCON0 = 0x00;		 // Shut off the A/D Converter
	CMCON0  = 0x00;		 // Shut off the Comparator
	VRCON  = 0x00;	     // Shut off the Voltage Reference
	TRISIO = 0x00001000;       // GP3 input, rest all output
	GPIO   = 0x00;       // Make all pins 0
 
	while(1)
	{
		__delay_ms(500);       // Half sec delay
		LED0 = 0;               // LED off
        LED1 = 0;
        LED2 = 0;
        LED5 = 0;
		__delay_ms(500);       // Half sec delay
		LED0 = 1;               // LED on
        LED1 = 1;
        LED2 = 1; 
        LED5 = 1; 
	}
}

L'altro è:
/*  Name     : main.c
 *  Purpose  : Main file for LED blinking code for PIC12F675.
 *  Date     : 22 novembre 2019
 *  Revision : None
 */
//#include<htc.h>
#include <xc.h>
 
#pragma config FOSC = INTRCIO   
#pragma config WDTE = OFF       
#pragma config PWRTE = OFF      
#pragma config MCLRE = OFF       
#pragma config BOREN = ON       
#pragma config CP = OFF         
#pragma config CPD = OFF      
 
// Define LED pin
#define LED0 GP0    // pin7
#define LED1 GP1    // pin6
#define LED2 GP2    // pin5
#define LED5 GP5    // pin2
 
// Define CPU Frequency
// This must be defined, if __delay_ms() or 
// __delay_us() functions are used in the code
#define _XTAL_FREQ   4000000    
 
// Main function
void main()
{	
	ANSEL  = 0x00;       // Set ports as digital I/O, not analog input
	ADCON0 = 0x00;		 // Shut off the A/D Converter
	CMCON  = 0x07;		 // Shut off the Comparator
	VRCON  = 0x00;	     // Shut off the Voltage Reference
	TRISIO = 0x00001000;       // GP3 input, rest all output
	GPIO   = 0x00;       // Make all pins 0
 
	while(1)
	{
		__delay_ms(500);       // Half sec delay
		LED0 = 0;               // LED off
        LED1 = 0;
        LED2 = 0;
        LED5 = 0;
		__delay_ms(500);       // Half sec delay
		LED0 = 1;               // LED on
        LED1 = 1;
        LED2 = 1; 
        LED5 = 1; 
	}
}

Cercando di impostare i bit di configurazione di entrambi corretti secondo il datasheet.
Sorpresa!
I led sulle uscite del 12f675 lampeggiano tutti correttamente.
I led delle uscite del 12F683 lampeggia solo quella sul GP5 (pin2), le altre uscite sono fisse a "1"(led acceso).
I casi sono tre:
1) ho sbagliato i settaggi del pic
2) i 2 pic 12F683 arrivati direttamente via posta dalla Microcip sono taroccati.
3) io ho fottuto qualche uscita mentre li maneggiavo, con qualche scarica elettrostatica.

Non so cosa pensare d'altro.
Saluti

Lello
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

__delay_ms(1000) sembra non funzionare 1 Anno 3 Mesi fa #10

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Offline
  • Moderatore
  • Messaggi: 4666
  • Ringraziamenti ricevuti 557
  • Karma: 52
Salve Lello,

sul programma dove hai messo la foto:

TRISIO = 0b00001000; // GP4/AN3 IN, gli altri OUT

non è corretto. GP4 è il quinto bit visto che hai anche GP0.
Quindi devi scrivere come sotto o non leggi l'ADC

TRISIO = 0b00010000; // GP4/AN3 IN, gli altri OUT

Ricontrolla gli altri registri.
Hanno problemi simili.

Gli esempi finali fai uso di GP0 direttamente e non GPIObits.GP0

Non ho controllato gli header file ma non sono certo se GP0 sia definito come GPIObits.GP0.

Saluti,

Mauro
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.
Ringraziano per il messaggio: Lello Guidi
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Powered by Forum Kunena
   
© LaurTec 2006-2015