Tuesday, October 11, 2016

Coronax






+

Contrassegnati con 74HC595 Testare l'interfaccia SPI sul Raspberry Pi con 16 LED e un paio di registri a scorrimento. Il Raspberry Pi è stato progettato per il mercato educativo, ma una delle ragioni per cui la comunità hacker / produttore è diventato così collegato ad esso è il suo porto (General Purpose Input Output) GPIO - una serie di connessioni per l'interfacciamento con elettronica esterna. GPIO del Pi non è così ricco di funzionalità come il Arduino - ci sono meno pin, e nessun built-in ingressi analogici - ma ha un sacco di collegamenti di base, come un bus dedicato SPI, bus I²C, ed una esterna porta seriale. Dopo divertirsi con il mio Python gioco vita la scorsa settimana, ho voluto provare l'interfaccia di Python alla porta GPIO. Ho dovuto qualcosa di specifico in mente, ma mi è stato sventato dalla differenza più importante tra la Pi e Arduino - Tensione. Il Pi funziona a 3,3 V, mentre l'Arduino (beh, la maggior parte delle Arduino) utilizza 5 volt. Un gruppo di componenti che ho ottenuto possibile utilizzare sia la tensione, ma alcuni sono meticolosi in questo modo. Come sempre, verificare le schede prima di collegare le cose! Naturalmente, questo è uno di quei problemi con una soluzione integrata - acquistare più componenti! - Così una volta ho ottenuto quello che ho bisogno io tornare alla mia idea originale. Nel frattempo, ho lavorato attraverso le nozioni di base sull'uso del porto da Python. Questo sta ripetendo alcune delle cose fondamentali di cui ho parlato prima, solo con un Raspberry Pi al posto di un Arduino. Ho iniziato con un paio di librerie Python che dovevano essere costruiti e installati: RPi. GPIO (per uso generale IO come lampeggiante LED) e py-spidev (per l'hardware di supporto SPI). Ho avuto qualche problema nel far librerie costruiti, in parte a causa della versione spaccatura nella comunità Python. Python 3 non è completamente compatibile con le Python 2, e la comunità nel suo complesso è stato un po 'lento a migrare. Il risultato è che Raspbian sulla Pi include installazioni di entrambe le versioni 2 e 3. Per ciascuna di queste librerie, è necessario eseguire uno script Python che raccoglie le porzioni C ++ e li installa con una riga di comando come "sudo python setup. py install". PY-spidev non è riuscito a costruire in Python 3 a causa di alcuni errori di compilazione da GCC che non ho avuto il tempo di rintracciare. Entrambe le librerie non sono riusciti a costruire con Python 2 (il default su Raspbian) a causa di un file mancante Python. h. Si scopre che è perché solo il pacchetto di sviluppo di Python 3 ( "python3.2-dev") è stato installato. Dopo un rapido "sudo apt-get install python2.7-dev", ero in affari. Ho iniziato con la libreria RPi. GPIO, che è una libreria molto semplice per gestire i perni impiego generale sulla porta. Esso consente di impostarli come ingressi o uscite, accendere le resistenze pullup built-in, e ottenere o impostare i valori - tutte le cose di base si ha familiarità con se hai fatto un po 'di programmazione Arduino. C'è anche un po 'di cose carine come in attesa di un trigger bordo, o l'impostazione di una funzione di callback su un cambiamento di ingresso. Test GPIO Trivial. Un tasto, un LED. E un resistore, un condensatore, e un gruppo di fili. Ho creato un test di base con un pulsante utilizzato per attivare o disattivare lo stato di un LED. Ecco il codice per una semplice versione del programma: Noterete non c'è Antirimbalzo del pulsante. Ho giocato con alcuni modi di timer basati su software fare antirimbalzo, ma alla fine ho solo aggiunto un condensatore 10 uF al lato positivo del pulsante di prendersi cura del problema. In realtà, ero più ansioso di provare la libreria SPI. Per l'hardware, sono tornato a un vecchio: un paio di 74HC595 registri a scorrimento e un gruppo di LED. Ora, questo è tecnicamente truffa. L'interfaccia 595 del non è esattamente SPI - non c'è un chip esplicito abilitazione, per una cosa - ma se si collegano i due orologi di ingresso (spostamento di clock registro e lo stoccaggio di clock registro) insieme alla linea di clock SPI, è abbastanza vicino per un test banale. Mi sono imbattuto in un problema di configurazione di Linux ricevendo il codice py-spidev al lavoro. Come con la roba RPi. GPIO, è necessario eseguire lo script Python come root (o tramite sudo) in modo da poter accedere alla porta GPIO. Anche allora, mi ha colpito un errore che non ha fatto un sacco di senso per me: Nessun file o directory con questo nome? Nessun file o directory come cosa? Ho dovuto Google per la soluzione a questo enigma. Si scopre che py-spidev utilizza un modulo del kernel di Linux per accedere all'hardware SPI della CPU. E si scopre che il Raspbian, tale driver è sulla lista nera in modo che non sarà caricata di default. Suppongo che questo è probabilmente una cosa efficienza, dato che molti utenti non avranno bisogno del modulo SPI - è meglio risparmiare RAM e non caricarlo se non è necessario. Se si ha bisogno di esso, è come, "Gee, grazie. E 'stato utile. " Se ciò si verifica, la cosa che dovete fare è modificare il file "/etc/modprobe. d/raspi-blacklist. conf" e commentate (con un carattere '#') la voce "spi-bcm2708". Se hai intenzione di fare alcune cose I²C in seguito, si potrebbe desiderare di commentare il suo driver pure. Dopo aver rimosso quel modulo dalla lista nera, dovevo ancora caricarlo con "sudo modprobe - a spi-bcm2708". Fortunatamente, dopo il riavvio del Pi non ho dovuto rifare quel passo - il modulo è stato appena caricato automaticamente da allora. Credo che la mia aggiustamenti Linux ha ottenuto un po 'arrugginito, quindi è bene rispolverare. Non ho potuto trovare molto a titolo di esempio per l'utilizzo di py-spidev. Si utilizza il sistema di documentazione integrato di Python, ma anche lì la descrizione è piuttosto minimale. Per fortuna, non è estremamente complicato, ed è stato abbastanza facile a venire con un programma che appena passa tutti i LED on e off: liste Python sicuro fanno lo rendono facile da specificare un insieme di byte da inviare. Stavo usando due 74HC595s e 16 LED, così si potrebbe chiedere perché sto inviando tre byte di dati attraverso la porta SPI. Ha a che fare con il modo in cui gli orologi 595 di lavoro. Ho tutti gli orologi agganciati insieme, ma quando lo fai che i dati nel registro di memorizzazione (che controlla il pin di uscita) è un ciclo di clock dietro il registro a scorrimento (in cui sono memorizzati i nuovi dati). È necessario spuntare l'orologio ancora una volta per spostare i dati corretti al registro di memorizzazione. Per controllare 16 pin, è necessario inviare 17 bit di dati (anche se in realtà non importa se l'ultimo bit è 0 o 1). La maggior parte delle librerie SPI preferiscono inviare i dati in byte. Un modo semplice per conciliare questa è di spostare solo tutti i dati di un bit a sinistra, facendo spazio che bit di clock in più a destra, e l'aggiunta di un byte aggiuntivo all'inizio per memorizzare il riporto. E 'simile a questa: E con questo ho un po 'di Blinkenlights felici attaccato alla mia Raspberry Pi, lampeggianti in qualsiasi modello che voglio. A volte, si scrive un programma o di costruire un circuito perché in realtà vuole fare qualcosa di utile. O almeno qualcosa di divertente. Altre volte, si costruisce appositamente per provare una particolare tecnica o imparare come funziona qualcosa. Questa settimana, ho fatto più di queste ultime rispetto al precedente. Prendere il circuito su questo basetta (per favore!). Ho continuando a insegnare a me stesso come programmare Arduino, e ho cercato di imparare come lavorare un paio di componenti elettronici, e questo è il risultato. Non avrei mai definito con l'obiettivo di costruire questo, e anche se ho avuto, non avrei fatto in questo modo. Quindi, che cosa fa? Beh, lampeggia i 16 LED in un particolare modello. E quando si preme il pulsante, si gioca il primo paio di battute del tema principale di Star Wars. Il punto non è ciò che fa, ma come lo fa. Ad esempio, ci sono 16 LED, e li possono trasformare tutto e disattivare individualmente, in qualsiasi modello che voglio. Il mio Arduino non ha linee di uscita sufficiente per affrontare ogni LED singolarmente. Invece, sto usando un paio di 74HC595 registri a scorrimento per controllare la luce - sono seduti al centro della basetta nascosto da tutti i fili. La Arduino parla al primo registro utilizzando lo stesso tipo di SPI seriale ho usato un paio di settimane fa con il C64 e il chip ADC. Tale registro ha 8 linee individuali per controllare i LED, e inoltra i dati dal Arduino al 2 registro di scorrimento per controllare il restante 8. Il codice sul lato Arduino è molto semplice: C'è un buon tutorial sull'utilizzo di registri a scorrimento con Arduino qui. La cosa veramente interessante di registri di scorrimento è che è possibile collegare molti di loro in serie. E 'un modo semplice per aggiungere un sacco di linee di uscita individuali per un dispositivo come il Arduino. Ho voluto provare a giocare, perché immagino che ti sono utili lungo la strada se voglio comunicare con qualcosa che ha, per esempio, 16 linee di indirizzo che va in esso. La funzione di riproduzione di musica, d'altra parte, ha iniziato perché ero curioso di sapere come gli interrupt sul Arduino. Si può ricordare che ho usato gli interrupt di controllare i tempi per la mia esposizione C64 scrolling hack, e ho voluto fare la stessa cosa qui. Il metodo ciclo principale () nel mio schizzo Arduino solo gestito le luci, e il mio piano era quello di utilizzare un interrupt regolarmente si verificano per aggiornare una macchina a stati che avrebbe controllato la musica. Per il lettore musicale vera e propria, ho iniziato con uno degli esempi di kit di Inventor di SparkFun per Arduino. Purtroppo, che il codice non era proprio adatto a trasformarsi in una macchina a stati, così ho finito per riscrivere tutto tranne l'archiviazione per le note ed i valori di frequenza. Per il lettore musicale al lavoro, doveva essere basato su una funzione che sarebbe chiamato a intervalli regolari, e che sarebbe tornato abbastanza rapidamente, in modo temporizzazione note con un ciclo for o qualcosa non stava andando a lavorare. Con la macchina dello Stato, ogni volta che la funzione è stata chiamata sarebbe guardare al suo stato attuale e sia iniziare a giocare una nota, smettere di giocare una nota, o non fare nulla (se era nel bel mezzo di una nota più lungo o di riposo). Primo piano della basetta. I registri a scorrimento sono cerchiati in verde, e il timer 555 è cerchiata in rosso. Per la vera fonte di interrupt, ho avuto diverse scelte. Il chip Atmega nella Arduino ha 3 timer interni che possono essere utilizzati per generare interrupt a tempo. Questo sarebbe in realtà essere perfetto per il mio scopo, ma forse un po 'troppo comodo. E ricordate, essendo conveniente non era il punto - di apprendimento è stato il punto. La Arduino supporta anche due linee di ingresso per interrupt esterni, ed è quello che ho finito per usare. E 'analogo a quello che ho fatto con il C64, dove il chip VIC inviato un interrupt alla CPU 6510. La fonte reale degli allarmi è un chip 555 timer, che invia un impulso regolare per Arduino ad una frequenza di 31 Hz. Ho voluto utilizzare il timer 555 perché ho giocato con loro come io lavoro attraverso più degli esempi nella Marca: libro Electronics. Parlerò esattamente come funziona in una o due settimane; per ora è sufficiente sapere che funziona. Il risultato finale di tutto questo armeggiare era un circuito che, mentre il tipo di sciocco, era ancora divertente da giocare con. L'ho avuto seduto sulla mia scrivania per gli ultimi giorni, e io continuo a colpire il pulsante per un caso di Star Wars correzione. Ancora più importante, mi ha dato la possibilità di mettere in pratica tre funzioni distinte: Uso di un registro a scorrimento, che scrivono gestori di interrupt per Arduino, e la generazione di segnali con un chip di 555 timer. I miei piani sono ancora un po 'nebulosa, ma ho il sospetto che tutte queste cose stanno per essere utile qualche parte lungo la strada. Oh, e perché Star Wars? Dai, che tipo di domanda è questa? Inoltre, quelle note sono stabilmente incisi nella mia testa da imparare a suonare il tema su un registratore, quando ero in 4 ° grado. Coronax Coronax è uno sviluppatore di software professionale che sta usando questo blog come un cambio di passo dal suo lavoro di tutti i giorni. Va bene, la gente, fibbia e mettere sul vostro Mirrorshades. Questo è il mio ultimo Retrochallenge 2015 07 ingresso, ed è una cosa ancora più bizzarra: una tragedia di errori e un trionfo di tarda notte di hacking. O qualcosa. Nel nostro ultimo episodio emozionante, ho avuto cubi riempiti di poligoni e icosahedrons gira intorno di fronte a uno sfondo statico. sfondi statici sono noiosi. Così ho deciso di fare il rotolo di fondo. Ho pensato che sarebbe stato facile. Errore # 1: Dual Mode-Playfield usando ScrollVPort () La cosa difficile è che volevo scorrere lo sfondo (la luna, le stelle, e le piramidi), senza spostare il primo piano (i polyhedrals). Per comodità, l'Amiga ha una modalità grafica specificamente per questo genere di cosa chiamata "Dual-Playfield Mode". L'idea è quella di dividere i tuoi bitplanes tra due "campi di gioco", ognuno dei quali si possono scorrere indipendentemente in direzione X o Y. Questo è stato abbastanza facile da configurare. Ho dovuto spostare miei bitplanes un po ', in modo che le forme 3D sono stati disegnati in bitplanes 0 e 1, e lo sfondo in bitplane 0 di una struttura RasInfo separata. Da quando sono stato a scorrimento orizzontale, ho anche raddoppiato la larghezza delle bitmap da 320 a 640 pixel. Ho incollato immagine lo stesso sfondo in questo spazio espanso. Ho pensato che se ho arrotolato background 320 pixel a sinistra, sarebbe guardare proprio come l'immagine originale. Poi ho potuto impostare la pergamena a 0 e ricominciare da capo, per un falso scorrimento infinito. E 'stato facile, ma l'effetto era un po' goffo. Le piramidi più stretti spostato alla stessa velocità, come le piramidi all'orizzonte, e la luna e le stelle. Sicuramente non era l'effetto che cercavo. Inoltre, ScrollVPort () era un po 'lento, e non ho potuto risparmiare la velocità. Errore # 2: Rame interrupt E 'una buona cosa che dovevo questi a portata di mano. Un sacco di giochi Amiga presentano "parallax scrolling" dove gli oggetti più vicino al rotolo spettatore ad una velocità diversa rispetto agli oggetti sullo sfondo. Se tali oggetti sono separati verticalmente, possono essere rappresentati dalla stessa bitplane. L'idea è che il chip grafico emette l'immagine finale, una linea di scansione alla volta, è possibile entrare e modificare i valori di registro in mezzo per cambiare il modo le cose vengono disegnati. E 'molto simile a "correre il raggio" su un Atari 2600 o C64. Il rame dovrebbe fare questo genere di cose davvero semplice, ma ho avuto un dilemma. Il rame può impostare un valore in un registro in un momento preciso, ma nel mio caso il valore che avevo bisogno di scrivere cambierebbe ogni fotogramma. Non ho avuto modo di modificare l'elenco di rame facilmente perché stavo usando le funzioni graphics. library per creare l'elenco in modo dinamico e la mano fuori al sistema operativo utilizzando la funzione (anche piuttosto costoso) MrgCop (). Non volevano più. Lo prometto. Nella mia lettura, avevo scoperto che una delle cose che il rame potuto fare è stato generato un allarme, scrivendo al registro richiesta di interrupt. Ho pensato che avrei potuto avere il rame farlo, e poi il mio gestore di interrupt potuto impostare i registri con i corretti valori, che cambiano dinamicamente per creare un effetto di scorrimento uniforme. Sembrava una buona idea, e ho trascorso la maggior parte della notte di Sabato attuazione. Questo è stato difficile per diverse ragioni. Prima di tutto, il mio gestore di interrupt bisogno di essere scritta in linguaggio assembly 68000, che non ho usato da circa 1991. Per fortuna ho ancora alcuni vecchi libri sul tema, e il mio codice non hanno a che fare qualcosa di troppo sofisticato. Il bit importante in cui ho cambiato i registri era a pochi istruzioni: A livello registro hardware, lo scorrimento è diviso in due operazioni. È possibile spostare la posizione in cui pixel sono attratti da un massimo di 16 pixel, che vi dà il controllo fine. Per scorrere oltre, si modifica il registro che racconta l'hardware video che byte di dati da leggere successivo. E 'stato il momento che ha reso questo approccio un dolore. Finora ho lasciato la maggior parte del sistema operativo in esecuzione in background, e per questo c'era un po 'di ritardo tra quando ho chiesto l'interrupt e quando il mio gestore di interrupt stato chiamato - quasi un intero valore di linea di scansione del tempo, e non era coerente da un fotogramma all'altro. Questo è stato un problema, perché le mie esigenze temporali erano abbastanza stretti - ho dovuto impostare il nuovo indirizzo bitplane durante il tempo di cancellazione orizzontale tra una linea di scansione e l'altra. Dopo guai con diverse liste di rame e cicli di ritardo, ho avuto una soluzione che sembrava funzionare bene. Avevo diviso l'immagine di sfondo in tre zone. La parte superiore, con la luna e le stelle, era fermo. La parte centrale, con le piramidi all'orizzonte, scorrere al ritmo di un pixel per fotogramma. La parte inferiore, con le piramidi in primo piano, scorrere più veloce - due pixel per fotogramma. Non era male, ma non era perfetto. Di tanto in tanto, forse un fotogramma in 60, i tempi sarebbe un po 'fuori e non ci sarebbe stato un problema tecnico - uno dei gruppi di piramidi sarebbero disegnati nella posizione sbagliata. Ma era 04:00, e tutto sommato sembrava piuttosto buona. Finché io correvo in WinUAE ... Errore # 3: attendere l'ultimo minuto per testare su hardware reale Non ho avuto un sacco di tempo libero questo Retrochallenge, e per questo ho fatto un sacco di sviluppo, e tutta la mia cattura video, nell'emulatore WinUAE. WinUAE è molto buono, così ho pensato che se il mio codice ci lavora, dovrebbe lavorare sulla cosa reale. Le ultime parole famose. Il momento più triste retrocomputing è quando un pezzo di hardware amato comincia a mostrare la sua età. L'unico problema è che il mio Amiga c'è stock più. Ai tempi in cui stavo lavorando alla precedente iterazione di questo progetto, ho preso un acceleratore ACA500. che fornisce un 14 MHz 68000 CPU. Ho fatto il mio test su una configurazione di magazzino 7,14 MHz Amiga 500 emulato. Ho pensato per il test hardware reale, ho potuto tirare fuori il ACA500 e sostituirlo con il mio GVP A500 HD +. che fornisce un upgrade del disco rigido e RAM. Questo è stato ieri sera, quando il primo di una serie di catastrofi colpito. Il GVP ha ottenuto brillanti per molti anni, ma ieri sera non sarebbe l'avvio. A volte ha iniziato a eseguire lo script di avvio-sequenza, ma si sarebbe fermato dopo pochi secondi. Peggio ancora, il ronzio costante del motore ha iniziato a suonare ... traballante. Non è una buona traballante. Un cattivo traballante. Sicuramente non come questo doveva guardare. Alla fine, ho trovato un vecchio Workbench 2.0 floppy di boot, e ho pensato che sarebbe risolvere il mio problema - ma ho appena scambiato un problema per qualcos'altro. Sono stato in grado di eseguire il mio programma di test su un Amiga in esecuzione alla velocità di clock a destra, ma quella struttura tempi fragile che avevo messo insieme per la routine di scorrimento appena completamente crollato. E 'stato un disastro. Aggiungendo al danno la beffa, il televisore Toshiba stavo usando come monitor completamente avvitato i colori, trasformando il mio crepuscolo deserto sullo sfondo in una sgargiante miasma verde-marrone. Ho provato un paio di altri monitor, come si può vedere nel video, ma solo che uno aveva un problema. Io ancora non so perché. Soluzione: Tornando all'inizio Così è stato Lunedi sera, ed ero quasi fuori dal tempo, e niente funzionava. Così ho bevuto un po 'di Coca-Cola, mangiato del cioccolato, mettere su album live Cronache di Hawkwind. e avuto modo di lavorare. Ho pensato che le possibilità di fissare il mio tempismo interrupt-driven erano praticamente nulle, così sono tornato al punto di partenza e considerata la lista di rame. Se si ha un puntatore alla posizione di memoria effettivo che il rame stava leggendo da, ho pensato che si potrebbe colpire nuovi valori nella lista di istruzioni. Inoltre, il codice di auto-modifica è stato uno dei pochi trucchi non ho provato durante questo progetto. L'unico problema è che non ho avuto quella lista. Ero ancora in gran parte utilizzando graphics. library di Amiga al trattamento dei miei Visualizzazioni e Finestre. In questo paradigma, ho creato un frammento di un elenco di rame per i cambiamenti che ho voluto correre, e quindi chiamato MrgCop (). MrgCop () avrebbe preso tutte le liste di rame per tutti i Finestre visibili e unirli-ordinare in un elenco principale che attribuisce alla struttura View e ha detto al rame per eseguire ogni fotogramma. Così ho iniziato stampando quella lista di rame finale e vedere ciò che sembrava. Ecco come inizia: Beh, questo non sembra troppo male. La maggior parte di queste linee sono solo l'impostazione di un registro video (colonna di sinistra) per un particolare valore (colonna di destra). Non so che cosa la metà di quei nomi di registro dire, ma quelli che più mi ha interessato erano i registri di indirizzi Bitplane. Se dovessi creare la mia propria lista di rame, avrei bisogno di riempire quei valori con qualsiasi cosa i puntatori reale sarebbe per una particolare esecuzione del programma. Una volta ho avuto la mia lista, ho solo inceppato nella struttura Vista al posto di quello che graphics. library aveva creato per esso. Questo è un modo piuttosto sgraziato per andare su di esso, e sono sicuro che sto perdendo di nuovo la memoria, ma l'orologio è stato stringe. Per la mia routine di scorrimento, avrei bisogno di ripristinare tali registri durante gli intervalli tra hblank particolari linee di scansione. Così ho aggiunto in poche righe per farlo: Poi ho potuto solo scrivere una routine veloce che il mio ciclo principale del programma poteva chiamare ogni fotogramma per compilare nuovi valori per quelle linee della lista di rame: Ha funzionato? Sì! E ho avuto modo di dire, è il modo migliore di questo approccio ridicolo interrupt-driven ho sprecato il mio tempo su. Questa routine di scorrimento è rock-steady. Ho provato sul hardware reale ei risultati sembrava proprio come nell'emulatore. E 'stato un momento incredibilmente soddisfacente. Successo finalmente! Infine, ho incrociato le dita e provato il codice sul vero Amiga con il ACA500 allegato. La routine di scorrimento funzionava ancora! L'unica differenza era il frame rate, che è stata notevolmente migliorata con l'68000 14 MHz. Ed è lì che ho intenzione di lasciare le cose per Retrochallenge di questa estate. Sembra certo molto più imponente rispetto alla versione ho iniziato con. La performance è molto meglio di quanto non fosse, ma ancora non fino al tabacco da fiuto con quello che ci si vede nel demoscene dopo, diciamo, 1987. credo che la prossima volta che torno a questo progetto ci troveremmo di fronte a molto di più linguaggio assembly e la programmazione di metallo nudo. Quale dovrebbe essere divertente. Sarei stata messa fuori passando da wireframe di rendering a poligoni pieni perché ero preoccupato per quello che stava per accadere al mio framerate, ma ora che ho finalmente po 'il proiettile non è quasi come un grosso problema, come ho pensato che sarebbe stato . Questo è un altro vantaggio del Blitter di Amiga: si fa tutto il lavoro, e mi prendo tutto il merito. Da quanto ho capito, ecco cosa succede quando si utilizza le routine poligono pieno del graphics. library: Il programma chiama AreaMove () per iniziare il poligono e dare la posizione del primo vertice di coordinate dello schermo. Quindi chiama AreaDraw () per ogni vertice rimanente, e quindi AreaEnd () quando è fatto. Le coordinate dei vertici sono memorizzati in un buffer temporaneo chiamato AreaInfo attaccato RastPort dello schermo. Il blitter è utilizzato per disegnare il contorno del poligono in un buffer temporaneo chiamato TmpRas, anche collegato al RastPort dello schermo. Il rettangolo che contiene il poligono viene copiato in una o più bitplanes del buffer dello schermo utilizzando una modalità di riempimento speciale. Per ogni riga, il Blitter scansiona fino a raggiungere il contorno, e quindi scrive riempire bit fino a raggiungere il contorno sull'altro lato del poligono. (I bit di riempimento possono essere attivati ​​e disattivati ​​tempo multiple per riga, in modo che questo può essere utilizzato per riempire i poligoni concavi). La Blitter è molto flessibile e può eseguire una serie di operazioni logiche sui suoi ingressi, applicare ingressi maschera, e così via. Ho davvero solo scalfito la superficie. In questo caso, è capire come compilare un poligono arbitrario per il prezzo di copiare un rettangolo tra due bitplanes, che è un buon affare. Una volta avevo sostituito il mio cubo wireframe con una versione solida, ho iniziato a giocare con la grafica di nuovo. Ho usato alcuni trucchi con la tavolozza per rendere il cubo sembrare parzialmente trasparente. Sto usando tre bitplanes ora, con i lati diversi colori del cubo disegnato in bitplanes 0 e 2, e gli elementi di sfondo disegnati in aereo 1. La palette si presenta così: Se voglio il cubo di apparire solido, ho solo bisogno di fare il colore 1 uguale a 3, 4 lo stesso di 6, e 5 lo stesso 7. Fare qualsiasi coppia diverse tonalità, e lo sfondo "spettacolo attraverso". Ho anche usato il rame per modificare i valori dei colori effettivi in ​​diverse posizioni, in modo che i colori del cubo sono pallido quando è davanti alla luna e più scuro quando è di fronte alla piramide, e in modo che il colore di fondo visto attraverso le dissolvenze cubo allo stesso modo in cui funziona senza il cubo nel modo. Si tratta di un falso, e non del tutto ha senso, perché le facce posteriori del cubo non sono disegnate, ma è ancora abbastanza convincente cercando. Ho anche deciso che ero stanco di vedere che filatura cubo in un unico luogo, così ho giocato con la sua animazione un po '. Ora ho è in orbita intorno all'origine, avvicinarsi alla e poi più lontano dalla fotocamera. Infine, ho deciso di aggiungere un'altra forma indietro nel Ho avuto modo di concludere questo progetto in un paio di giorni, perché me ne sto andando per la Gen Con il Mercoledì, così in onore di che ho aggiunto un icosaedro -. La forma iconica di un venti facce morire. L'icosaedro mette molto più carico sulla CPU rispetto al cubo fa: 20 volti contro 6, 12 vertici contro 8. taglia il framerate a metà, come si può dire dal video. Sto diventando 20+ fps dal cubo, e poco più di 10 fps quando l'icosaedro è sullo schermo. L'implementazione di un algoritmo di line-disegno non è così difficile, ma nessun pezzo non banale di codice funziona a destra al primo tentativo. O il secondo. Negli ultimi giorni ho lasciato il mio progresso su questo progetto gestito in anticipo la mia documentazione, così cerchiamo di recuperare il ritardo. Questa sera, vorrei discutere brevemente come disegnare le linee - e perché si potrebbe non avere a prendersi cura. Finora, il mio approccio è stato quello di non preoccuparsi - sto usando le funzioni graphics. library AmigaOS Move () e Draw () per rendere le linee reali delle mie forme. C'è una buona ragione per questo: io sono pigro. Inoltre, graphics. library è probabilmente ben ottimizzato, e si può usufruire di alcuni di quella sgargianti hardware personalizzato Amiga. Il Blitter, come il rame ho parlato l'ultima volta, è uno dei coprocessori grafici del Amiga, e fa parte del chip Fat Agnus. Fondamentalmente, un blitter sposta semplicemente dati da una parte di memoria all'altra. E 'un bene per la copia di roba in una bitmap, o spostamento di immagine attorno. Blitter del Amiga ha anche alcune funzioni speciali - si può disegnare linee in memoria bitmap direttamente, e anche disegnare i poligoni pieni (ci arriveremo che in un'altra voce). Sul titolo Amiga, il Blitter può fare tutto questo molto più rapidamente di quanto la lattina CPU. Per prima cosa, non deve tenere istruzioni che vanno a prendere per eseguire - è sufficiente impostare i propri registri e lasciarlo andare, e sarà spostare i dati in giro il più rapidamente possibile. Inoltre, Blits possono avvenire in modo asincrono mentre la CPU sta facendo qualcos'altro. Non è esattamente multiprocessing, ma è sicuramente un vantaggio. Le funzioni graphics. library non mi danno il controllo completo su quando aspettare il Blitter e quando non, ma per esempio posso usare per la Blitter per cancellare il framebuffer, mentre la CPU sta calcolando le matrici di trasformazione da utilizzare mentre si disegna il prossimo telaio. Il portare a casa è che le funzioni graphics. library per le linee di disegno sono facili da usare, veloce, e in realtà il lavoro. Si potrebbe fare meglio se si sta scrivendo le proprie routine assembly che impostare il Blitter direttamente, ma io non sto in che in questa fase. Tuttavia, Ero un po 'interessato a scrivere la mia propria routine line-disegno, solo per vedere come una soluzione software rispetto velocità-saggio. L'algoritmo più noto per le linee di disegno (almeno, per disegnare linee, senza antialiasing) è l'algoritmo di Bresenham. In questo algoritmo, si itera dall'inizio della riga alla fine della linea nella direzione positiva-x, disegnando un pixel ad ogni coordinata x e utilizzando un valore magico "errore" di capire quando per incrementare la coordinata y. Per le linee "ripida", si può fare la stessa cosa di base, ma scambiare i ruoli di xe y. Una parte importante della prestazioni dell'algoritmo è che il suo ciclo principale utilizza solo integer addizione e sottrazione. (Va bene, il valore di errore non è in realtà la magia - si incrementa da Ax e diminuisce di AY contare fondamentalmente la pendenza della retta - ma è abbastanza intelligente È possibile leggere le informazioni su Wikipedia.). Il mio primo tentativo di implementare un algoritmo di line-disegno era talmente lento che non ho nemmeno voglia di misurare, e per una buona ragione. Calcolo le coordinate x e y era abbastanza veloce, ma capire che po 'di memoria per cambiare per tracciare quei valori ha preso troppo tempo - ed è richiesta una divisione intera costoso. La soluzione era quella di capire la posizione di memoria per il primo punto della linea - che byte della bitplane, e che po 'di quel byte - e poi gradualmente cambiare quei valori come ho disegnato la linea. Quindi, se il primo pixel era al bit 1 del byte 0x0000ccc5, il pixel alla sua destra era un po '0, e uno a destra di quello era il bit 7 di 0x0000ccc6 di byte. Scendendo o fino significava aggiungendo o sottraendo il numero di byte in una riga della bitmap. Una volta che ho fatto, ero di nuovo a usare intero addizione e sottrazione per tutte le operazioni. C'erano, naturalmente, alcuni difetti lungo la strada - si può vedere un paio di loro nella parte superiore di questo post. Una cosa che pasticci con la testa è che i byte sono disposti da sinistra a destra in ciascuna riga della bitmap, ma i bit di ogni corsa byte da destra a sinistra. Quella foto a destra mostra me fare le cose al contrario. Così come veloce ha la mia linea di software pesantemente ottimizzato disegno di routine andare? Sono lieto di comunicare che ci sono voluti circa 2,75 volte fino a quando il Blitter di fare la stessa quantità di lavoro. E 'stato un esercizio divertente, ma ho ritornata ad utilizzare le routine graphics. library per il lavoro vero e proprio - e ci arriveremo in più di quella di domani. Uno dei grandi pretese del Amiga di fama è il suo chipset personalizzati, che ha dato capacità multimediali che sono stati fondamentalmente inaudito di 30 anni fa. Ho trascorso la mia retro-tempo di questo fine settimana di apprendimento alcuni nuovi vecchi trucchi. Il rame è un coprocessore semplice ma potente, che fa parte del circuito integrato Agnus di Amiga. Di tutti i chip custom, è l'unico in grado di eseguire il proprio programma (estremamente semplice). Ha tre istruzioni: WAIT - attendere che il fascio di raggiungere una certa posizione sullo schermo. MOVE - scrivere un valore in uno dei registri chip custom. SALTA - saltare la prossima istruzione. A quanto pare è possibile utilizzare SKIP per creare loop, ma non ho muck con ancora. Che cosa si può realmente fare con questo? Un bel po 'di cose. Il rame è quello che permette di visualizzare il Amiga più schermi con diverse risoluzioni o palette contemporaneamente. E 'utilizzato per creare modalità grafiche speciali come "affettati", e può anche disegnare la grafica a blocchi per conto suo. Sui computer più vecchi come il Commodore 64 o Atari 2600, un sacco di routine grafiche invocato l'esecuzione di codice o modificare i registri quando il fascio ha raggiunto un certo punto sullo schermo, e l'intero programma doveva essere scritto intorno a quello. Il rame rende molto più facile, perché sarà eseguito mediante il proprio programma di ogni fotogramma, mentre la CPU - e il programma - si prende cura di altre cose. Ho deciso di usare il rame per aggiungere un po 'di colore e fascino al mio programma di grafica. Il mio primo tentativo in prestito da un esempio nella RKRM - ha cambiato lo sfondo da un grigio piatto per un arcobaleno di strisce orizzontali. Ah. Messaggio di navigazione Maschio & # x00B7; Stato relazione: Single & # x00B7; Maschio & # x00B7; Stato relazione: Single & # x00B7; Maschio & # x00B7; Stato relazione: Single & # x00B7; Grazie per esserti fermato. Corona Contenuto [1] [2] Note Edit Corona [1] [2] Note Bibliografia Collegamento Uso commune Il componente principale del Viagra e Sildenafil. Sildenafil agisce sulla reazione alla stimolazione sessuale. Agisce aumentando rilassamento della muscolatura liscia con ossido nitrico, una sostanza chimica che è normalmente rilasciato in risposta alla stimolazione sessuale. Questo rilassamento della muscolatura liscia permette un aumento del flusso sanguigno in alcune aree del pene, che porta ad una costruzione. Sildenafil viene usato per il trattamento della disfunzione erettile (impotenza) negli uomini e di ipertensione arteriosa polmonare. Sildenafil può essere utilizzato anche per altri scopi non elencate sopra. Dosaggio e direzioni La dose raccomandata è di 50 mg. Si è preso circa 0,5-1 ora prima dell'attività sessuale. Non prenda Viagra più di una volta al giorno. Un pasto ricco di grassi possono ritardare il tempo degli effetti di questa droga. Cercate di non mangiare pompelmo o succo di pompelmo se è in trattamento con Sildenafil. Precauzioni Prima di iniziare a prendere il citrato di Sildenafil. il medico o il farmacista se siete allergici ad esso; o se avete altre allergie. Persone anziane possono essere più sensibili agli effetti collaterali del farmaco. Viagra è controindicato nei pazienti che assumono altre medicine per curare impotenza o utilizzando un farmaco per il nitrato di dolore toracico o problemi cardiaci. Il farmaco non deve essere assunto da donne e bambini, così come nei pazienti con ipersensibilità a qualsiasi componente del farmaco. Possibili effetti collaterali Gli effetti collaterali più comuni sono mal di testa, rossore, bruciore di stomaco, naso chiuso, sensazione di testa vuota, capogiri o diarrea. Una grave reazione allergica a questo farmaco è molto rara, ma richiedere immediatamente assistenza medica se si verifica. Molte persone che fanno uso di questo farmaco non hanno gravi effetti collaterali. Nel caso in cui dovessero manifestarsi effetti collaterali non elencati sopra, contattare il medico o il farmacista. Interazione farmacologica Questo farmaco non deve essere usato con i nitrati e droghe ricreative chiamato "poppers" contenenti nitrito di amile o di butile; farmaci alfa-bloccanti; altri farmaci per l'impotenza; farmaci di alta pressione sanguigna, ecc Consultare il proprio medico o il farmacista per ulteriori dettagli. Dose Viagra viene utilizzato come necessario, quindi è improbabile che siano su un programma di dosaggio. Overdose Se si pensa di aver usato troppo di questo medicinale rivolgersi ad un medico di emergenza subito. I sintomi di overdose comprendono mal di petto, nausea, battito cardiaco irregolare, e sensazione di testa leggera o svenimento. Conservazione Conservare i farmaci a temperatura ambiente tra i 68-77 gradi (20-25 ° C) F lontano dalla luce e dall'umidità. Non conservare i farmaci in bagno. Conservare tutti i farmaci lontano dalla portata dei bambini e animali domestici. Noi forniamo solo informazioni di carattere generale su farmaci che non copre tutte le direzioni, integrazioni farmacologiche, o precauzioni. Informazioni presso il sito non può essere utilizzato per l'auto-trattamento e di auto-diagnosi. Eventuali istruzioni specifiche per un particolare paziente deve essere concordato con il proprio consulente sanitario o medico incaricato del caso. Decliniamo l'affidabilità di queste informazioni e potrebbe contenere errori. Noi non siamo responsabili per qualsiasi danno diretto, indiretto o speciale o altri a seguito di qualsiasi utilizzo delle informazioni presenti su questo sito e anche per le conseguenze di auto-trattamento.




No comments:

Post a Comment