Cusriositá avr-porte ed assembler

Feb 27, 2011 31 Replies

Debbo lavorare con degli atmega 8, programmando in assembler. Lavorando con degli st62, tempo fa, mi sono imbattuto in un problema (peraltro descritto nel manuale) sulla gestione delle porte.



Mi spiego: Negli st62, ci sono 3 registri per porta, direzione, opzioni e dati. Mentre i registri di direzione ed opzione, una volta programmati, mantengono il valore scritto, il registro dati, che influisce sui pin in ingresso consentendo di selezionare se pull-up o no, modificandone la configurazione ogniqualvolta si attiva o si disattiva un bit in uscita, in quanto in quel tipo di processori, il settaggio di un pin, viene eseguita tramite la rilettura dell'intero byte, per cui il valore dei pin in ingresso, vanno a sovrascrivere la programmazione stessa di quel registro. Il manuale, dice esplicitamente che in caso di uso misto dei pin di una porta, come ingresso ed uscita, di usare un registro immagine, in cui agire con il set/reset dei bit e di scrivere tutto in una volta il nuovo valore sul registro dati.



DO NOT USE READ-MODIFY-WRITE INSTRUC- TIONS (SET, RES, INC and DEC) ON PORT DATA REGISTERS IF ANY PIN OF THE PORT IS CONFIGURED IN INPUT MODE. These instructions make an implicit read and write back of the entire register. In port input mode, however, the data register reads from the input pins directly, and not from the data register latch- es. Since data register information in input mode is used to set the characteristics of the input pin (in- terrupt, pull-up, analog input), these may be unin- tentionally reprogrammed depending on the state of the input pins.



La mia domanda é la seguente: Dovendo usare delle porte con ingressi ed uscite in contemporanea, gestite a bit singolo (sia in ingresso che in uscita), esiste il problema di avere la riprogrammazione errata dei pin?


+---------------------------------------------------------------------------+ | ELICOTTERO: espressione di un extracomunitario per indicare dei cibi: | | E' li cottero. E' la crudero. | +-----#34--------------------Campagna contro le pubblicita` idiote.---------+

BIG (Umberto):

Come nei PIC E' una soluzione economica ma con i problemi che hai riportato.

Bella virgola tra soggetto e verbo. Il manuale di cosa? Dell'AVR? Dubito, dato che, al contrario di PIC e ST6, ha registri separati per la lettura dei pin e la loro scrittura. Con l'esperienza (gli AVR sono più recenti) si impara ad evitare di fare piccoli risparmi potenzialmente molto costosi.

Il giorno Sun, 27 Feb 2011 21:17:56 GMT, "BIG (Umberto)" ha scritto:

ST62, brrr, uno dei peggiori micro che mi sia capitato di usare, non aveva l'AND (o l'OR) e si doveva usare De Morgan per fare l'operzione mencante.

Negli AVR, che sono molto meglio degli ST62, non ci sono questi problemi. Esistono apposite istruzioni come Sbi e Cbi che permettono di effettuare operazioni atomiche sui registri, inoltre i registri di Output, Direction e Input sono separati, quindi non possono influenzare le reciproche operazioni.

Attenzione anche a scrivere e leggere lo stato della porta attraverso il giusto registro, ad esempio PortB per scrivere e PinB per leggere.

Per alzare o abbassare un pin meglio usare Sbi Sbi DdrB,5 Cbi DdrB,6 ;ingresso

Sbi PortB,5 Cbi PortB,6 ;no pullup

E per testare il singolo pin gli AVR hanno istruzioni apposite come SbrS o SbrC Ad esempio:

SbrS PinB,6 Rjmp ON Rjmp OFF

Ti permette di fare un test di stato sul bit di input della porta senza nemmeno dover prima leggere lo stato di PinB su un registro.

-- ciao Stefano

Il 27/02/2011 22.17, BIG (Umberto) ha scritto:

Il problema e' un classico mi sembra di diversi tipi di micro., l'avevo tale quale anche nei Toshiba. Ma nel loro ottimo manuale manuale c'era suggerita anche la soluzione: tieni una copia "virtuale" del registro in un byte in ram che allo start deve essere uguale al valore del registro, qui apporti la modifica (cioe' la leggi e poi la modifichi) e quindi copi l'intero byte sul registro.

ciao giorgio

Giorgio:

Ma non degli AVR.

Il 28/02/2011 8.28, SB ha scritto:

eva l'AND

ah, ST62, uno dei migliori (piu' stimolanti) uC che mi sia capitato di usare, aveva l' AND, non aveva OR, XOR, non andava a destra (shift e rotazione). un rottame, ma andava sempre.

tite a

re la

i.

e' vero, ma negli ST62 era molto facile risolverli; temo che se Umberto ha avuto di questi problemi, ne avra' anche (di altra natura) con gli AVR; per esempio, incappera' nella lettura di una port subito dopo averla modificata.

--=20 saluti lowcost

lowcost:

Non per pignoleggiare, ma per sapere se sai qualcosa in più. Secondo me il problema nasce solo se leggi un certo pin dopo averlo scritto. Nel senso che, credo, se ne scrivi uno e ne leggi subito dopo un altro, anche se dello stesso port, fila tutto liscio.

Tra l'altro il solo utilizzo di una manovra del genere (scrivere e poi leggere lo stesso pin) che mi viene in mente è controllare che non ci sia un corto sull'uscita. O ce ne sono altri?

Il 28/02/2011 15.40, F. Bertolazzi ha scritto:

un

vero.

sia

non lo so, io credo che anche un compilatore potrebbe caderci, scrivere e poi leggere la stessa port, oppure sa che non lo deve fare ?

--=20 saluti lowcost

Il giorno Mon, 28 Feb 2011 15:31:06 +0100, lowcost ha scritto:

Stimolanti in senso fisiologico? :-)

Io l'ho dovuto usare perchè me ne sono trovato in casa un centinaio in cambio di un recupero credito, ma finiti quelli non li ho più voluti vedere. Molto meglio il Motorola 68HC705, che aveva anche l'A/D a bordo, il primo ai suoi tempi, sto parlando dei primi anni'90.

Si, magari leggerà il Port invece del Pin, ma all'inizio può capitare, come può capitare di confondere la sintassi della Sbi con la Sbr, fonte di un errore non sempre facile da rilevare.

Però adesso ci sono cose come l'emulazione del µC attraverso AvrStudio che rendono abbastanza facile scoprire gli errori perchè si ha la situazione sottomano e non bisogna cercare di indovinare le situazioni per risolvere i problemi.

Poi se è riuscito ad usare un catorcio come ST62 deve avere sviluppato delle doti di debugger notevoli, io sono ottimista su un suo passaggio ad un micro moderno e performante come l'AVR.

-- ciao Stefano

SB:

"Performante"??? ;-)

Il giorno Mon, 28 Feb 2011 17:34:29 +0100, "F. Bertolazzi" ha scritto:

Italianizzazione di 'performing', e' dalle 3 che sto chattando con un cinese, posso sbagliarmi.

Comunque gli AVR sono performanti, nel senso che hanno buone prestazioni :-P

-- ciao Stefano

Il 28/02/2011 16.33, SB ha scritto:

nel senso che mi ha costretto ad imparare a cavare sangue da una rapa bianca.

n cambio di

=2E..dovuto usare... un centinaio... recupero credito... capisco il malumore.

--=20 saluti lowcost

lowcost:

Beh, a rigore, sugli AVR, non è la stessa porta...

Concordo sulla soddisfazione del cavar sangue da una rapa. Del resto, visto quanto costano gli ARM Stellaris, che altro motivo c'è per usare gli ormai anch'essi vecchi AVR? Forse giusto la corrente di uscita, che sugli Stellaris mi pare un po' scarsina.

Il 28/02/2011 19:37, F. Bertolazzi ha scritto:

Quoto la corrente di uscita. Aggiungo il pessimo ambiente di sviluppo. Quello freeware (eclipse + codesourcery + zylin) non mi è mai riuscito di farlo funzionare al primo colpo (e attualmente non mi funziona proprio....). Quello pay (codecomposer) l'ho provato in versione demo perché ero intenzionato ad acquistarlo ma è pieno di bachi e ogni due per tre crasha o non riconosce più il target...

Sarò io a essere sfigato ma ci ho provato con 4 pc differenti.

Marco

Il 28/02/2011 19.37, F. Bertolazzi ha scritto:

e

beh, a rigore, non si trova _sugli_ AVR, e non si traduce porta, e ...

dai, non giocare a non capire, che lo sai, OUT su PORTx e IN da PINx. ho escluso gli errori piu' grossolani, come sarebbe quello che citi tu.

--=20 saluti lowcost

Marco Trapanese:

Eh, l'avevo detto, mesi fa, che la Texas s'era comprata una bella vaccata... :-(((

BIG (Umberto):

Non mi dir niente. Quante virgole non ho chiuso? Perciò preferisco le parentesi.

Sì, ma nel titolo implicizzavi altro. ;-)

lowcost:

Io? Figurati, semmai gioco a far finta di capire. :-)

Il 28/02/2011 20.00, Marco Trapanese ha scritto:

Puo usare la suite della Rowley, che supporta anche gli stellaris ..oppure lo IAR :-) A.

Il 02/03/2011 08:17, aa ha scritto:

Non per volere tutto, però la suite della Rowley costa 1500$ e lo IAR non credo sia da meno :)

Marco

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required