cloe Inserito: 13 febbraio 2006 Segnala Share Inserito: 13 febbraio 2006 ciao a tutti,sto pilotando (o meglio, sto cercando di pilotare) uno stepper. Per avere una rotazione devo inviare un segnale ad onda quadra su un pin dell'azionamento.per quanto riguarda la movimentazione non ho problemi, l'unico ostacolo è farlo fermare!ho scritto un programmino davvero stupido con CCS. in pratica, in un while(true) ho inserito un if-then-else. nell'if c'è il codice per generare l'onda quadra e far muovere il motore, inoltre c'è un'istruzione che rende falsa la condizione di entrata nell'if; nell'else invece c'è un'istruzione per far lampeggiare un led.in teoria, dopo avere eseguito un volta l'if, il pic dovrebbe eseguire sempre l'else, quindi il motore dopo aver girato di un angolo richiesto dovrebbe restare fermo. il problema è che il pic rientra nell'if, per cui il motore riprende a girare!qlc mi spiega perchè non funziona?poichè non so inserire un allegato, riporto qui sotto il mio codice:#include <16f876.h>#use delay(clock=20000000)//#use standard_io(A)//#use standard_io(#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7)#BYTE spbrg = 0x00#BYTE RCREG = 0x00#BIT brgh = 0x0b.2#BIT sync = 0x0b.4#BIT spen = 0x0b.7#BIT tx9 = 0x0b.6#BIT rx9 = 0x0b.6#BIT txen = 0x0b.5#BIT cren = 0x0b.4#BIT sren = 0x0b.5#BIT txie = 0x0b.4#BIT rcie = 0x0b.5#BIT RCIF = 0x0b.5#BIT TXIF = 0x0b.4void main(){ //valori di default per gli input int16 i,t,w,c,p; int16 num_step; int16 angolo=270; int attiva; SET_TRIS_A(0x00); SET_TRIS_B(0x00); //configura tutto il porto B come porto di output //RA2 = segnale a livello per l'abilitazione del motore //RA1 = segnale a livello per la direzione di rotazione del motore // 0 --> rotazione a sinistra // 1 --> rotazione a destra //RA0 = segnale ad onda quadra per l'ingresso di stepoutput_high(PIN_A2);attiva=1;while(TRUE){ if(attiva) { output_high(PIN_A1); delay_us(150); for(i=0;i<500;i++) //i<200*w { output_high(PIN_A0); delay_us(400); output_low(PIN_A0); delay_us(400); } attiva=0; delay_ms(3000); }else { output_low(PIN_B7); output_high(PIN_B7); } }} Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 13 febbraio 2006 Segnala Share Inserita: 13 febbraio 2006 (modificato) Sostituisci "if(attiva)" con "if(attiva==1)".però mi sembra un po' un sistema UCAS. A cosa serve il while, l'if e l'else? per fare quello che hai scritto bastava il for ed al termine del for fai eseguire le due righe dell'else. Poi metti il ciclo infinito se vuoi che il processore stia li a girare i pollici. Oppure lega la scelta tra il marcia e l'arresto ad uno stato di un ingresso. Modificato: 13 febbraio 2006 da Livio Orsini Link al commento Condividi su altri siti More sharing options...
cloe Inserita: 15 febbraio 2006 Autore Segnala Share Inserita: 15 febbraio 2006 ciao livioprima di tutto volevo ringraziarti per avermi rispostoho introdotto qll'if perchè il mio pic non ne vuole saxe di "girare i pollici"!ho modificato il programma in Questo modo (l'ho riscritto come mi hai suggerito, sperando di aver capito cosa intendevi :-) )#include <16f876.h>#use delay(clock=20000000)#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7)#BYTE spbrg = 0x00#BYTE RCREG = 0x00#BIT brgh = 0x0b.2#BIT sync = 0x0b.4#BIT spen = 0x0b.7#BIT tx9 = 0x0b.6#BIT rx9 = 0x0b.6#BIT txen = 0x0b.5#BIT cren = 0x0b.4#BIT sren = 0x0b.5#BIT txie = 0x0b.4#BIT rcie = 0x0b.5#BIT RCIF = 0x0b.5#BIT TXIF = 0x0b.4void main(){ int16 i; SET_TRIS_A(0b00001000); SET_TRIS_B(0x00); output_high(PIN_A2); output_high(PIN_A1); delay_us(150); for(i=0;i<200;i++) { output_high(PIN_A0); delay_us(400); output_low(PIN_A0); delay_us(400); } delay_ms(3000); while(TRUE) { output_low(PIN_B7); output_high(PIN_B7); } }il motore fa il primo mezzo giro e poi, invece di fermarsi nel while, continua a fare altri mezzi giri!non so davvero come spiegarmelo!grazie mille per qls suggerimento Link al commento Condividi su altri siti More sharing options...
cloe Inserita: 15 febbraio 2006 Autore Segnala Share Inserita: 15 febbraio 2006 ho dimenticato di dirti che con un segnale esterno riesco a fermarlo, ma comunque non riesco a risolvere il problema di tenerlo in ciclo infinito.ciao Link al commento Condividi su altri siti More sharing options...
ifachsoftware Inserita: 15 febbraio 2006 Segnala Share Inserita: 15 febbraio 2006 Probabilmente hai abilitato il Watch-Dog e il pic si auto-resetta.Prova a disabilitarlo o a mettere nel while l'istruzione restart_wdt();Ciao Link al commento Condividi su altri siti More sharing options...
cloe Inserita: 22 febbraio 2006 Autore Segnala Share Inserita: 22 febbraio 2006 grazieeeeeeeeeeeeeeeeeeeeera il watch dog timer! Link al commento Condividi su altri siti More sharing options...
ifachsoftware Inserita: 22 febbraio 2006 Segnala Share Inserita: 22 febbraio 2006 grazieeeeeeeeeeeeeeeeeeeeera il watch dog timer! Link al commento Condividi su altri siti More sharing options...
Messaggi consigliati
Crea un account o accedi per commentare
Devi essere un utente per poter lasciare un commento
Crea un account
Registrati per un nuovo account nella nostra comunità. è facile!
Registra un nuovo accountAccedi
Hai già un account? Accedi qui.
Accedi ora