Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Logica AtmeL

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

1
voti

[31] Re: Logica AtmeL

Messaggioda Foto Utentesimo85 » 5 nov 2012, 22:54

Allora. Supponiamo che PORTA (8 bit) vale 0000 0000 = 0..

Analizza i due casi singolarmente.
Codice: Seleziona tutto
PORTA = (1 << 7);

Setta a 1 il bit #7. Il bit #0 è il LSB.. In questo caso PORTA vale 1000 0000

Mentre
Codice: Seleziona tutto
PORTA = (1 << 0);

Setta a 1 il bit #0. Quindi PORTA vale 0000 0001.

Ora, nel codice precedente (caso 2) PA7 vale 7 mentre PA0 vale 0.

L'istruzione con l'operatore | (OR)
Codice: Seleziona tutto
PORTA = (1 << PA7) | (1 << PA0);

Equivale nient'altro ad assegnare al PORTA il valore dell'espressione logica OR bit a bit tra 1000 0000 e 0000 0001.
Risultato 1000 0001 = 0x81.
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[32] Re: Logica AtmeL

Messaggioda Foto UtenteDirtyDeeds » 5 nov 2012, 22:55

It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

0
voti

[33] Re: Logica AtmeL

Messaggioda Foto Utentebelva87 » 5 nov 2012, 23:13

Niente, convengo che l'analisi 1 mi ha mangiato il cervello, domani ho l'esame e ormai questa roba non mi entra in testa, da domani riesamino l'ultimo post di Gohan che ringrazio come tutti gli altri anche se il tutorial linkato lo avevo già letto ma non ci ho capito un H.
Adesso ho bisogno di rilassarmi e smetto definitivamente per questa sera.
Avatar utente
Foto Utentebelva87
2.292 2 6 12
free expert
 
Messaggi: 1323
Iscritto il: 9 mag 2011, 15:01

0
voti

[34] Re: Logica AtmeL

Messaggioda Foto Utentebelva87 » 6 nov 2012, 23:10

Ordunque, a mente sgombra e dopo aver fatto due scritti di Analisi Matematica ho compreso la logica :D
Ieri ero un po' nervoso, con la testa piena di scritture incomprensibili :mrgreen: e altra robaccia varia.

Ho però un'altra domanda, anche se io non definisco PA0, o più in generale PXn, come ha fatto [user]Gohan[/user] nel suo esempio di codice al post 27 assegnando un valore preciso (ad esempio assegna a PA7 il valore 7) ... mi funziona lo stesso... :mrgreen:
Sto di nuovo sbagliando? oppure non ho capito un fico secco?? oppure è intrinseco nella scrittura PAn, con n da 0 a 7, che il compilatore "comprende" in automatico?? (appare infatti nel completamento automatico del testo)

Sto testando questo codice:
Codice: Seleziona tutto
#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/delay.h>

int main(void)
{
   MCUSR = (0 << WDRF); // mette a 0 il bit WDRF del registro MCUSR, disabilita il watchdog
   wdt_disable();  // a cosa serve? se non lo scrivo il WD è attivo
   DDRA = 0xff;    // imposto la porta A come uscita scrivendo tutti 1 dentro il registro DDRA
   _delay_ms(1000);   // aspetto per avere tempo dopo il reset
   PORTA = (1 << PINA0);  // scrivo 1 nel registro PORTA in posizione di PINA0, led rosso on
   _delay_ms(1000); //aspetto
   PORTA = (1 << PINA1) | (0 << PINA0); //accendo led rosso spengo led verde
    while(1)
    {
    }
}


In cui l'ultima operazione fatta su PORTA mi restituisce come valore 00000010 che è ottenuto dall'operazione di OR tra 00000010 e 00000000, se ho capito bene...

Se mi confermate ciò e sapete dirmi qualcosa a riguardo la storia del define ve ne sarei grato, che poi ho già in mente di fare il test dello stato di un bit di PORTA, e mi sa che ho anche in mente come farlo con questi nuovi metodi che sto scoprendo ;-)
Però ammetto che l'istruzione BTFSC o BTFSS mi mancano già.... :mrgreen:
Avatar utente
Foto Utentebelva87
2.292 2 6 12
free expert
 
Messaggi: 1323
Iscritto il: 9 mag 2011, 15:01

0
voti

[35] Re: Logica AtmeL

Messaggioda Foto Utentesimo85 » 6 nov 2012, 23:23

belva87 ha scritto:Ho però un'altra domanda, anche se io non definisco PA0, o più in generale PXn, come ha fatto simo85 nel suo esempio di codice al post 27 assegnando un valore preciso (ad esempio assegna a PA7 il valore 7) ... mi funziona lo stesso... :mrgreen:
Sto di nuovo sbagliando? oppure non ho capito un fico secco?? oppure è intrinseco nella scrittura PAn, con n da 0 a 7, che il compilatore "comprende" in automatico?? (appare infatti nel completamento automatico del testo)


Quel codice non funziona se PINA0 e PINA1 non sono definiti in qualche header. Partiamo da avr.io, di cui riporto uno pezzettino del file, giusto quello che ci interessa per il micro che stai usando..
Codice: Seleziona tutto
cat /usr/lib/avr/include/avr/io.h | grep AT90USB646
...
#elif defined (__AVR_AT90USB646__)
#  include <avr/iousb646.h>
...

Successivamente:
Codice: Seleziona tutto
cat /usr/lib/avr/include/avr/iousb646.h
...
#ifndef _AVR_AT90USB646_H_
#define _AVR_AT90USB646_H_ 1

#include <avr/iousbxx6_7.h>
...

Ed ancora:
Codice: Seleziona tutto
cat /usr/lib/avr/include/avr/iousbxx6_7.h | grep PIN
#define PINA    _SFR_IO8(0X00)
#define PINA7   7
#define PINA6   6
#define PINA5   5
#define PINA4   4
#define PINA3   3
#define PINA2   2
#define PINA1   1
#define PINA0   0
#define PINB    _SFR_IO8(0X03)
#define PINB7   7
#define PINB6   6
#define PINB5   5
#define PINB4   4
#define PINB3   3
#define PINB2   2
#define PINB1   1
#define PINB0   0
#define PINC    _SFR_IO8(0x06)
#define PINC7   7
#define PINC6   6
#define PINC5   5
#define PINC4   4
#define PINC3   3
#define PINC2   2
#define PINC1   1
#define PINC0   0
#define PIND    _SFR_IO8(0x09)
#define PIND7   7
#define PIND6   6
#define PIND5   5
#define PIND4   4
#define PIND3   3
#define PIND2   2
#define PIND1   1
#define PIND0   0
#define PINE    _SFR_IO8(0x0C)
#define PINE7   7
#define PINE6   6
#define PINE5   5
#define PINE4   4
#define PINE3   3
#define PINE2   2
#define PINE1   1
#define PINE0   0
#define PINF    _SFR_IO8(0x0F)
#define PINF7   7
#define PINF6   6
#define PINF5   5
#define PINF4   4
#define PINF3   3
#define PINF2   2
#define PINF1   1
#define PINF0   0
#define UPINRQX _SFR_MEM8(0xA5)
#define UPINTX  _SFR_MEM8(0xA6)
#define EPINT6  6
#define EPINT5  5
#define EPINT4  4
#define EPINT3  3
#define EPINT2  2
#define EPINT1  1
#define EPINT0  0
#define UPINT   _SFR_MEM8(0XF8)
#define PINT6   6
#define PINT5   5
#define PINT4   4
#define PINT3   3
#define PINT2   2
#define PINT1   1
#define PINT0   0

Ti è andata di cxxo.. O io non ho capito la tua domanda? :mrgreen:
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[36] Re: Logica AtmeL

Messaggioda Foto Utentebelva87 » 6 nov 2012, 23:31

Ecco, bene... basta saperle le cose no? :mrgreen:
Grazie, adesso ho capito perché funziona ... l'associazione al valore 7 (o quello che sia a seconda di cosa di scrive) è stata fatta dai signori della AtmeL quando hanno scritto la libreria di IO...
Per adesso mi definisco ancora prima dell'entry level perciò quella libreria me la tengo stretta e vado avanti così.
Però ne terrò conto in futuro e magari me le leggo così ho una visione più in dettaglio.
Per la logica ci sono?
Avatar utente
Foto Utentebelva87
2.292 2 6 12
free expert
 
Messaggi: 1323
Iscritto il: 9 mag 2011, 15:01

0
voti

[37] Re: Logica AtmeL

Messaggioda Foto Utentesimo85 » 6 nov 2012, 23:33

Scusa Foto Utentebelva87, forse sono io che al momento ho fatto un po' di confusione.

Se vuoi usare PA0 o PAx, quello che devi fare è

Codice: Seleziona tutto
...
#define PA0 PINA0
#define PA1 PINA1
#define PA2 PINA2
#define PA3 PINA3
#define PA4 PINA4
#define PA5 PINA5
...


oppure
Codice: Seleziona tutto
...
#define PA0 0
#define PA1 1
#define PA2 2
#define PA3 3
#define PA4 4
#define PA5 5
...


Gli header ed i sorgenti vanno letti con attenzione.. -:-

RTFH, RTFSC, RTFM

:mrgreen: :mrgreen: :mrgreen:
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[38] Re: Logica AtmeL

Messaggioda Foto Utentebelva87 » 6 nov 2012, 23:41

Mmmm, io non l'ho fatto nel codice che ho scritto... e funziona... :roll:
Comunque, tralasciando questa cosa della libreria ora (me la studio con calma poi) per adesso voglio prendere dimestichezza con le porte con programmi "inutili".
Come logica ho capito come funziona? Oppure mi sta funzionando tutto a cxxo??
Avatar utente
Foto Utentebelva87
2.292 2 6 12
free expert
 
Messaggi: 1323
Iscritto il: 9 mag 2011, 15:01

0
voti

[39] Re: Logica AtmeL

Messaggioda Foto Utentesimo85 » 7 nov 2012, 0:02

belva87 ha scritto:io non l'ho fatto nel codice che ho scritto... e funziona...

Il perché funziona l'ho spiegato nel post 37.

Anche così funziona:
Codice: Seleziona tutto
#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/delay.h>

#define PA0 0
#define PA1 1

int main(void)
{
   MCUSR = (0 << WDRF); // mette a 0 il bit WDRF del registro MCUSR, disabilita il watchdog
    wdt_disable();  // a cosa serve? se non lo scrivo il WD è attivo
   DDRA = 0xff;    // imposto la porta A come uscita scrivendo tutti 1 dentro il registro DDRA
   _delay_ms(1000);   // aspetto per avere tempo dopo il reset
    PORTA = (1 << PA0);  // scrivo 1 nel registro PORTA in posizione di PINA0, led rosso on
   _delay_ms(1000); //aspetto
   PORTA = (1 << PA1) | (0 << PA0); //accendo led rosso spengo led verde
   
   while(1)
      ;

   return 0;
}


Però hai capito il perché? :mrgreen:
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[40] Re: Logica AtmeL

Messaggioda Foto Utentebelva87 » 7 nov 2012, 0:09

Non ne sono certo, l'ho spiegato in precedenza chiedendo conferma ma... non ho avuto risposta :D
Avatar utente
Foto Utentebelva87
2.292 2 6 12
free expert
 
Messaggi: 1323
Iscritto il: 9 mag 2011, 15:01

PrecedenteProssimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 13 ospiti