Corso sui microprocessori e microcontrollori., Ovvero come i componenti elettronici possono fare miracoli.

« Older   Newer »
  Share  
view post Posted on 30/11/2010, 13:12
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Certamente Law, io , se hai visto il listato, ho cercato di essere ordinato, e ho commentato i vari passaggi.


CITAZIONE
Le tabelle di corrispondenza te le devi fare per forza se vuoi un numero ascii e non un numero binario dalla tastiera.

Non ho capito bene: io ho acceso solo dei led, perche' e' una demo. In futuro, mettero' i caratteri corrispondenti giusti: tasto 3 sulla scheda?

movlw 3
call "stampa lcd"

....e cosi' via

il tempo, tramite simulazione, nella peggiore delle ipotesi, cioe' simulando un tasto che e' all'ultima routine, si attesta con quarzo 4 Mhz a 60us...quindi direi buono.
Poi ripeto, questa routine a polling, va bene SOLO per menu' iniziali, cioe' dove il micro aspetta fin che vuoi i dati che immetti, per esemipio una minicalcolatrice.
In questo caso, puo' stare li a vita.
Se io volessi gestire in maniera interattiva col micro mentre sta lavorando e NON usa risorse hardware (che vanno per i fatti loro), non andrebbe piu' bene, o perlomeno s'interromperebbe il flusso
del programma principale...e dovrei rifare ad interrupt. Giusto?

 
Top
view post Posted on 30/11/2010, 15:21
Avatar

Immane Rompiball

Group:
Administrator
Posts:
18,287
Location:
Orlo esterno della cintura di Orione stella 1957

Status:


CITAZIONE
Se io volessi gestire in maniera interattiva col micro mentre sta lavorando e NON usa risorse hardware (che vanno per i fatti loro), non andrebbe piu' bene, o perlomeno s'interromperebbe il flusso
del programma principale...e dovrei rifare ad interrupt. Giusto?

Non proprio, ogni programma che si rispetti è strutturato così:

Accenzione:

{Impostazioni dell'hardware e di quant'altro}
{Cose da fare solo dopo la prima accenzione}


INIZIO:
{tutto quello che c'è da fare}
JUMP INIZIO

Forse con i soliti JUMP di quà CALL di là RETURN e quant'altro può sembrare che si possa fare un loop infinito dove perdersi, ed in effetti i programmatori in erba ci si perdono. Per non perdersi o entrare in casini da cui non si esce il programma deve seguire sempre quella forma semplice. Pare demenziale ma tutti ci si incasinano. Qualsiasi linguaggio tu usi, dall'assembler al C al BASIC il programma deve avere quella forma. Nelle cose da fare ci può essere cosa ti pare ma nella forma:

{
ON x=5
CALL A
ON y=0
CALL B
ON z=0FFh
CALL C

CALL D
CALL E
}

A:
{Cosa ti pare}
RET
B:
{Cosa ti pare}
RET
D: ...

E così via. Il risultato delle routine può stare dentro l'accumulatore o dentro lo stack o in un indirizzo di memoria dedicato a tutti i risultati o nell FLAG di status o che so io.
Strutturando un programma in questo modo ti sarà più semplice fare cose complicate. ;)
 
Web  Top
view post Posted on 1/12/2010, 07:34
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


CITAZIONE
Forse con i soliti JUMP di quà CALL di là RETURN e quant'altro può sembrare che si possa fare un loop infinito dove perdersi, ed in effetti i programmatori in erba ci si perdono. Per non perdersi o entrare in casini da cui non si esce il programma deve seguire sempre quella forma semplice. Pare demenziale ma tutti ci si incasinano.

Niente di piu' vero!!!! Se inizi a fare salti, e' facile incasinarsi, soprattutto con le CALL, che ritornano alla riga successiva che memorizza lo stack, i goto, sono meno ostici, anche se a volte le call, sono molto piu' comode.
Io, non so se e' una prassi corretta, ma tendo a mettere le routines da richiamare (se possibile) alla fine del programma, tutte assieme, in modo tale che so che sono tutte li, in caso di modifiche e altro.
Trovo molto scomodo metterle un po' qui e un po' la, come trovo piu' comodo dichiarare tutte le variabili (anche qui, sempre se e' possibile) all'inizio del programma.
 
Top
view post Posted on 1/12/2010, 09:24
Avatar

Immane Rompiball

Group:
Administrator
Posts:
18,287
Location:
Orlo esterno della cintura di Orione stella 1957

Status:


Giusto Gila. Proprio così. Solo che le "CALL" sono meno ingarbuglianti dei JUMP. Quando fai un JUMP rischi sempre di perderti a meno che tu non stia facendo una serie di JUMP condizionati verso qualche posto comune per tutti. Le CALL non sono ostiche, mica devi curarti tu dello stack già ci pensa il processore. Andare a incasinare lo stack con push e pop è una pratica di coloro che vengono da processori stitici o dal FORTH dove tutto si pigia nello stack per poi ritirarlo fuori. A me quella pratica non piace. Preferisco avere delle variabili locali dinamiche ed usare quelle. Certi processori tipo quelli derivanti dalla serie 65xx non hanno istruzioni adeguate e quindi è d'obbligo usare lo stack che se non si sta attenti si corrompe e buonanotte.
Le variabili globali vanno benissimo all'inizio del programma, quelle locali stanno bene all'interno delle varie routine. Il "C" è gia strutturato per gestire le cose in questo modo, quindi è un linguaggio molto efficiente. Ma l'assembler lo è di più, anche se una differenza di non poco conto è che il "C" ha una sua libreria matematica e di gestione delle stringhe oltre che altre funzioni. Però, per usare il "C" devi avere un file di interfaccia verso la tua macchina fatto molto bene, altrimenti rischi che il programma sia efficente ma l'interfaccia no così si impalla tutto.
:)
 
Web  Top
Elemento 38
view post Posted on 11/3/2011, 19:11




Interessante PDF sull'assembly dei PIC18.
http://www.wadsworthmedia.com/marketing/sa...839673_ch02.pdf
 
Top
fraggo
view post Posted on 4/10/2011, 19:39




Buonasera!
Dalla Tag porto qui la mia richiesta.

Io avrei bisogno di un piccolo circuito che emetta dei BIP a varie frequenze e in tempi parecchio dilatati.
Deve consumare pochissimo ed essere il più piccolo possibile.

START:
beep 1000Hz di 500 millisec.
beep 2000Hz di 500 millisec.
beep 3000Hz di 500 millisec.
pausa 30 minuti
beep 1000Hz di 500 millisec.
beep 2000Hz di 500 millisec.
beep 3000Hz di 500 millisec.
pausa 15 minuti
beep 1000Hz di 500 millisec.
beep 2000Hz di 500 millisec.
beep 3000Hz di 500 millisec.
pausa 40 minuti
beep 1000Hz di 500 millisec.
beep 2000Hz di 500 millisec.
beep 3000Hz di 500 millisec.
pausa 10 minuti
GOTO START

Per risolvere il problema avevo pensato di usare un PIC, purtroppo avendo uno stac di soli 8 byte posso annidare solo 8 cicli per fare perdere tempo al processore.
Qiondi la vedo dura raggiungere la mezz'ora di pausa.
Il linguaggio che conosco un pochino è l'assebly, il pic che ho ora per le mani 16F876A è già troppo potente per il mio scopo e penso di prenderne uno più piccino.
Come buzzer voglio impiegare quelli piezoelettrici che si trovano sulle schede madri.

Esiste la possibilità di avere qualche orologio/timer interno al pic o devo ridurre il clock magari generandolo con un'R/C? (la precisione non è necessaria).

EDIT:
Mi sa che mi rispondo da solo, il mio libro non trattava i prescaler... :blink: quindi un bel timer rallentato dovrebbe farcela.
Comunque altre idee sono ben venute :woot:
 
Top
view post Posted on 4/10/2011, 20:39
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Attivi il pwm alla frequenza che vuoi....superpausa software che inluppa il programma (tanto il pwm è una risorsa hardware e se ne va per ifatti suoi)
esci dal ritardo software e reimposti il pwm...segue ritardo software...e così via, no?

Stack profondo 8 livelli? Si,ma che c'entra, non devi fare cicli nidificati gli 8 livelli sono se fai tante call nidificate, ma non credo sia questo il caso.

Oppure senza scomodore un microcontrollore con degli 555 uno come oscillatore, la'ltro che scandisce le pause...adesso non ricordo bene lo schema, ma non è molto complicato :)
 
Top
view post Posted on 5/10/2011, 08:02
Avatar

Immane Rompiball

Group:
Administrator
Posts:
18,287
Location:
Orlo esterno della cintura di Orione stella 1957

Status:


Forse fraggo voleva fare qualcosa di veramente contenuto e di low-power. I 555 sono facili da usare ma per fare quello che chiede Fraggo ne occorrono tre per i toni più altri tre per i ritardi più qualcosa per la sequenza. Un sono PIC può fare tutto.
I ritardi software sono sempre da evitare nella programmazione, sono sempre indicati come fonti di esempio nell'insegnamento dell'informatica ma non ha un gran senso usare questi espedienti se si ha a disposizione tutte le risorse dei moderni chips. ;)
 
Web  Top
view post Posted on 5/10/2011, 13:47
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


CITAZIONE
ritardi software sono sempre da evitare nella programmazione, sono sempre indicati come fonti di esempio nell'insegnamento dell'informatica ma non ha un gran senso usare questi espedienti se si ha a disposizione tutte le risorse dei moderni chips.

si, ma infatti ho specificato...se deve fare solo quello il micro. Ma è solo una mia idea il pwm ,magari Fraggo ha altre esigenze
 
Top
fraggo
view post Posted on 11/10/2011, 18:46




Ciao a tutti
Ho una domandina. 16F876A
Se vado a leggere sulla porta B settata a 1 nel TRISB (ingresso) con le resistenze di pull'up abilitate (settando a 0 il settimo bit dell'option reg)
(se non ho applicato nulla sui piedini di ingresso) dovrei aspettarmi un valore 0xFF?

Perche ho fatto un piccolo ciclo che legge il valore dei piedini sulla portaB e lo trasla in uscite sulla porta C accendendo dei LED.
E' di una semplicità disarmante ma non funge...

Domani appena accendo il PC del lavoro posto il codice.

Avete qualche dritta? (ho misurato la tensione sui piedini di PORTB ed è circa 5v).
 
Top
view post Posted on 11/10/2011, 19:34
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Ma scusa Fraggo, tu hai settato TRISB tutto a ingressi giusto? Quindi:
MOVLW B'11111111'
MOVWF TRISB

giusto?
Poi hai abilitato i pull-up interni? di portb ? Quindi hai tutti i pin forzati al 5 volt di alimentazione no?
Tu cosa vorresti fare?
Leggi i pin di portb e metti su portc?
Non ho capito
 
Top
fraggo
view post Posted on 11/10/2011, 19:49




Si voglio leggere da PORTB e replicare immediatamente su PORTC

Ma sai che forse mi hai dato la soluzione! ;)
Vuoi vedere che prima ho impostato le resistenze di pull up e poi ho messo la PORTB in ingreso!

Grazie Gila domani controllo!

Edit:

Dopo svariati controlli a quanto pare il PIC e guasto :(

RI EDIT!!!

Il PIC NON era guasto e il codice era corretto
Il problema l'ho trovato nei configurations BIT

ho impostato __config 0x2D41

E tutto ha funzionato a meraviglia.
Scusate il disturbo



Edited by fraggo - 12/10/2011, 13:47
 
Top
view post Posted on 15/10/2012, 17:58
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Mi sono imbattuto nel bubble sort studiando il C, e me lo sono voluto riscrivere in assembler, per eventuali lavori coi pic.
Al solito, chi fosse interessato.... :)

I commenti sono all'interno del file

Download attachment
bubble_assembly.txt ( Number of downloads: 77 )

 
Top
1377 replies since 8/11/2008, 23:34   22611 views
  Share