Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Logica AtmeL

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[51] Re: Logica AtmeL

Messaggioda Foto Utentebelva87 » 7 nov 2012, 21:07

Ho portato esternamente a 1 il *terzo* pin di PORTA perciò credo che valga 0000 00110, e il risultato dell'AND lo assegno alla variabile inventata da me, non a PORTA... sbaglio?
Avatar utente
Foto Utentebelva87
2.292 2 6 12
free expert
 
Messaggi: 1323
Iscritto il: 9 mag 2011, 15:01

0
voti

[52] Re: Logica AtmeL

Messaggioda Foto Utentesimo85 » 7 nov 2012, 21:12

Codice: Seleziona tutto
PORTA = (1 << PINA0);

PORTA = 0x01.
Codice: Seleziona tutto
PORTA = (1 << PINA1) | (0 << PINA0);

PORTA = 0x02;
Codice: Seleziona tutto
stato_PA2 = ( PORTA & 0b00000100 );

stato_PA2 = 0x00. Perché 0x02 & 0x04 = 0x00.

PS: le variabili si dichiarano a inizio funzione. Non a metà o giù di li.
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[53] Re: Logica AtmeL

Messaggioda Foto UtenteTardoFreak » 7 nov 2012, 23:28

gohan ha scritto:le variabili si dichiarano a inizio funzione. Non a metà o giù di li.


PPS:
Per essere precisi si dichiarano all' inizio di un blocco.
Che poi il blocco sia una funzione o un qualcosa racchiuso fra parentesi graffe è del tutto indifferente.
"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

0
voti

[54] Re: Logica AtmeL

Messaggioda Foto Utentebelva87 » 8 nov 2012, 0:39

Scusate se vi ho abbandonato, ho avuto un problemone :?
Appena posso torno a rompervi le scatole con questa storia, perché mi sono ficcato in testa di apprendere questi maledetti micro! :mrgreen:
Però oggi è stata una vera giornata di m.... finita ancora più di M... e quindi vado a dormire ora, e il micro anche...
Avatar utente
Foto Utentebelva87
2.292 2 6 12
free expert
 
Messaggi: 1323
Iscritto il: 9 mag 2011, 15:01

0
voti

[55] Re: Logica AtmeL

Messaggioda Foto Utentebobina » 9 nov 2012, 20:08

xyz ha scritto: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.
Sono open source i tuoi script?

xyz ha scritto:ma non generano un codice ottimizzato.

Si infatti l'avevo scritto anch'io subito sotto il codice
bobina ha scritto:Sicuramente il codice prodotto non è ottimizzato perché il compilatore non usa le istruzioni per impostare i singoli bit ma riscrivere l'intera porta.

L'ho postato sperando di aiutare belva87 a capire meglio un concetto abbastanza semplice.
Avatar utente
Foto Utentebobina
212 6
Frequentatore
Frequentatore
 
Messaggi: 177
Iscritto il: 27 dic 2009, 14:22

1
voti

[56] Re: Logica AtmeL

Messaggioda Foto Utentexyz » 9 nov 2012, 20:58

bobina ha scritto:Sono open source i tuoi script?

Sono semplici script bash, nulla di nuovo o non documentato. Se vuoi questo è come viene configurata la compilazione del GCC per gli AVR:

Codice: Seleziona tutto
./configure --program-suffix=-4.7 \
       --prefix=/opt/avr/ \
       --build=x86_64-pc-linux-gnu \
       --host=x86_64-pc-linux-gnu \
       --target=avr \
       --enable-languages=c,c++ \
       --with-system-zlib \
       --disable-nls \
       --enable-shared \
       --enable-long-long \
       --without-included-gettext \
       --disable-checking \
       --disable-libssp \
       --with-dwarf2

Molti siti stranieri hanno pagine su come compilare il GCC per i vari microcontrollori, se guardi i sorgenti dei pacchetti Debian sui compilatori i passi per compilare i binari sono molto più articolati.
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

[57] Re: Logica AtmeL

Messaggioda Foto Utentebelva87 » 10 nov 2012, 12:48

Sto cercando i usare le porte come ingresso, e capire il loro stato.
Sto facendo girare questo codice con l'intento di far spegnere il led rosso quando porto a 0 il primo bit di della porta B, so che non è corretta la posizione in cui dichiaro la variabile ma per adesso mi interessa apprendere e capire e non più di tanto la perfezione formale nella stesura del 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(); 
   
   DDRA = 0xFF;    // imposto tutta PORTA come uscita
   DDRB = 0x00;    // imposto tutta PORTB come ingresso
   PORTB = 0xFF;  // abilito le resistenze di pullup su PORTB
   _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); // accendo led rosso e il verde si spegne
   */
   
    PORTA = (1 << PINA1 | 1 << PINA0); // accende il led rosso e verde
   /* adesso PORTA = 0000 0011 - 0x03 */
   char x = 0; // dichiaro x di tipo char (1 byte) e gli assegno 0
   x = PINB; // x assume il valore di PINB, con le pullup se non metto esternamente
             // a zero i in legge 0xFF
   x = ( x & 0x01 ); // applico la maschera per isolare lo stato del primo pin di PORTB
                 // il risultato vale 0x01 solo se il bit non è portato a 0 esternamente
    while(1)
    {
   if ( x == 0x01 )    // se x = 0x01 vuol dire che il pin è a 1
      {
          PORTA = ( 1 << PINA1 | 1 << PINA0 ); // il led rosso  resta acceso, anche il verde
      }
   else
            PORTA = ( 0 << PINA1 | 1 << PINA0 ); // spengo il led rosso
   }
}   

Sapete indicami perché la cosa non funziona? Viene però compilata senza errori.
Grazie a tutti, Luca.
Avatar utente
Foto Utentebelva87
2.292 2 6 12
free expert
 
Messaggi: 1323
Iscritto il: 9 mag 2011, 15:01

2
voti

[58] Re: Logica AtmeL

Messaggioda Foto Utentexyz » 10 nov 2012, 13:34

Il compilatore non ti segnala errore quando dichiari una variabile non all'inizio di un blocco semplicemente perché molti compilatori C sono anche compilatori C++ e questo tipo di dichiarazione è lecita in C++. Il compilatore GCC è anche è un compilatore C++ e questa sintassi viene tollerata in un sorgente C. Se abiliti alcune opzioni come "-pedantic -Werror" viene segnalato:

Codice: Seleziona tutto
error: ISO C90 forbids mixed declarations and code

Per il resto il codice è sbagliato, continui ad assegnare TUTTI e sottolineo TUTTI i bit di una porta invece di pilotare solo i bit che ti servono. Anche i commenti sono sbagliati, ad esempio:

Codice: Seleziona tutto
MCUSR = (0 << WDRF); // mette a 0 il bit WDRF del registro MCUSR, disabilita il watchdog

codice assembler generato:

Codice: Seleziona tutto
   out 0x34,__zero_reg__

non metti a zero il bit WDRF ma metti a zero tutti i bit di MCUSR, il codice corretto è questo:

Codice: Seleziona tutto
MCUSR &= ~(1 << WDRF); // mette a 0 il bit WDRF del registro MCUSR, disabilita il watchdog

codice assembler generato:

Codice: Seleziona tutto
   in r24,0x34
   andi r24,lo8(-9)
   out 0x34,r24

Senza le basi e la capacità di maneggiare la logica booleana è inutile a mettersi a programmare in modo corretto un microcontrollore.
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

Precedente

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 8 ospiti