Newsgroup: it.hobby.elettronica.digitale
Titolo: "domandone" per esperti di ST6...

Salve a tutti!
    Ho da poco cominciato a dilettarmi con gli st6 (st6265c) e in un
programmino che vorrei mettere in opera ho una perplessità che probabilmente
per chi ha un po' più di esperienza è banale...
Vengo al dunque: ho le necesità ad un certo punto di leggere un bit da una
porta settata come ingresso (es: 1b) e di riportarlo di conseguenza su di
un'altra settata come uscita (es: 1a). Io avrei già risolto con un sistema
un po' arzigogolato, ma la cosa forse più semplice (senza scomodare salti
condizionati tipo jrr, jrs che poi hanno il limite del numero di linee del
"salto" ecc...) sarebbe quella di copiare questo bit in ingresso in una
variabile da me definita e poi da quì alla porta in uscita. Ma è possibile
fare uno di questi 2 passaggi che riguardano 1 solo bit e non l'intero byte?
Mi spiego, è corretta una cosa del tipo:
        ldi    1,var,1,port_b
        ldi    1,port_a,1,var
dove "var" è la mia variabile... ho la netta sensazione che non si possa
fare proprio così! Si accettano in ogni caso suggerimenti per raggiungere lo
scopo...
Grazie a chi avrà la pazienza di rispondermi...
    Mauro.

     Mauro.
Mi pare che il tuo problema si risolva con la funzione AND e NOT
ti interessa il bit 1 (si parte dal bit 0 a destra)
es. tu hai una variabile con 0010 0110 che rispecchia il port di ingresso A
mascheri con AND (eseguendo l'operazione di AND) tutto tranne il bit 1:0000 0010
e ti ritrovi con: 0000 0010 se il bit 1A è a 1 e
0000 0000 se il bit 1A è a 0
Esegui il NOT della variabile in cui hai sistemato la copia del port_A
ottenendo:
1111 1101 se il bit 1A è a 1 e 1111 1111 se il bit 1A è a 0
Infine prendi il tuo port_b (salvato in una variabile) supponiamo essere 1101
1011 ed esegui il NOT ritrovando 0010 0100
fai l'AND con la variabile in cui avevi salvato il port_A
0010 0100
AND
1111 1101 (se il  bit 1A era a 1)
=
0010 0000
esegui il NOT
1101 1111  che è  ill port_b come avevi con solo il bit 1a 1
esempio con bitport 1A a 0:
0010 0100
AND
1111 1111
=
0010 0100
esegui il NOT
1101 1011 che iè il port_b con il bit 1 a 0
ricapitolando e nella pratica
port_b:   1101 1011 (uscita)
port_a:  0010 0110 (ingresso)
mi interessa che il bit 1 del port_a sia riportato sul bit 1 del port_b senza
toccare gli altri bit sia su port_a che port_b
;preparazione registri copia dei port
ld a,port_b
ld copy_b,a
ld a,port_a
ld copy_a,a
ld a,copy_a
andi a,0000 0010
not a
ld copy_a,a
ld a,copy_b
not a
and a,copy_a
ld port_b,a
dovrebbe essere così, ovviamente è nato tutto in pochi minuti quindi va preso
con le pinze.
CIAO, Rik.

scopo...
esatto! Č proprio sbagliata.
Provo a scrivertela al volo (tieni conto che č l'una di notte passata)
           JRS     1,port_b,Qui
           RES   1,port_a
           JP       Qua
Qui     SET    1,port_a
Qua    ...........
Questo č il sistema piů immediato che mi viene in mente al momento...
Forse ti puň essere utile il fatto che ogni volta che si esegue un test di
bit, il bit
testato viene copiato nel flag di carry...Boh!
Buon lavoro!
Pasu

 CIAO, Rik.
Dimenticavo di aggiungere che a me i salti condizionati non piaccione per niente in
quanto rendono piů difficile prevedere i timing della routine...
RICIAO, Rik

RICIAO, Rik
Sull'ST6 questo non e' un problema per che' i salti condizionati
durano un numero fisso di colpi di clock indipendentemente
dal fatto che salti o non salti. In particolare :
JRR, JRS -> 5 clk
JRZ, JRNZ, JRC, JRNC -> 2 clk
Ciao, Massimo - IW1FDX
E-Mail    
max...@libero.it
Visita la pagina dedicata ai microcontrollori ST62
all'indirizzo 
http://digilander.iol.it/max4000

 JRZ, JRNZ, JRC, JRNC -> 2 clk
Piu' che colpi di clock direi cicli macchina (1 ciclo = 13 colpi di ck).
Con quarzo a 8Mhz:  JRR = 5 cicli = 65 colpi di ck = 8,125microsec
ciao
Claudio

Max4000 ha scritto:

Ma la soluzione proposta da Pasu  a secondo se il bit 1 del port b e' a
0 esegue 2
istruzioni per andare a "qua" mentre se e' a 1 esegue 3 istruzioni per
andare a "qua"...
e' questo quello che intendevo, non sei daccordo ?
           JRS     1,port_b,Qui
           RES   1,port_a
           JP       Qua
Qui     SET    1,port_a
Qua    ...........
CIAO , Rik

 ha scritto nel messaggio
news:4Lbr6.5294$Z%1.16...@news.infostrada.it...


 Qua    ...........
Non importa il numero di istruzioni ma la durata complessiva dei due rami
dell' IF. La routine qui sotto dura in entrambi i casi 13 cicli macchina
(169 colpi di clock):
           JRS     1,port_b,Qui      5 cicli
           RES   1,port_a              4 cicli
           JP       Qua                    4 cicli
Qui     SET    1,port_a              4 cicli
           NOP                             2 cicli
           NOP                             2 cicli
Qua    ...........
ciao
Claudio

Con quarzo a 8Mhz:  JRR = 5 cicli = 65 colpi di ck = 8,125microsec
Si' scusa hai ragione, mi sono espresso male io


CIAO , Rik
Certo quando hai bisogno di tempi di esecuzione costanti basta
che allunghi il ramo piu' corto con dei NOP e risolvi i problemi...
se hai dei numeri di Cicli dispari li riporti pari inserendo dei JRR
o JRS che saltano alla istruzione successiva, che quindi
non hanno effetto se non quello di ritardare di 5 cicli.


Claudio F ha scritto:

I NOP non erano indicati nell'esempio di Pasu. Per me esiste uno stile nella
programmazione e non solo una cozzaglia di salti che rendono complicate
eventuali modifiche al firmware. Morale: so bene cosa sono i NOP ma li odio.
Inoltre mi spieghi che non contano le istruzioni, ma inserisci i NOP per
"equilibrare i tempi"
come vedi hai aggiunto istruzioni...pensi che con l'esempio di Pasu io non
avessi tenuto conto dei cicli ?
CIAO, Rik..

 Inoltre mi spieghi che non contano le istruzioni, ma inserisci i NOP per
"equilibrare i tempi" come vedi hai aggiunto istruzioni... pensi che con
l'esempio di Pasu io non avessi tenuto conto dei cicli ?
Visto che non ti conosco non ho la minima idea di cosa hai oppure no tenuto
conto, la mia informazione poteva forse esserti utile, visto che sapevi gia'
tutto meglio cosi'  ;)  Io ho solo affermato che non conta la quantita' di
istruzioni ma la somma delle loro durate , nel senso che non e' detto che
tre istruzioni durino meno tempo di quattro.
ciao
Claudio

 > Morale: so bene cosa sono i NOP ma li odio.
[........]

OK!
Grazie a tutti delle risposte... ho adattato un po' le vostre soluzioni al
programmino che stavo scrivendo, cmq tutto funziona alla perfezione!
    Thanks, Mauro

 fatto si che erroneamente io credessi di parlare con qualcuno che voleva "a
In effetti ho usato due diversi pc...č colpa che ho creato confusione con due
alias diversi. Devo ammettere che l'assembler ST6 ha messo a dura prova i miei
nervi e ho odiato molto non poter indirizzare memoria esterna di programma su
quel micro tanto da arrivare un po' ad odiarlo...e a preferire un assembler piů
lineare e non rivolto solo a contenere la memoria. Quello che voglio dire č che
se assembler deve essere va bene il limite delle istruzioni, va bene l'impegno
celebrale, perň la memoria no, 2 4 o 8 K che siano sono pochi...(sfogo personale
o.t.)
CIAO, Rik.

messo a dura prova i miei  nervi
[.......]
Se non hai visto quello risc dei PIC non hai ancora visto nulla..... ;)
All'inizio faticavo a credere che si potessero scrivere dei programmi in
quel modo, per esempio non i sono i salti condizionati ma dei semplici skip
(scarti) dell'istruzione successiva (che puo' essere pero' un salto
incondizionato)... questo significa che la condizione "se X allora salta
a..." va pensata come: "se non X allora scarta il salto a..."
ciao
Claudio

 Se non hai visto quello risc dei PIC non hai ancora visto nulla..... ;)
Simpatici... io di questi "salti assurdi e skip vari" ne sono tutt'ora
entusiasta !!
Il bello č tutto lě, specialmente quando funziona !!!
