Vai al contenuto
PLC Forum


Consiglio Su Interrupt O Meglio Aiuto


stefano_

Messaggi consigliati

ciao,

dovrei fare una semplice scheda per comandare 2 stepper in unipolare.

I 2 motori devono poter girare a 2 velocita diverse e variabili ed anche il verso di

rotazione dei 2 motori può essere diverso.

Per fare il tutto ho deciso di utilizzare un 16f84 2 ne555 2 potenziometri per regolare

la velocità dei 2 motori ed un switch 2 poli per invertire il senso di rotazione dei 2

motori.

Bene detto questo voi mi direte che era mooolto più comodo utilizzare un 16f877 e

sfruttare la conversione A/D dello stesso senza utilizzare l' NE ma visto che non sono

esperto avevo paura che:

1) si complicasse troppo la programmazione

2) di 16f84 ne ho parecchi mentre l'877 lo devo acquistare

3) non ho un programmatore che mi programmi pic a 40 piedini

il problema principale comunque rimane quello della programmazione !!!!

vengo al dunque,

per adesso ho utilizzato 1ne che mi genera un onda quadra che mi va ad un ingresso

del pic e ad ogni fronte di salita mi "shifta" di un bit in modo tale da attivare in

sequenza tutte le fasi del motore. Funzia pure bene ora però devon inserire l'altro ne

per il secondo motore e non so come devo fare o meglio avevo pensato di mandare

l'uscita del second ne al pinRB0 ( che se non sbaglio attiva l'interrupt ad

ognicambiamento di stato) in questo modo ogni volta che rb0 cambia stato quindi

ogni 2 cambiamenti di stato shifto l'uscita che va al motore.

Che ne dite ??

Ringrazio tutti e scisate se mi sono dilungato.

Link al commento
Condividi su altri siti


Scusa , ma il primo segnale su che pin lo hai messo ???

Perche' secondo me entrambi andrebbero portati su degli ingressi ad interrupt , e gli unici interrupt che hai su tale PIC sono RB0 e RB4-RB7 , dove per il primo (RB0) hai la possibilita' di gestire l'interrupt su fronte o di salita o di discesa , mentre su RB4-RB7 hai l'interrupt su ogni variazione di stato su uno qualsiasi dei 4 pin.

Data l'applicazione collegherei entrambi per esempio su RB4 e RB5 e ad ogni interrupt , discrimino quello che e' intervenuto e opero di conseguenza.

Ciao :)

Link al commento
Condividi su altri siti

per adesso ho collegato il primo ne ad un ingresso "senza" interrupt ed ho gestito tutto tramite software !!

comunque ora farò come hai detto tu.

Grazie 1000

Link al commento
Condividi su altri siti

per ifachsoftware:

ho fatto come hai detto tu ed ho tirato giu il seguente programmino scritto con mikrobasic:

Dim Conta as integer

Dim Blocca as boolean

' Procedura eseguita quando si verifica un cambiamento di stato sui bit 4,5,6 e 7 di portb

sub procedure int_prova

if testbit (intcon,RBIF) = 1 then 'se l'interupt è stato causato da un cambiamento di stato di rb4,5,6,o 7

conta = conta +1

end if

Select case conta

Case 1

porta.0 = 1

Case 2

portb.0 = 1

End select

end sub

main:

trisa = 0 ' Setto tutta la porta A come uscita

trisb = %00001111 ' Setto la porta B

' In1 = portB.4 pin 10

' In2 = portB.5 pin 11

' Out1 = portA.0 pin 17

' Out2 = portA.1 pin 18

' Out3 = portA.2 pin 1

' Out4 = portA.3 pin 2

' Out5 = portB.0 pin 6

' Out6 = portB.1 pin 7

' Out7 = portB.2 pin 8

' Out8 = portB.3 pin 9

INTCON = %10000001 ' Abilito l'interrupt sul cambiamento di stato dei pic RB4:RB7

end.

in pratica i 2 clock degli ne55 vanno a finire sui pin rb4 ed rb5, testando il bit rbif riesco a sapere se la causa che ha generato l'interrupt è stata il cambiamento di stato di rb4, 5 6 o7 ma non funziona,

ho provato a simularlo ma la sub "int_prova" non viene mai eseguita .

Sicuramente sarà una banalità per te ma per me che non sono esperto mi sta facendo diventare matto !!!

Mi puoi dare qualche dritta ?? Grazie

Link al commento
Condividi su altri siti

Non conosco il Basic della Mikroelectronica , comunque posso dirti che i Pic hanno un interrupt dedicato per i segnali RB4-RB7 , personalmente in C (con cui lavoro solitamente) metterei in una variabile static nell'interrupt il vecchio valore letto sulla porta e poi con dei mascheramenti di bit andrei a capire quale e' il segnale incrementando il contatore.

Ciao :)

Link al commento
Condividi su altri siti

Ti allego un esempio fatto col compilatore C della CCS

short int Cnt1,Cnt2;

#int_rb

void detect_rb_change()

{

int current;

static int last = 0;

set_tris_b(0xF0);

current=input_b();

if ((!bit_test(last,4))&&(bit_test(current,4))) Cnt1++; // Incrementa Cnt1 se variazione su PB4

if ((!bit_test(last,5))&&(bit_test(current,5))) Cnt2++; // Incrementa Cnt2 se variazione su PB4

last=current;

}

void main()

{

Cnt1=Cnt2 = 0; // Azzera i contatori

enable_interrupts(INT_RB);

enable_interrupts(GLOBAL);

while (TRUE)

{

}

}

Link al commento
Condividi su altri siti

grazie infinite,

non ci ho capito molto anche perche non sono esperto comunque me lo studierò per benino e cercherò di tirarci fuori

qualcosa di buono.

Grazie.

Link al commento
Condividi su altri siti

Stefano, te lo do io un consiglio. Lascia stare per il momento il micro basic. Guarda gli esempi ed i tutorial in assembler su come si usano gli inerruts. Fai una prova con una routinetta semplice semplice. Poi cerca di ripeterla in microbasic, magari leggendo il lstato espanso in assembler in modo da poter fare i confronti.

Comunque, come consiglio generale, lascia perdere il microbasic. E' un giocattolo che non porta da nessuna parte.

Link al commento
Condividi su altri siti

Per curiosita' io ho invece provato il pascal... ebbene un'operazione su un longint del tipo pippo:=pippo+1; la compila, invece pippo:=pippo+2; manda in errore il linker :blink::lol: :lol: Peccato... ma se anche basic e C sono a questo livello... :rolleyes:

Link al commento
Condividi su altri siti

scusate, un'ultima cosa,

come posso limitare la corrente ??

Se comandassi i motori in bipolare con i 297 / 298 ho il relativo igresso per limitare la coorrente,

in questo modo invece come posso fare ?

Grazie.

Link al commento
Condividi su altri siti

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 account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...