Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Logica AtmeL

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[41] Re: Logica AtmeL

Messaggioda Foto Utentesimo85 » 7 nov 2012, 0:23

Se non l'hai capito, a questo punto credo perché ti mancano conoscenze di C.
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[42] Re: Logica AtmeL

Messaggioda Foto Utentebelva87 » 7 nov 2012, 0:27

Mi sa che non hai letto bene :roll:
Io penso di aver capito, e di aver detto il perché.... sto solo chiedendo se ho capito bene o c'è dell'altro che da neofita mi sfugge e per "cxxo" fa girare bene il programma... se no ho capito e tutto funziona.
Grazie lo stesso comunque.
Avatar utente
Foto Utentebelva87
2.292 2 6 12
free expert
 
Messaggi: 1323
Iscritto il: 9 mag 2011, 15:01

0
voti

[43] Re: Logica AtmeL

Messaggioda Foto Utentesimo85 » 7 nov 2012, 0:36

belva87 ha scritto:Mi sa che non hai letto bene

Probabilmente.. :roll:
sto solo chiedendo se ho capito bene

Se hai capito la modifica del codice del messaggio [39], e se hai capito quanto spiegato in [37] come altrettanto quanto spiegato in [31], allora si..
e per "cxxo" fa girare bene il programma... se no ho capito e tutto funziona.

Riguardo a quello, io avevo capito che tu usavi PINA0 e PINA1 per "abitudine", senza sapere che fossero veramente dichiarate nell'header citato in 35.

Se ho capito male ti chiedo scusa.
Abbi pazienza, ma dopo tutto questo tran tran ed un DAC che mi sta facendo girare i -censored- meglio che mi fumo una sigarettina.. :mrgreen:
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

1
voti

[44] Re: Logica AtmeL

Messaggioda Foto Utentebelva87 » 7 nov 2012, 0:43

Ma di che ti scusi, sono cose che capitano e non sono un tipo "incaxxoso".
Va bene, fai come credi... anche se non ti conosco però ci tengo a dirti che puoi fare altro piuttosto che una sigaretta, fumare fa male...
O_/ e grazie ancora, se ho dei dubbi mi farò di nuovo vivo!
Avatar utente
Foto Utentebelva87
2.292 2 6 12
free expert
 
Messaggi: 1323
Iscritto il: 9 mag 2011, 15:01

0
voti

[45] Re: Logica AtmeL

Messaggioda Foto Utentesimo85 » 7 nov 2012, 0:47

belva87 ha scritto:anche se non ti conosco però ci tengo a dirti che puoi fare altro piuttosto che una sigaretta, fumare fa male...

Sto cercando di smettere, e la tua risposta è una motivazione in più per non fumare.. Grazie.
se ho dei dubbi mi farò di nuovo vivo!

Quando vuoi. :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

[46] Re: Logica AtmeL

Messaggioda Foto Utentebelva87 » 7 nov 2012, 1:01

Bravo, fai un ottimo investimento per te e per le persone che ti stanno attorno!
A dirla tutta ho già un nuovo "problema" ma data l'ora meglio che vado a dormire, siamo già a domani :mrgreen:
Grazie ancora e notte a tutti!
Avatar utente
Foto Utentebelva87
2.292 2 6 12
free expert
 
Messaggi: 1323
Iscritto il: 9 mag 2011, 15:01

0
voti

[47] Re: Logica AtmeL

Messaggioda Foto Utentebobina » 7 nov 2012, 18:49

xyz ha scritto:Sicuro ? Quale compilatori usi ? Con il GCC per AVR dal 4.0 al 4.7 genera i seguenti errori:

Scusate se vado OT, il gcc 4.7 lo usi su linux giusto? Se si quali buildscript hai usato per la compilazione oppure hai usato già i pacchetti di qualche distribuzione?

Grazie

Invece un messaggio in thread. Volendo si può usare il set del singolo bit anche con GCC AVR in questo modo:

Codice: Seleziona tutto
typedef unsigned char BYTE;

typedef union
{
    BYTE Val;
    struct
    {
        BYTE b0:1;
        BYTE b1:1;
        BYTE b2:1;
        BYTE b3:1;
        BYTE b4:1;
        BYTE b5:1;
        BYTE b6:1;
        BYTE b7:1;
    } bits;
} BYTE_VAL;

void main()
{
    BYTE_VAL a;

    a.Val = PORTB;

    a.bits.b0 = 1;
    a.bits.b2 = 1;

    PORTB = a.Val;
}

Sicuramente il codice prodotto non è ottimizzato perché il compilatore non usa le istruzioni per impostare i singoli bit ma riscrivere l'intera porta. Però può essere utile a capire, tenendo a mente anche tutti gli altri consigli degli altri utenti, come usare funzioni o macro per fare il cambio dei pin.
Il codice è estratto dagli include del compilatore Microchip.
Usare le operazioni logiche per cambiare il valore dei pin non è obbligatorio è solo un modo per scrivere codice comprensibile oltre che generare codice ottimizzato.
Avatar utente
Foto Utentebobina
212 6
Frequentatore
Frequentatore
 
Messaggi: 177
Iscritto il: 27 dic 2009, 14:22

1
voti

[48] Re: Logica AtmeL

Messaggioda Foto Utentexyz » 7 nov 2012, 19:42

bobina ha scritto:Scusate se vado OT, il gcc 4.7 lo usi su linux giusto? Se si quali buildscript hai usato per la compilazione oppure hai usato già i pacchetti di qualche distribuzione?

Si, uso Linux dal secolo scorso :-) La mia Distribuzione è una GNU/Debian Sid e ha i pacchetti per il compilatore e la libreria per gli AVR nel repository principale ma io i compilatori per i microcontrollori me gli compilo io con dei miei script, in questo modo ho sempre sotto controllo le patch applicate e posso utilizzare e testare l'ultimo compilatore appena esce.

Il tuo codice usa i bit fields, sono comodi per un codice più portabile ma non generano un codice ottimizzato. Questo è quello generato con il compilatore GCC per AVR 4.7 con i commenti il codice C:


Codice: Seleziona tutto
   // a.Val = PORTB;

   in r24,0x18

   // bits.b0 = 1

   ori r24,lo8(1<<0)

   // a.bits.b2 = 1

   ori r24,lo8(1<<2)

   // PORTB = a.Val

   out 0x18,r24


Il codice non è ottimizzato, con quel indirizzo della porta bastano due sole istruzioni in assembler
Avatar utente
Foto Utentexyz
6.864 2 4 6
G.Master EY
G.Master EY
 
Messaggi: 1778
Iscritto il: 5 dic 2009, 18:37
Località: Italy Turin

0
voti

[49] Re: Logica AtmeL

Messaggioda Foto Utentebelva87 » 7 nov 2012, 20:55

Salve a tutti, sto tentando di valutare lo stato di un bit per far poi accadere qualche evento, tipo accende un led per rimanere in tema :mrgreen: e non esagerare per le mie attuali competenze.
Ho compilato, senza errori, questo codice:
Codice: Seleziona tutto
int main(void)
{
   MCUSR = (0 << WDRF); // mette a 0 il bit WDRF del registro MCUSR, disabilita il watchdog
   wdt_disable();  // a cosa serve?
   DDRA = 0b11111011;    // imposto PINA2 come ingresso, tutti gli altri come uscita
   _delay_ms(1000);   // aspetto per avere tempo dopo il reset
   PORTA = (1 << PINA0);  // scrivo 1 nel registro PORTA in posizione di PINA0, led verde on
   _delay_ms(1000); //aspetto
   PORTA = (1 << PINA1) | (0 << PINA0); // accendo led verde e spengo led rosso
   _delay_ms(1000); //aspetto
   int stato_PA2 = 0; // definisco stato_PA2 e gli assegno 0
   stato_PA2 = ( PORTA & 0b00000100 ); //stato_PA2 diventa 0b100 se PINA2 (pin 3 di PORTA) vale 1
    while(1)
    {
      if ( stato_PA2 == 0b00000100 )  // vuol dire che PINA2 è a livello 1
       {
         PORTA = ( 1 << PINA0 ); // accendo il led verde se PINA2 è a 1
       }
    }
}   


L'intento è quello di agire con l'AND sullo stato dei bit di PORTA in maniera tale da isolare il singolo bit, infatti facendo l'istruzione AND tra due bit il risultato è 1 solo se tutti e due i bit sono a 1, ed è quello che mi interessa ottenere (il tutto serve per valutare quando un tasto viene premuto).
Ho fatto girare il programma ma il led verde non si accende mai... :roll:
Sto sbagliando qualcosa di macroscopico nel ragionamento?
Avatar utente
Foto Utentebelva87
2.292 2 6 12
free expert
 
Messaggi: 1323
Iscritto il: 9 mag 2011, 15:01

0
voti

[50] Re: Logica AtmeL

Messaggioda Foto Utentesimo85 » 7 nov 2012, 21:02

Prima della AND PORTA vale 0x02;
Dopo la AND stato_PA2 vale 0x00.
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

PrecedenteProssimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 9 ospiti