Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Atmel AT90USB646

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Atmel AT90USB646

Messaggioda Foto Utentebelva87 » 16 feb 2012, 0:02

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.
Avatar utente
Foto Utentebelva87
2.292 2 6 12
free expert
 
Messaggi: 1323
Iscritto il: 9 mag 2011, 15:01

0
voti

[2] Re: Atmel AT90USB646

Messaggioda Foto Utentesimo85 » 16 feb 2012, 4:02

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
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[3] Re: Atmel AT90USB646

Messaggioda Foto UtenteMarcRider » 16 feb 2012, 18:05

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.
Avatar utente
Foto UtenteMarcRider
5 1 4
New entry
New entry
 
Messaggi: 53
Iscritto il: 16 feb 2012, 17:37

2
voti

[4] Re: Atmel AT90USB646

Messaggioda Foto UtenteTardoFreak » 16 feb 2012, 18:33

Per testare un pin d' ingresso, per esempio il bit 4 della porta B si scrive in questo modo:
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 :mrgreen: per usare gli I/O. Era un file mostruosamente grande -:- ma l' ho ridotto a questo. :mrgreen:
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.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti