Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Flag su PIC16F876A

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Flag su PIC16F876A

Messaggioda Foto Utentemattia281193 » 22 mar 2014, 15:40

Ciao a tutti,
ho la necessità di attivare la PORTB0 del micro "simulando un bistabile"in uscita ovvero utilizzando un flag che mi permetta di cambiare stato della porta in corrispondenza dell'incremento o decremento di una variabile .
Ho collegato un led in uscita alla portb0, ma a parte durante i 100 ms iniziali rimane spento, mentre dovrebbe accendersi all'invio da seriale di 0x61.
premetto che non sono un esperto quindi il codice non è il massimo.
Codice: Seleziona tutto
char uart_rd;
bit oldstate;
void main() {
  TRISB=0;
  UART1_Init(9600);
  Delay_ms(100);
  PORTB=0x01;
  Delay_ms(100);
  PORTB=0x00;
  oldstate = 0;
  while (1) {
RB0_bit=oldstate;
    if (UART1_Data_Ready()) {
      uart_rd = UART1_Read();
      if (uart_rd==0x61){
      if(oldstate==0){
      oldstate=1;
       }
      }
     if (uart_rd==0x61){
     if(oldstate==1){
      oldstate=0;
      }
     }
  }
}
}
Avatar utente
Foto Utentemattia281193
26 4
Frequentatore
Frequentatore
 
Messaggi: 132
Iscritto il: 1 ott 2011, 13:38

0
voti

[2] Re: Flag su 16f876a

Messaggioda Foto Utentec1b8 » 22 mar 2014, 18:06

Ti riporto una parte di codice commentandola
Codice: Seleziona tutto
// verifica se ricevo un carattere
if (UART1_Data_Ready()) {
    // leggo il carattere ricevuto
    uart_rd = UART1_Read();

    // 1) se il carattere ricevuto è 0x61 e oldstate è 0 allora oldstate=1
    if (uart_rd==0x61){
        if(oldstate==0){
            oldstate=1;
        }
    }

    // 2) se il carattere ricevuto è 0x61 e oldstate è 1 allora oldstate=0
    if (uart_rd==0x61){
        if(oldstate==1){
            oldstate=0;
        }
    }
}

Come puoi vedere quando il programma riceve un carattere esegue le due if ai punti 1) e 2) in succesione.
Quando è verificata la 1) imposta oldstate a 1, questo però fa si che la 2) immediatamente dopo sia anch'essa valida: quando il programma arriva a verificare la 2), oladstate vale 1 perché appena impostato dallo 1) e quindi torna ad essere 0.

Prova a modificare così:
Codice: Seleziona tutto
// verifica se ricevo un carattere
if (UART1_Data_Ready()) {
    // leggo il carattere ricevuto
    uart_rd = UART1_Read();

    // 1) se il carattere ricevuto è 0x61
    if (uart_rd==0x61){
        if(oldstate==0){
            oldstate=1;
        } else {
           //  altrimenti oldstate=0
            oldstate=0;
        }
    }
}
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[3] Re: Flag su PIC16F876A

Messaggioda Foto Utentemattia281193 » 22 mar 2014, 19:47

Ok grazie, il problema è che io con lo stesso carattere voglio stesso carattere voglio spegnere il led, cosi facendo con ogni carattere lo potrei fare. :(
Avatar utente
Foto Utentemattia281193
26 4
Frequentatore
Frequentatore
 
Messaggi: 132
Iscritto il: 1 ott 2011, 13:38

1
voti

[4] Re: Flag su PIC16F876A

Messaggioda Foto Utentec1b8 » 22 mar 2014, 19:54

No, se guardi bene il codice che ti ho scritto il controllo sul valore del LED viene fatto solo quando ricevi il carattere 0x61, non per qualsiasi carattere. Quindi solo con il carattere 0x61 accendi e/o spegni il led
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

2
voti

[5] Re: Flag su PIC16F876A

Messaggioda Foto Utentekarl246 » 22 mar 2014, 20:19

Credo si possa snellire il codice facendo la xor su oldstate ogni volta che si riceve il carattere 0x61.... praticamente se è accesso lo spegne e viceversa. :ok:


Codice: Seleziona tutto
    char uart_rd;
    bit oldstate;
    void main() {
      TRISB=0;
      UART1_Init(9600);
      Delay_ms(100);
      PORTB=0x01;
      Delay_ms(100);
      PORTB=0x00;
      oldstate = 0;
      while (1) {
               RB0_bit=oldstate;
               if (UART1_Data_Ready()) {
                       uart_rd = UART1_Read();
                       if (uart_rd==0x61) oldstate ^= 1;   //XOR su oldstate       
                 }      //fine if
       }                //fine while
    }
Carlo.

"E' inutile cercarsi i guai visto che ci sono già loro che cercano noi" cit. TardoFreak
Avatar utente
Foto Utentekarl246
985 2 6 10
Frequentatore
Frequentatore
 
Messaggi: 138
Iscritto il: 10 ago 2010, 0:12

1
voti

[6] Re: Flag su PIC16F876A

Messaggioda Foto Utentekarl246 » 22 mar 2014, 20:21

oldstate ^= 1 è un modo contratto per dire
oldstate = oldstate ^ 1
oldstate = oldstate xor 1

O_/
Carlo.

"E' inutile cercarsi i guai visto che ci sono già loro che cercano noi" cit. TardoFreak
Avatar utente
Foto Utentekarl246
985 2 6 10
Frequentatore
Frequentatore
 
Messaggi: 138
Iscritto il: 10 ago 2010, 0:12

0
voti

[7] Re: Flag su PIC16F876A

Messaggioda Foto Utentemattia281193 » 23 mar 2014, 23:39

Grazie per l'aiuto... Mi ero focalizzato su altro quando alla fine bastava un else ... Grazie ancora!! :ok:
Avatar utente
Foto Utentemattia281193
26 4
Frequentatore
Frequentatore
 
Messaggi: 132
Iscritto il: 1 ott 2011, 13:38


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 0 ospiti