- Messaggi: 15
- Ringraziamenti ricevuti 0
Più led con un pulsante solo: come fare?
12 Anni 1 Mese fa #1
da speedfish
Più led con un pulsante solo: come fare? è stato creato da speedfish
Buonasera! Studio da pomeriggio sul seguente problema: ho un pulsante su un pic18f4550 in RB4 e 4 led con transistor su RD0, RD1, RD2 ed RD3 volevo realizzare qualcosa che alla prima pressione del pulsante accenda il led su RD0, lasciato il pulsante si spenga il led; alla seconda pressione del pulsante si accenda il led su RD1, lasciato il pulsante si spenga il led e così via fino ad RD3... Ho provato in 2000 modi differenti ma non sono riuscito nel mio intento in nessun modo... Penso, logicamente, dovrebbe essere:
#include <p18f4550.h>
#include <portb.h>
#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF
void main (void){
char i = 0;
LATA = 0x00;
TRISA = 0xFF;
LATB = 0x00;
TRISB = 0xFF;
LATC = 0x00;
TRISC = 0xFF;
LATD = 0x00;
TRISD = 0x00;
LATE = 0x00;
TRISE = 0xFF;
EnablePullups();
while (1) {
if (PORTBbits.RB4 == 0) {
if (i == 1) {
LATDbits.LATD0 = 1;
LATDbits.LATD1 = 0;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 0;
}
if (i == 2) {
LATDbits.LATD0 = 0;
LATDbits.LATD1 = 1;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 0;
}
if (i == 3) {
LATDbits.LATD0 = 0;
LATDbits.LATD1 = 1;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 0;
}
if (i == 4) {
LATDbits.LATD0 = 0;
LATDbits.LATD1 = 0;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 1;
i=0;
}
}
else {
LATDbits.LATD0 = 0;
LATDbits.LATD1 = 0;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 0;
i++;
}
}
}
Ma chiaramente se non premo il pulsante i aumenta in continuazione... Ma allora come si fa? Credo sia semplice risolvere ma non ho idea di come fare... in attesa di risposte,
Grazie in anticipo,
Giuseppe.
#include <p18f4550.h>
#include <portb.h>
#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF
void main (void){
char i = 0;
LATA = 0x00;
TRISA = 0xFF;
LATB = 0x00;
TRISB = 0xFF;
LATC = 0x00;
TRISC = 0xFF;
LATD = 0x00;
TRISD = 0x00;
LATE = 0x00;
TRISE = 0xFF;
EnablePullups();
while (1) {
if (PORTBbits.RB4 == 0) {
if (i == 1) {
LATDbits.LATD0 = 1;
LATDbits.LATD1 = 0;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 0;
}
if (i == 2) {
LATDbits.LATD0 = 0;
LATDbits.LATD1 = 1;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 0;
}
if (i == 3) {
LATDbits.LATD0 = 0;
LATDbits.LATD1 = 1;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 0;
}
if (i == 4) {
LATDbits.LATD0 = 0;
LATDbits.LATD1 = 0;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 1;
i=0;
}
}
else {
LATDbits.LATD0 = 0;
LATDbits.LATD1 = 0;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 0;
i++;
}
}
}
Ma chiaramente se non premo il pulsante i aumenta in continuazione... Ma allora come si fa? Credo sia semplice risolvere ma non ho idea di come fare... in attesa di risposte,
Grazie in anticipo,
Giuseppe.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- speedfish
- Autore della discussione
- New Member
Riduci
Di più
12 Anni 1 Mese fa - 12 Anni 1 Mese fa #2
da speedfish
Risposta da speedfish al topic Re: Più led con un pulsante solo: come fare?
Ho pensato a questo e sembra quasi funzionare, solo che ogni tanto i led rimangono accesi:
#include <p18f4550.h>
#include <portb.h>
#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF
void main (void)
char i = 0;
LATA = 0x00;
TRISA = 0xFF;
LATB = 0x00;
TRISB = 0xFF;
LATC = 0x00;
TRISC = 0xFF;
LATD = 0x00;
TRISD = 0x00;
LATE = 0x00;
TRISE = 0xFF;
while (PORTBbits.RB4 == 0) {
switch(i) {
case 0:
LATDbits.LATD0 = 1;
LATDbits.LATD1 = 0;
if (PORTBbits.RB4 == 1) {
i++;
break;
}
break;
case 1:
LATDbits.LATD0 = 0;
LATDbits.LATD1 = 1;
if (PORTBbits.RB4 == 1) {
i=0;
break;
}
break;
}
}
}
qualcuno ha delle idee?
Grazie in anticipo
#include <p18f4550.h>
#include <portb.h>
#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF
void main (void)
char i = 0;
LATA = 0x00;
TRISA = 0xFF;
LATB = 0x00;
TRISB = 0xFF;
LATC = 0x00;
TRISC = 0xFF;
LATD = 0x00;
TRISD = 0x00;
LATE = 0x00;
TRISE = 0xFF;
while (PORTBbits.RB4 == 0) {
switch(i) {
case 0:
LATDbits.LATD0 = 1;
LATDbits.LATD1 = 0;
if (PORTBbits.RB4 == 1) {
i++;
break;
}
break;
case 1:
LATDbits.LATD0 = 0;
LATDbits.LATD1 = 1;
if (PORTBbits.RB4 == 1) {
i=0;
break;
}
break;
}
}
}
qualcuno ha delle idee?
Grazie in anticipo
Ultima Modifica 12 Anni 1 Mese fa da speedfish.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- speedfish
- Autore della discussione
- New Member
Riduci
Di più
- Messaggi: 15
- Ringraziamenti ricevuti 0
12 Anni 1 Mese fa - 12 Anni 1 Mese fa #3
da Matteo Garia
Risposta da Matteo Garia al topic Re: Più led con un pulsante solo: come fare?
#include <p18f4550.h>
#include <portb.h>
#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF
void main (void){
char i = 0;
static bit premuto;
LATA = 0x00;
TRISA = 0xFF;
LATB = 0x00;
TRISB = 0xFF;
LATC = 0x00;
TRISC = 0xFF;
LATD = 0x00;
TRISD = 0x00;
LATE = 0x00;
TRISE = 0xFF;
EnablePullups();
while (1) {
if (PORTBbits.RB4 == 0) {
if(!premuto){
i++;
premuto = 1;
}
if (i ==5){i=0;}
if (i == 1) {
LATDbits.LATD0 = 1;
LATDbits.LATD1 = 0;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 0;
}
if (i == 2) {
LATDbits.LATD0 = 0;
LATDbits.LATD1 = 1;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 0;
}
if (i == 3) {
LATDbits.LATD0 = 0;
LATDbits.LATD1 = 1;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 0;
}
if (i == 4) {
LATDbits.LATD0 = 0;
LATDbits.LATD1 = 0;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 1;
i=0;
}
}
else {
LATDbits.LATD0 = 0;
LATDbits.LATD1 = 0;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 0;
i++;
premuto = 0;
}
}
}
Ho messo in evidenza le modifiche.
"premuto" è un flag che tiene conto dello stato del pulsante al ciclo precedente
Il codice funziona solo in teoria, è necessario aggiungere una funzione di antirimbalzo per il pulsante.
Semplicmente quando è premuto puoi aspettare un certo tempo intorno a 50-200 ms e verificare se è ancora premuto, prima di eseguire il codice
#include <portb.h>
#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF
void main (void){
char i = 0;
static bit premuto;
LATA = 0x00;
TRISA = 0xFF;
LATB = 0x00;
TRISB = 0xFF;
LATC = 0x00;
TRISC = 0xFF;
LATD = 0x00;
TRISD = 0x00;
LATE = 0x00;
TRISE = 0xFF;
EnablePullups();
while (1) {
if (PORTBbits.RB4 == 0) {
if(!premuto){
i++;
premuto = 1;
}
if (i ==5){i=0;}
if (i == 1) {
LATDbits.LATD0 = 1;
LATDbits.LATD1 = 0;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 0;
}
if (i == 2) {
LATDbits.LATD0 = 0;
LATDbits.LATD1 = 1;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 0;
}
if (i == 3) {
LATDbits.LATD0 = 0;
LATDbits.LATD1 = 1;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 0;
}
if (i == 4) {
LATDbits.LATD0 = 0;
LATDbits.LATD1 = 0;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 1;
}
}
else {
LATDbits.LATD0 = 0;
LATDbits.LATD1 = 0;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 0;
premuto = 0;
}
}
}
Ho messo in evidenza le modifiche.
"premuto" è un flag che tiene conto dello stato del pulsante al ciclo precedente
Il codice funziona solo in teoria, è necessario aggiungere una funzione di antirimbalzo per il pulsante.
Semplicmente quando è premuto puoi aspettare un certo tempo intorno a 50-200 ms e verificare se è ancora premuto, prima di eseguire il codice
Ultima Modifica 12 Anni 1 Mese fa da Matteo Garia.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Matteo Garia
- Moderator
Riduci
Di più
- Messaggi: 376
- Ringraziamenti ricevuti 38
12 Anni 1 Mese fa #4
da speedfish
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.
Risposta da speedfish al topic Re: Più led con un pulsante solo: come fare?
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.
- speedfish
- Autore della discussione
- New Member
Riduci
Di più
- Messaggi: 15
- Ringraziamenti ricevuti 0
12 Anni 1 Mese fa #5
da shinshi
Risposta da shinshi al topic Re: Più led con un pulsante solo: come fare?
Scusate l'ignoranza,
Potete spiegarmi cosa è
static bit premuto;
Forse è una variabile statica lunga 1 bit?
Invece:
if(!premuto){
Forse è ....se diverso da 1 {....
Grazie anticipatamente per le risposte.
Potete spiegarmi cosa è
static bit premuto;
Forse è una variabile statica lunga 1 bit?
Invece:
if(!premuto){
Forse è ....se diverso da 1 {....
Grazie anticipatamente per le risposte.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- shinshi
- Elite Member
Riduci
Di più
- Messaggi: 293
- Ringraziamenti ricevuti 29
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.
Login
© LaurTec 2006 - 2024