Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Come risolvere una lunga cascata di IF

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[31] Re: Come risolvere una lunga cascata di IF

Messaggioda Foto UtenteEcoTan » 24 ott 2021, 8:32

Va bene, con l'array di puntatori adesso funziona. Grazie.
Però mi appalla scrivere tutte quelle funzioni void, se ci fosse un modo per puntare a delle semplici label da cui uscire con un goto.. scherzavo.
A proposito, come si termina correttamente un programma?
Codice: Seleziona tutto
#include "fusebit.c"//osc.fastRC with PLL e tutto libero
#include "p33FJ128MC802.h"
//_FOSCSEL (FNOSC_FRCPLL & IESO_ON)//FastRC 7,37 MHz wPLL
#define ledr _LATA4 // RA4 pin12 led rosso (come scheda MUIN)
#define ledv _LATB4 // RB4 pin11 led verde

void lab1() {ledr=1;}
void lab2() {ledv=1;}

int main (void) {                   //Main Program
PLLFBDbits.PLLDIV=41;//PLLDIV=41 M=43 clock Tcy=25 ns
CLKDIVbits.PLLPOST=0;//N1=2 N2=2(def) 7.37*M/N1/N2=79Mhz~40MIPS
while (OSCCONbits.COSC != 0b001){}; // Sure for FastRC w PLL   
while(OSCCONbits.LOCK!=1) {};       // Wait for PLL to lock
TRISA = 0b1111111111101111;         //OUT RA4 PIN12 LED rosso
TRISB = 0b1111111111101111;         //OUT RB4 PIN11 LED verde

void (*fun_ptr_arr[])() = {lab1, lab2};

(*fun_ptr_arr[0])();//accende il led rosso

kk:goto kk;}
Avatar utente
Foto UtenteEcoTan
6.200 4 10 13
Expert EY
Expert EY
 
Messaggi: 4149
Iscritto il: 29 gen 2014, 8:54

1
voti

[32] Re: Come risolvere una lunga cascata di IF

Messaggioda Foto Utentegvee » 24 ott 2021, 9:25

6 anni fa avevi fatto la stessa domanda:

viewtopic.php?f=17&t=60281&p=602343#p602339

EcoTan ha scritto:A proposito, come si termina correttamente un programma?

Il firmware di una MCU dovrebbe rimanere sempre in esecuzione con un while(1) che puoi interrompere con una opportuna condizione di break per il loop. Ma poi devi fare un reset al micro manualmente o con una logica esterna.

Perché vuoi interromperlo ?
Avatar utente
Foto Utentegvee
875 2 6
Frequentatore
Frequentatore
 
Messaggi: 288
Iscritto il: 11 feb 2018, 20:34

0
voti

[33] Re: Come risolvere una lunga cascata di IF

Messaggioda Foto Utentexyz » 24 ott 2021, 9:59

fairyvilje ha scritto:... Sembra molto ispirato a bison/flex o viceversa ...

Si, mi serviva tutta la logica dietro Bison e Flex ma il codice generato dai due programmi non è adatto a un microcontrollare, quindi ho cercato qualcosa di minimale molto simile e che generava un codice facilmente compilabile sui dispositivi con poche risorse.
Avatar utente
Foto Utentexyz
6.635 2 4 5
G.Master EY
G.Master EY
 
Messaggi: 1712
Iscritto il: 5 dic 2009, 18:37
Località: Italy Turin

2
voti

[34] Re: Come risolvere una lunga cascata di IF

Messaggioda Foto UtenteEcoTan » 24 ott 2021, 13:25

gvee ha scritto:6 anni fa avevi fatto la stessa domanda

Per penitenza ho scritto un programmino per accertarmi che l'array di puntatori a funzioni possa essere sfruttato da una ISR. Ho fatto la prova con la ISR dello ADC ed effettivamente ho constatato che ruotando un potenziometro si comandano i led. Ecco il codice:
Codice: Seleziona tutto
#include "fusebit.c"//osc.fastRC with PLL e tutto libero
#include "p33FJ128MC802.h"
//_FOSCSEL (FNOSC_FRCPLL & IESO_ON)//FastRC 7,37 MHz wPLL
#define ledr _LATA4 // RA4 pin12 led rosso (come scheda MUIN)
#define ledv _LATB4 // RB4 pin11 led verde

int buf;
void ron() {ledr=1;}
void von() {ledv=1;}
void rof() {ledr=0;}
void vof() {ledv=0;}
void (*fun_ptr_arr[])() = {ron, von, rof, vof};

int main (void) {                   //Main Program
PLLFBDbits.PLLDIV=41;//PLLDIV=41 M=43 clock Tcy=25 ns
CLKDIVbits.PLLPOST=0;//N1=2 N2=2(def) 7.37*M/N1/N2=79Mhz~40MIPS
while (OSCCONbits.COSC != 0b001){}; // Sure for FastRC w PLL   
while(OSCCONbits.LOCK!=1) {};       // Wait for PLL to lock
TRISA = 0b1111111111101111;         //OUT RA4 PIN12 LED rosso
TRISB = 0b1111111111101111;         //OUT RB4 PIN11 LED verde

AD1CON1bits.SSRC=7;   //ADC1 module auto-convert
AD1CON1bits.ASAM=1;   //ADC1 module auto-start
AD1CON3bits.SAMC = 31 // SAMPLE TIME 31 CK
AD1CON3bits.ADCS = 63 //ADC CK 40/(63+1)MHz 14conv+31samp 14kS/s
AD1CON1bits.ADON=1;   //ADC1 module ON
IEC0bits.AD1IE = 1;   //ADC int.ENABLE

while (1);}

void __attribute__((no_auto_psv)) _ISRFAST _ADC1Interrupt(void)//ADC ISR ogni 73uS 
{ buf=ADC1BUF0;//lettura da potenziometro
buf=buf>>8;// risoluzione da 10 a 2 bit
(*fun_ptr_arr[buf])();//comanda i led
IFS0bits.AD1IF = 0;  } //reset int flag, ISR esce

Adesso non ho più scuse e debbo aggiustare i miei programmi.
Avatar utente
Foto UtenteEcoTan
6.200 4 10 13
Expert EY
Expert EY
 
Messaggi: 4149
Iscritto il: 29 gen 2014, 8:54

1
voti

[35] Re: Come risolvere una lunga cascata di IF

Messaggioda Foto Utentespeedyant » 26 ott 2021, 15:28

PietroBaima ha scritto:
alev ha scritto:Non so se soddisfi la richiesta

-snip-
Inoltre l’uso dello switch è oggi deprecato e viene conservato unicamente per legacy.

Mi potresti indirizzare ad una fonte? Vorrei approfondire sta cosa.
Grazie!
Son quello delle domande strane!
Avatar utente
Foto Utentespeedyant
4.499 3 6 8
Master
Master
 
Messaggi: 3165
Iscritto il: 9 lug 2013, 18:29
Località: Torino

1
voti

[36] Re: Come risolvere una lunga cascata di IF

Messaggioda Foto UtentePietroBaima » 26 ott 2021, 15:51

speedyant ha scritto:Mi potresti indirizzare ad una fonte? Vorrei approfondire sta cosa.
Grazie!

Per esempio qui e le (molte) pagine seguenti.
Generatore codice per articoli:
nomi
emoticon
citazioni
formule latex
Avatar utente
Foto UtentePietroBaima
84,6k 7 12 13
G.Master EY
G.Master EY
 
Messaggi: 11097
Iscritto il: 12 ago 2012, 1:20
Località: Londra

Precedente

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti