Logica AtmeL
Moderatore:
Paolino
0
voti
[52] Re: Logica AtmeL
- 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.
0
voti
[53] Re: Logica AtmeL
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.
"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
0
voti
[54] Re: Logica AtmeL
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!
Però oggi è stata una vera giornata di m.... finita ancora più di M... e quindi vado a dormire ora, e il micro anche...
Appena posso torno a rompervi le scatole con questa storia, perché mi sono ficcato in testa di apprendere questi maledetti micro!
Però oggi è stata una vera giornata di m.... finita ancora più di M... e quindi vado a dormire ora, e il micro anche...
0
voti
[55] Re: Logica AtmeL
Sono open source i tuoi script?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.
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.
1
voti
[56] Re: Logica AtmeL
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.
0
voti
[57] Re: Logica AtmeL
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.
Sapete indicami perché la cosa non funziona? Viene però compilata senza errori.
Grazie a tutti, Luca.
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.
2
voti
[58] Re: Logica AtmeL
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:
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 assembler generato:
non metti a zero il bit WDRF ma metti a zero tutti i bit di MCUSR, il codice corretto è questo:
codice assembler generato:
Senza le basi e la capacità di maneggiare la logica booleana è inutile a mettersi a programmare in modo corretto un microcontrollore.
- 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.
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 8 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)



