PIC12f675 - Lettura pulsante

4 Anni 4 giorni fa - 4 Anni 4 giorni fa #1 da openSUSE2014
pic12f675 è stato creato da openSUSE2014

Rendering Error in layout Message/Item: array_keys(): Argument #1 ($array) must be of type array, null given. Please enable debug mode for more information.

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • openSUSE2014
  • Avatar di openSUSE2014
  • Junior Member
  • Junior Member
Di più
4 Anni 4 giorni fa - 4 Anni 2 giorni fa #2 da openSUSE2014
Risposta da openSUSE2014 al topic pic12f675
;)
Ultima Modifica 4 Anni 2 giorni fa da openSUSE2014.

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • openSUSE2014
  • Avatar di openSUSE2014
  • Junior Member
  • Junior Member
Di più
4 Anni 4 giorni fa #3 da Cosimix
Risposta da Cosimix al topic pic12f675
Salve!

Qualcosa ti ha portato ad avvicinarti ai PIC e quel qualcosa ha la sua importanza. Magari hai problemi di spazio sul tuo PCB oppure devi produrre parecchi PCB e vuoi risparmiare sul componente, perché gli otto pin e le periferiche del PIC12f675 bastano e avanzano. O più semplicemente vuoi capire meglio come funziona un microcontrollore.

Il problema che hai riscontrato si presenterebbe anche se tu utilizzassi Arduino. Alla base del problema c'è la meccanica del pulsante, che con le sue oscillazioni genera letture non volute. Di conseguenza, le due istruzioni condizionali non sono tra di loro "sincronizzate" (condedimi il termine) perché quando arrivi al while, il valore del pulsante è cambiato a causa dell'oscillazione non voluta (consulta XC8 Step by Step in cui si parla degli spike in lettura). Inoltre, alla successiva lettura, il pulsante si deve ancora stabilizzare e come risultato ottieni un nuovo cambio del valore di uscita. Morale della favola, stai lanciando una moneta e stai sperando che possa uscire testa o croce.

Per aggirare il problema, dopo il primo if aggiungi una pausa di 10 ms e subito dopo esegui di nuovo la lettura del pulsante con un altro if, in cui andrai poi a cambiare il valore dell'uscita.

Saluti,
Cosimo
Ringraziano per il messaggio: openSUSE2014

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Cosimix
  • Avatar di Cosimix
  • Elite Member
  • Elite Member
Di più
4 Anni 4 giorni fa #4 da openSUSE2014
Risposta da openSUSE2014 al topic pic12f675
grazie Cosimix,ho risolto.
una domanda,volendo memorizzare la lettura del pulsante anche quando tolgo l'alimentazione,nel senso che se e acceso e tolgo l'alimentazione e rialimento deve rimanere acceso.
so che dovrei scrivere sulla eeprom del picmicro.

se puoi su quanche suggerimento

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • openSUSE2014
  • Avatar di openSUSE2014
  • Junior Member
  • Junior Member
Di più
4 Anni 3 giorni fa #5 da openSUSE2014
Risposta da openSUSE2014 al topic pic12f675
ho un rgb e ho voluto aggiungere un led a parte con un pulsante.
l'rgb funziona,ma il pulsante con il led non va

qualcuno mi puo' aiutare??

Grazie a tutti

allego file


// PIC12F675 Configuration Bit Settings

// 'C' source line config statements

// CONFIG
#pragma config FOSC = INTRCIO // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-Up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON // GP3/MCLR pin function select (GP3/MCLR pin function is MCLR)
#pragma config BOREN = OFF // Brown-out Detect Enable bit (BOD enabled)
#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 statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>
#include <stdint.h>

#define RED 0b00010000 // GP4
#define GREEN 0b00100000 // GP5
#define BLUE 0b00000100 // GP2
#define puls GP1
#define LED GP0
#define _XTAL_FREQ 8000000
// global variables need less memory
uint8_t redPwm;
uint8_t greenPwm;
uint8_t bluePwm;
uint8_t out;
uint8_t i;
uint8_t j;
uint8_t k;

void cycle(){

// adjust number of cycles for fading speed
for (k = 0; k < 15; k++) {
for (i = 0; i < 255; i++) {
out = 0;
if (redPwm > i) out |= RED;
if (greenPwm > i) out |= GREEN;
if (bluePwm > i) out |= BLUE;
GPIO = out;
}
}
}

int main(){

// configure pin 2, 4 and 5 as output
TRISIO = 0b11001010;
OPTION_REG = 0b01000000;
ADCON0 = 0x00; // Shut off the A/D Converter
CMCON = 0x07; // Shut off the Comparator
//ANSEL = 0b00000111;

// fading algorithm
while (1) {
// blue to red
for (j = 0; j < 255; j++) {
bluePwm = 255 - j;
redPwm = j;
cycle();
}
cycle();

// red to green
for (j = 0; j < 255; j++) {
redPwm = 255 - j;
greenPwm = j;
cycle();
}
cycle();

// green to blue
for (j = 0; j < 255; j++) {
greenPwm = 255 - j;
bluePwm = j;
cycle();
}
cycle();

for(;;){

if(puls == 0){

__delay_ms(10);

if(puls == 0){

LED = ~LED; // Toggle GP5 pin ( ~ )

}

while(puls == 0){

}
}
}
}
}

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • openSUSE2014
  • Avatar di openSUSE2014
  • Junior Member
  • Junior Member
Di più
Moderatori: Mauro LaurentiPinnaStefAMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Login