Salve a tutti voi del forum, scrivo questo messaggio perché sono disperato.
Ho iniziato a sperimentare un po' con i uC della Atmel, per precisione un AT90USB646...
purtroppo non ho ancora la scheda debugger (la Dragon) e per debuggare il software utilizzo il debugger integrato,
che si chiama avr simulator presente all'interno di AVR studio 5.
Putroppo il debugger non supporta il mio uC e per ora simulo il codice per un ATmega128.
Premessa, vengo da mondo PIC in ASM e C.
Ho capito che uC Atmel hanno per ogni porta 3 registri, in particolare uno detto DDRx che serve per impostare la direzione della porta,
cioè se input o output (se non ricordo male come il vecchio TRIS nel mondo PIC),
un altro detto PORTx che serve per abilitare la resisteza di pullup interna se la porta è configurata come input, oppure per scrivere un dato sulla porta quando è configurata come output. Infine un registro detto PINx che serve per leggere la porta nel caso sia output si legge il dato che sta uscendo o nel caso sia input si legge lo stato dei pin della porta, ad esempio se per qualche stimolo esterno uno o piu pin vengono portati alti/bassi.
Ho capito, spero bene, questo leggendo il DS del micro e seguendo questo link
Adesso mi chiedo, se volessi verificare il cambiamento di un solo bit di una porta settato come ingresso, usando la resistenza di pullup interna?? (in pratica ascolto quando va basso) come posso scrivere il codice? senza usare interrupt... in pratica l'equivalente del vecchio BTF del PIC...
In C non riesco e in assembler provando le istruzioni che trovo sul DS non vanno, non riconosce i comandi. Devo includere qualche altra libreria oltre a quelle già incluse? (ho incluso la IO.h e quella per il reset del watchdog da software, senza programmatore non posso agire sui fuses passando per la programmazione USB che offre il boot loader). Scrivo con AVR Studio 5 in C.
Per qualsiasi altra info che manca per mia svista o ignoranza sono a vostra disposizione, grazie in anticipo. Luca.
Atmel AT90USB646
Moderatore:
Paolino
4 messaggi
• Pagina 1 di 1
0
voti
belva87 ha scritto:Ho capito che uC Atmel hanno per ogni porta 3 registri ...
DDRx significa Data Direction Register, ed è il registro di configurazione I/O come il TRIS per i PIC, con la principale differenza che con i PIC un 1 logico equivale ad un input e viceversa, mentre che con Atmel è il contrario, infatti vedo che il link che hai postato riporta appunto un esempio, ma anche il datasheet lo spiega a pag. 73-74.
Adesso mi chiedo, se volessi verificare il cambiamento di un solo bit di una porta settato come ingresso, usando la resistenza di pullup interna??
Cosa vuol dire "usando la resistenza di pull-up interna"? La resistenza di pull-up interna viene automaticamente attivata se il PUD non è settato e quando il pin è settato come input ed il PORTxn viene impostato a 1 (sempre pag. 73-74 del datasheet)
senza usare interrupt...
Io consiglio di usare le interrupt se puoi, ma questo dipende anche da che pin usi, che non hai specificato.. PCINT sta per Pin Change Interrupt.. un po' come l'Interrupt On Change sui PIC.
Infine, se non usi l'interrupt devi sempre stare a controllare lo stato del pin, mentre sfruttando l'interrupt non ti devi preoccupare di farlo all'interno della normale esecuzione del firmware. Sono fatte apposta. Per l'uso delle librerie vedi la avr-libc home page.
Cosa dice il datasheet riguardo ai pin che vuoi usare ed a quello che vuoi fare?
Ciao
0
voti
Anche io sto studiando insieme a Belva questo nuovo uC. Il quesito che voleva esporre Luca(Belva87) era semplicemete: Senza usare l'interupt, esiste un modo per interrogare direttamente una singola porta del microcontrollore in questione?
Come per esemio sono abituato a fare:
if(PORTBbits.RB0 != 1)
{
esegui();
}
oppure più semplicemente:
pippo = PORTBbits.RB0;
Tralasciando in concetto delle risorse, se è giusto o sbagliato mettere in ciclo infinito l'ascolto di una singola porta. perché il nostro obbiettivo per il programma che ci siamo prefissati era proprio quello, ascoltare in ciclo infinito una singola porta, e nonostante alle altre porte possano arrivare altri impulsi, noi vogliamo catturare solamente quel singolo bit.
Se ho ben capito comunque, la risposta è nel link della libreria che ci hai postato, appena possibile la guarderemo e la controlleremo. Grazie.
Come per esemio sono abituato a fare:
if(PORTBbits.RB0 != 1)
{
esegui();
}
oppure più semplicemente:
pippo = PORTBbits.RB0;
Tralasciando in concetto delle risorse, se è giusto o sbagliato mettere in ciclo infinito l'ascolto di una singola porta. perché il nostro obbiettivo per il programma che ci siamo prefissati era proprio quello, ascoltare in ciclo infinito una singola porta, e nonostante alle altre porte possano arrivare altri impulsi, noi vogliamo catturare solamente quel singolo bit.
Se ho ben capito comunque, la risposta è nel link della libreria che ci hai postato, appena possibile la guarderemo e la controlleremo. Grazie.
2
voti
Per testare un pin d' ingresso, per esempio il bit 4 della porta B si scrive in questo modo:
oppure
Questo perché vai ad isolare il valore del bit con un' operazione di AND. Se il risultato è 0 vuol dire che il pin è a 0, se il risultato è diverso da 0 allora la condizione è verificata perché il pin è a 1.
Poi, se t' interessa, ho tirato giù una putiente libbbreria
per usare gli I/O. Era un file mostruosamente grande
ma l' ho ridotto a questo.
Lo scrivi all' inizio del programma e poi lo usi in questo modo
Per gli output, mettiamo che il bit 2 della porta A sia un output fai così
No ricordo se le macro le avevo testate. Dovrebbero funzionare.
- Codice: Seleziona tutto
if(PINB & 0x10)
{
// esegue se il pin è a 1
}
oppure
- Codice: Seleziona tutto
if(!(PINB & 0x010))
{
// esegue se il pin è a 0
}
Questo perché vai ad isolare il valore del bit con un' operazione di AND. Se il risultato è 0 vuol dire che il pin è a 0, se il risultato è diverso da 0 allora la condizione è verificata perché il pin è a 1.
Poi, se t' interessa, ho tirato giù una putiente libbbreria
ma l' ho ridotto a questo. - Codice: Seleziona tutto
// Macro per la manipolazione delle linee di I/O
#define IOinitOutput(porta,bit) DDR##porta |= 1 << 0##bit
#define IOinitInput(porta,bit) DDR##porta &= (1 << 0##bit)^0xff
#define IOsetBit(porta,bit) PORT##porta |= 1<<0##bit
#define IOresetBit(porta,bit) PORT##porta &= (1<<0##bit)^0xff
#define IOreadBit(porta,bit) PIN##porta &= (1<<0##bit)^0xff
Lo scrivi all' inizio del programma e poi lo usi in questo modo
- Codice: Seleziona tutto
// inizializza il pin 4 della porta B come input
IOinitInput(B,4);
if( IOreadBit(B,4) )
{
// fa qualcosa se il bit è a 1
}
Per gli output, mettiamo che il bit 2 della porta A sia un output fai così
- Codice: Seleziona tutto
// inizializza il pin 2 della porta A come output
IOinitOutput(A,2);
// Mette a 1 il bit 2 della porta A
IOsetBit(A,2);
// Mette a 0 il bit 2 della porta A
IOresetBit(A,2);
No ricordo se le macro le avevo testate. Dovrebbero funzionare.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
-

TardoFreak
73,9k 8 12 13 - -EY Legend-

- Messaggi: 15754
- Iscritto il: 16 dic 2009, 11:10
- Località: Torino - 3° pianeta del Sistema Solare
4 messaggi
• Pagina 1 di 1
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 9 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)


