Page 1 of 1

switch hard disk atmega

PostPosted: 20 Mar 2013, 08:41
by adriano
Buongiorno ,
…..dopo una nottata passata a mettere in pratica una mia vecchia idea . Il commutatore per hd . Oltre l’HD estraibile ho altri due / tre HD che uso per salvare dati , Hd con dati personali che non voglio tenere accesi quando navigo in internet … quindi io che fino a ieri sera non avevo mai collegato un pulsante al atmega , parto in quarta e stamattina funziona quasi tutto .
Parto dal idea che i nuovi alimentatori ATX hanno sul filo viola un 5 Vcc permanenti , anche quando il pc e spento ( ma con alimentatore il st-by ) . Quindi l’idea era quella di controllare tre rele con un atmega tramite tre pulsanti . Quindi a macchina ancora spenta premo a piacere i tre pulsanti ( la scheda e alimentata grazie ai 5 vcc presenti in st-by ) e seleziono quali HD devono accendersi quando avvio la macchina .
Quindi premo una volta ed abilito il primo rele , se premo un'altra volta il medesimo pulsante si spegne …e cosi via per i tre canali. In questo modo scelgo quale HD voglio accendere .
Lo trovo molto interessante per poter scegliere per esempio anche se si vuole avviare con un linux o altri SO .
Come potete vedere la scheda ha anche un lcd che in un secondo tempo visualizzerà anche le temperature interne ( ingressi adc ) Un'altra cosa che mi piacerebbe farli fare sarebbe quella di tenere le ventole accese per altri 10 minuti dopo lo spegnimento della macchina ( con questa cosa sono fissato , penso sia causa del “rinsechimento “ della pasta tra processore e dissipatore. Non mi piace il fatto che si spenga la ventola con il dissipatore ancora caldo che continua a dissipare calore dopo che la ventola si e spenta ! ( anche se il pc da laboratorio lo tengo sempre aperto su un fianco ) . Un 5 V o un 12 extra serve sempre e poi cosi si tiene sempre d’occhio la polvere sul dissipatore .
Comunque , ritornano a noi … per aver iniziato “da autodidatta “ con i micro un mese fa , sono contentissimo delle cose che riesco a fare per il momento . Lo so , per voi che insegnate , che lavorate con i micro da anni o che fatte l’università vi sembrerà una cavolata , ma questo piccolo progetto mi sta dando delle soddisfazioni enormi .
Forse perché la trovo una cosa molto utile ( vorrei un vostro parere sincero ) .
Sono sicuro che per il codice si può fare di meglio , io al momento sono riuscito a fare questo e funziona abbastanza bene , tranne che ogni tanto l’antirimbalzo fa girare le balle. Per la verità non ho usato la procedura antirimbalzo , ho messo un semplice ritardo , quindi non mi aspettavo che funzionasse benissimo alla prima. Per me è già tanto essere riuscito a scrivere 12 righe di codice che fanno più o meno quello che volevo. Si capisce che in questa fase gli aiuti sono molto preziosi perché se si riescono a capire alcuni “ meccanismi” forse il cervello si sblocca . Chi mi da una mano per favore con un esempio di antirimbalzo nel codice che ho scritto ??? Io ho fatto riferimento al 3d sul antirimbalzo che avevo postato , ma sinceramente non so come integrare la funzione nel mio codice.
Grazie ….
Ora mi faccio il caffe e mi riprendo il discorso del antirimbalzo che fin ora non mi e tanto chiaro. Aspetto con ansia vostre news .
Adriano.
allegato mio codice ...


Code: Select all
$regfile = "m48def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 32
$framesize = 32
$baud = 9600
'$sim
Config Portd.3 = Output
    Config Portd.4 = Output
        Config Portd.5 = Output
Config Portd.0 = Input
      Config Portd.1 = Input
             Config Portd.2 = Input
P1 Alias Pind.0
      P2 Alias Pind.1
            P3 Alias Pind.2

   Portd.3 = 1
   Portd.4 = 1
   Portd.5 = 1


  Do


   If P1 = 0 Then                                           'pulsante 1 premuto
    Waitms 800
   Portd.3 = 0                                              ' rele 1 on
  End If                                                    'pulsante premuto seconda volta deve spegnere rele 1
      If P1 = 0 Then
  Waitms 800
 Portd.3 = 1
 Waitms 40                                                  ' rele 1 spento
End If




   If P2 = 0 Then
     Waitms 800
   Portd.4 = 0
End If
     If P2 = 0 Then
  Waitms 800
 Portd.4 = 1
    Waitms 40
End If



   If P3 = 0 Then
     Waitms 800
   Portd.5 = 0
   End If
    If P3 = 0 Then
  Waitms 800
 Portd.5 = 1
     Waitms 40

End If


Loop
End

Re: switch hard disk atmega

PostPosted: 21 Mar 2013, 23:34
by flipper
il lavoretto mi sembra interessante, ma il codice ha sicuramente bisogno di un ritocco.
dovresti strutturare in modo diverso il ciclo main introducendo delle sub e delle istruzioni più specializzate per eliminare i fastidiosi rimbalzi.
attivando in modo errato le alimentazioni rischi di danneggiare gli HD. "mia umile considerazione".
ciao

Re: switch hard disk atmega

PostPosted: 21 Mar 2013, 23:51
by adriano
flipper wrote:il lavoretto mi sembra interessante, ma il codice ha sicuramente bisogno di un ritocco.
dovresti strutturare in modo diverso il ciclo main introducendo delle sub e delle istruzioni più specializzate per eliminare i fastidiosi rimbalzi.
attivando in modo errato le alimentazioni rischi di danneggiare gli HD. "mia umile considerazione".
ciao



ciao flipper
grazie per la tua valutazione ,
una volta che ho stabilito ( prima di accendere il pc ) quale hd deve accendersi , il sistema e stabilissimo , lo testato . Il problema e che a volte premo uno dei tasti e non succede nulla , o succede che accende e spegne subito ( problema rimbalzo ) ...Che il codice andava rivisto ne avevo la certezza !!! Per me e stato un grande passo riuscire solo a vedere che +o- bene faceva quello che io volevo :) ..... Quindi , a prescindere che il codice e "minimal" gli HD non sono a rischio , una volta impostati si accendono e restano accesi .
Ora , si come sono ignorante in materia e mi baso solo su esempi di codice che trovo in rete , senza alcun supporto tecnico se non il vostro , io più di cosi al momento non riesco a fare . So che la procedura antirimbalzo non è un semplice ritardo , cercherò di approfondire e vedo cosa riesco a combinare.

Re: switch hard disk atmega

PostPosted: 22 Mar 2013, 10:33
by deluca
@adriano,
se vuoi sfruttare al max il Bascom, il codice che hai scritto necessita di modifiche, diciamo di una riscrittura totale. :)
Per prima cosa usiamo il comando "Debounce" che già fa grandi cose e ti libera dalla gestione personalizzata dell'effetto.
Inoltre introduciamo il "Toggle bit" per cambiare lo stato di un bit ogni volta che lo statament viene eseguito.

Ecco il tuo semplice codice modificato e perfettamente funzionante:
Code: Select all
'*******************************************************************************
'
'               HardDisk Power Controller, su idea di Adriano
' Versione liberamente modificata e corretta da Giovanni De Luca
' Data: 22-03-2013
'
'*******************************************************************************
$regfile = "m48def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 32
$framesize = 32

Config Debounce = 30

 Ddrd = &B_0011_1000                                        'configurazione porta D
Portd = &B_1100_0111                                        'pull-up porta D
'-------------------------------[ Alias pulsanti e relè ]------------------------
P1 Alias Pind.0
P2 Alias Pind.1
P3 Alias Pind.2
R1 Alias Portd.3
R2 Alias Portd.4
R3 Alias Portd.5
'-------------------------------[ Main ]----------------------------------------
Do
 Debounce P1 , 0 , Pr1 , Sub
 Debounce P2 , 0 , Pr2 , Sub
 Debounce P3 , 0 , Pr3 , Sub
Loop
'-------------------------------------------------------------------------------
End
'------------------------------[ Sub toggle bit ]-------------------------------
Pr1:
  Toggle R1
Return

Pr2:
  Toggle R2
Return

Pr3:
  Toggle R3
Return
'-------------------------------------------------------------------------------

Re: switch hard disk atmega

PostPosted: 23 Mar 2013, 14:09
by adriano
@deluca
Grazie deluca ,

è stata una BELISSIMA LEZIONE !!! Questo esempio mi e servito moltissimo , avevo visto le istruzioni che avrei dovuto usare ma non avevo idea di come inserirle . Mi e servito per capire la configurazione delle porte , il debounce e Sub .
Stanotte preso dal entusiasmo di vedere che tutto funziona perfettamente , ho modificato un po’ di cose : inserito tutto in un adattatore 5.25 a 3,5 , sostituito l’lcd con uno da 20x2 ( che copre perfettamente la finestrella del 3.5 ….ed ho aggiunto un po’ di codice per far funzionare il display .Stamattina alle 6 funzionava tutto !!!
Il prossimo passo quello di inibire la selezione HD una volta accesa la macchina ( onde evitare che qualche hd venga spento mentre il pc è acceso ) ( penso di farlo facendoli leggere a un pin del micro un livello alto proveniente dal alimentazione 5 vcc del pc , ma non ho ancora le idee chiare )
Per il discorso LCD … inizialmente lo avevo collegato sulla porta “c” con l’intenzione di lasciare liberi i segnali di progrm. Ma non ha funzionato …( chi sa perche ..) …Quindi decido di usare i pin porta B . Tutto funziona benissimo , non da fastidio alla programmazione . Un po’ di caratteri “strani” sul lcd mentre si programma e tutto funziona benissimo.
Io ho integrato la funzione lcd in questo modo , spero di aver fatto bene …. Ad ogni modo sono andato “ a naso” dopo aver visto nel simulatore di bascom come girava il programma.
Quindi mi e rimasta libera la porta del adc che magari diventa controllo temperatura .
Grazie per la bellissima lezione , posso dire che e la prima volta che apprezzo tantissimo e mi ha veramente aiutato moltissimo avendo costruito e provato a scrivere il codice.
Ps: appena visto il codice , ho detto : ecco come si scrive !!!
Un buon fine settimana a tutti.

Code: Select all
'*******************************************************************************
'
'               HardDisk Power Controller, su idea di Adriano
' Versione liberamente modificata e corretta da Giovanni De Luca
' Data: 23-03-2013
' Ver. 2.1
'*******************************************************************************
$regfile = "m48def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 32
$framesize = 32
'$sim
Config Debounce = 30
  Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.3 , Db6 = Portb.2 , Db7 = Portb.1 , E = Portb.5 , Rs = Portb.0

Config Lcd = 16 * 2
   
            Cls
        Locate 1 , 1
             Lcd "HD Power Controller"
         Locate 2 , 1
               Lcd "*******************"





 Ddrd = &B_0011_1000                                        'configurazione porta D
Portd = &B_1111_1111                                        'pull-up porta D
'-------------------------------[ Alias pulsanti e relè ]------------------------
P1 Alias Pind.0
P2 Alias Pind.1
P3 Alias Pind.2

R1 Alias Portd.3
R2 Alias Portd.4
R3 Alias Portd.5

M1 Alias Portd.3
M2 Alias Portd.4
M3 Alias Portd.5
'-------------------------------[ Main ]----------------------------------------
 Do

 Debounce P1 , 0 , Pr1 , Sub

 Debounce P2 , 0 , Pr2 , Sub

 Debounce P3 , 0 , Pr3 , Sub





Loop
'-------------------------------------------------------------------------------
End
'------------------------------[ Sub toggle bit ]-------------------------------
Pr1:
Cls
If M1 = 0 Then

Lcd "HD nr 2 OFF"
  Locate 2 , 1
 Lcd "SATA 2 - WINDOWS XP_sp3"
   End If
  If M1 = 1 Then
Lcd "HD nr 2 ON"
 Locate 2 , 1
 Lcd "SATA 2 - WINDOWS XP_sp3"
   End If
     Waitms 2500

  Toggle R1
 Cls
        Locate 1 , 1
             Lcd "HD Power Controller"
         Locate 2 , 1
               Lcd "*******************"

Return
Pr2:
   Cls
If M2 = 0 Then
 Locate 1 , 1
Lcd "HD nr 3 OFF"
   Locate 2 , 1
 Lcd "SATA 3 -   UBUNTU 12.10"
   End If
  If M2 = 1 Then
   Locate 1 , 1
Lcd "HD nr 3 ON"
     Locate 2 , 1
 Lcd "SATA 3 -   UBUNTU 12.10"
   End If
     Waitms 2500
  Toggle R2
 Cls
        Locate 1 , 1
             Lcd "HD Power Controller"
         Locate 2 , 1
               Lcd "*******************"

Return
Pr3:
    Cls
If M3 = 0 Then
Lcd "HD nr4 ARCHIVIO DATI OFF"
   Locate 2 , 1
 Lcd "* SYSTEM BACKUP HD *"
   End If
  If M3 = 1 Then
Lcd "HD nr4 ARCHIVIO DATI ON"
  Locate 2 , 1
 Lcd "* SYSTEM BACKUP HD *"
   End If
     Waitms 2500
  Toggle R3
 Cls
        Locate 1 , 1
             Lcd "HD Power Controller"
         Locate 2 , 1
               Lcd "*******************"

Return
'-------------------------------------------------------------------------------

Re: switch hard disk atmega

PostPosted: 24 Mar 2013, 09:25
by adriano
Buongiorno a tutti ,
dopo un altra nottata passata dietro il codice del HD power controller ( non mi sono mai divertito cosi tanto da tempo !!!) , sono riuscito a inibire la selezione dei HD una volta acceso il pc,onde evitare che qualche HD venga spento accidentalmente , (( un pin si porta al livello alto tramite alimentazione 5vcc da HD pc )) ed a visualizzare tre valori di tre ingressi adc sul display una volta che il pc e stato acceso .
Ora ... quando il pc viene spento , visto che il micro è alimentato dal 5vcc ( tensione permanente di stby ), come faccio a fare un reset totale del micro da codice ???? Si può fare ?
Ho provato a fare una SUB dove ho messo :

Azzera:
Pinc.6 = 0 “essendo il piedino di reset “
Return

viene fatto un reset ma il programma non riparte come quando accendo il micro .
Che cosa devo usare ? ( un piccolo relè che fa un reset verso massa sul pin 1 o si fa in maniera sw ? )
Grazie è buona domenica a tutti !!!