Craft is a demo running on its own minimalistic demo platform. The demo platform is based on an ATmega88 microcontroller.

Having successfully built a soundchip out of a microcontroller together with my friends in kryo, I wanted to tackle the greater challenge of generating a realtime video signal along with the sound. This is the result:

Craft won the Console / Real Wild compo at Breakpoint 2008. I will never forget the overwhelming reaction from the audience!

Here's the Pouët page for Craft.

Just like your average 80's home computer, the entire design is centered around the timing of the video signal.

A typical VGA-based, low-resolution CRT monitor will redraw the screen 60 times per second using an electron beam, which is sweeping across the screen one line at a time. TFT monitors work differently, but the VGA signal is still based on the idea of an electron beam. Timing is crucial: One display line takes 24 μs, and is followed by a 7.75 μs break called the horizontal blanking period. After 480 such lines, there's a longer break (1428.75 μs, equal to 45 full display lines) before it all starts over. Two digital signals are used to synchronize the sender (graphics card, custom demo hardware etc.) and the receiver (monitor). They are called the horizontal sync and the vertical sync signals. It's OK to deviate a bit from the standard timing values as long as you keep the sync signals steady.

The microcontroller is clocked at 20 MHz. If we convert the figures above into clock cycles, we get 480 cycles of visible pixels, 155 cycles of horizontal blanking and 45 full display lines worth of vertical blanking — but during those lines you need to keep generating the horizontal sync pulses. Due to rouding errors, we get a frame rate of 59.99 Hz, but that is well within the tolerance range of a computer monitor.

Sound is generated during the horizontal blanking periods. That gives a sample rate of 31.496 kHz. Of course, only the really timing critical part (waveform generation) is performed during the horizontal blanking. Melody, rhythm, amplitude envelopes, arpeggios etc. are handled by a playroutine which gets called once for every video frame, during vertical blanking.

There are four sound channels in total, each with its own fixed waveform. The waveforms are 4-bit triangle, 50% pulse, 75% pulse and white noise. The noise is generated by means of a 15-bit shift register. The volume of each channel can be individually controlled, except for the triangle channel, which is always playing at full volume. This minimalistic softsynth was of course inspired by the NES sound chip.

Apart from the sync signals mentioned above, a VGA signal contains three analog voltage lines — red, green and blue — that vary between ground and 0.7 V during the visible parts of the video frame. As you can see in the schematic below, I perform a two-bit digital-to-analog conversion for each of these signals, using R-2R resistor ladders. That way, the software can change the current colour in a single clock cycle using the out PORTC,register instruction.

In addition to this, I've hooked up a couple of diodes and a PNP transistor in such a way, that when the MOSI pin is low while the OC2B pin is high, the three color signals will be pulled to a high voltage, corresponding to white. This is used to generate high resolution scroll text: The MOSI pin is connected to a shift register internally in the AVR (it is typically used for serial data transmission), and this shift register can be programmed to emit a sequence of 8 bits with a single instruction, thus offloading the CPU. Smooth scrolling is then implemented by inserting variable delays before and after each display line, but that alone is not enough, because characters would appear and disappear suddenly at the edges of the screen. So additionally, the output comparator connected to timer 2 in the chip is set up to create a visibility window using the OC2B pin.

This is how it all fits together, hardware-wise. If you are interested in the physical layout used on the breadboard, you can find it along with firmware and source code near the top of the page.

The variable 1K resistor can be used to adjust the brightness of the scroll texts.

If you want to learn more, I suggest you dive into the source code, starting with boot.S , mainloop.S and asm.S . The most interesting part is probably the cycle-accurate code in asm.S .

Discuss this page

Disclaimer: I am not responsible for what people (other than myself) write in the forums. Please report any abuse, such as insults, slander, spam and illegal material, and I will take appropriate actions. Don't feed the trolls.

Jag tar inget ansvar för det som skrivs i forumet, förutom mina egna inlägg. Vänligen rapportera alla inlägg som bryter mot reglerna, så ska jag se vad jag kan göra. Som regelbrott räknas till exempel förolämpningar, förtal, spam och olagligt material. Mata inte trålarna.

Anonymous

Fri 28-Mar-2008 20:31 I bow down in awe and wonder. This is just amazing...

Anonymous

Sat 29-Mar-2008 06:23 "The MOSI pin is connected to a shift register internally in the AVR ... and this shift register can be programmed to emit a sequence of 8 bits with a single instruction, thus offloading the CPU."



Hey, that's a *really* neat trick--makes me wonder what I could use that for. :-)



--Phil. (http://code.rancidbacon.com/)

Anonymous

Sun 30-Mar-2008 12:29 Fantastic work! You really deserved the victory at BP! :)

Anonymous

Mon 31-Mar-2008 12:46 Great! Best I've done on AVR was 4-chn 20kHz MOD-player, no graphics there ...

Anonymous

Mon 31-Mar-2008 15:03 Great job on the article! Congratulations for being posted on Make!

Anonymous

Mon 31-Mar-2008 17:01 You brought back such wonderful nostalgic memories for me.

A job really well done. :-D

Anonymous

Mon 31-Mar-2008 18:13 Seriously awesome work! Bet there isn't a free word left!



Jeff

warrantyvoidifremoved.com

Anonymous

Mon 31-Mar-2008 18:41 Great job! That gives to me a lot of good memories about the 80's computering styles.

Anonymous

Mon 31-Mar-2008 23:23 Really great old school demo :)



Thumbs Up !!!



Keep going, it's really awesome !!!!

Anonymous

Tue 1-Apr-2008 00:18 Great work! Nice to realize again how much can be done with a simple 8-bit processor.

Anonymous

Tue 1-Apr-2008 16:38 Wow that is amazing.



Would using 2 or 3 chips like this produce even more impressive results?



I notice there is some horizontal jitter in the lava field section, between 1:42 and 2:02.

I guess you are running short on the time needed to do the calculations accurately.

Anonymous

Tue 1-Apr-2008 23:28 beautiful work!

Anonymous

Fri 11-Apr-2008 00:44 Very great work. Absolut great demo and hardware... Big greetings, Chainsaw. (www.chainsaw72.ch.vu)

Autoscatto

autoscatto

Wed 16-Apr-2008 10:51 Hola! I`m working (for now copying =]) on your project but i have problems... What kind of diode do you use in this board?

Thanks for your good work!!! (and excuse my bad english)

lft

Linus Åkesson

Wed 16-Apr-2008 18:39 Autoscatto wrote: Hola! I'm working (for now copying =]) on your project but i have problems... What kind of diode do you use in this board?

Thanks for your good work!!! (and excuse my bad english) Hola! I'm working (for now copying =]) on your project but i have problems... What kind of diode do you use in this board?Thanks for your good work!!! (and excuse my bad english)

Glad you like it! =) I'm using 1N4148 diodes, but anything with a forward drop somewhere around 0.7 V should work. Glad you like it! =) I'm using 1N4148 diodes, but anything with a forward drop somewhere around 0.7 V should work.

Anonymous

Wed 23-Apr-2008 10:46 Really impressive. I'll be showing this to friends at KTH (kth.se), and probably build one or two. On my main lab board I have an AT90USB chip, which has to run at 16MHz to support USB, so I'd guess that means lower horizontal resolution. I think an Xmega could be really impressive, using its DMA engine to output high resolution colour signals.

-- Yann Vernier / LoneTech

Anonymous

Wed 30-Apr-2008 08:24 I am amazed and impressed. Bit-banging VGA and using the SPI port as a video shifter is too clever... wow. Does Atmel know about this demo of yours?

Anonymous

Thu 1-May-2008 09:45 the author should have drawn schematic more legibily using some circuit drawing software instead of this lousy ascii patterns



arun -

India

lft

Linus Åkesson

Thu 1-May-2008 14:21 the author should have drawn schematic more legibily using some circuit drawing software instead of this lousy ascii patterns



arun -

India

If you want to, feel free to draw the schematic using such a program, and I'll put it on the page. If you want to, feel free to draw the schematic using such a program, and I'll put it on the page.

Anonymous

Thu 1-May-2008 18:19 great work!

Anonymous

Fri 2-May-2008 01:54 I've been working on something simular for a few months (on and off, when i got the time) but i have not yet taken the time to create a full demo. (see www.electronicspit.com)



I must say this is a very good demo. Great work on the hardware too !

lft

Linus Åkesson

Fri 2-May-2008 11:46 I've been working on something simular for a few months (on and off, when i got the time) but i have not yet taken the time to create a full demo. (see www.electronicspit.com)



I must say this is a very good demo. Great work on the hardware too !

Yeah, I've already got it bookmarked. =) Some day I'll probably attempt something similar. The tradeoff between VGA and composite is of course that the VGA signal has a higher pixel clock, but in the composite signal you've got to modulate the colour signals. But when one tries to build something generic, such as your console, one needs external ram, and then it's not such a big deal to add further external components. Yeah, I've already got it bookmarked. =) Some day I'll probably attempt something similar. The tradeoff between VGA and composite is of course that the VGA signal has a higher pixel clock, but in the composite signal you've got to modulate the colour signals. But when one tries to build something generic, such as your console, one needs external ram, and then it's not such a big deal to add further external components.

Anonymous

Sun 4-May-2008 23:48 Great job !!! my hobby is AVR's and bascom avr (too slow to done that things) but in my opinion you must show that fantastic work to atmel and you can win/get some gadgets from them for that fantastic work ! :)



Best Regards

George2002 from Poland

Anonymous

Wed 7-May-2008 18:06 Nice job :)

Will it run on ATMEGA8 overclocked to 20MHz?

Any hardware/registers specifed only for ATMEGA88 are used there?

Anonymous

Mon 16-Jun-2008 20:32 Eddy-B wrote: I've been working on something simular for a few months (on and off, when i got the time) but i have not yet taken the time to create a full demo. (see www.electronicspit.com)



I must say this is a very good demo. Great work on the hardware too ! I've been working on something simular for a few months (on and off, when i got the time) but i have not yet taken the time to create a full demo. (see www.electronicspit.com)I must say this is a very good demo. Great work on the hardware too ! lft wrote: Yeah, I've already got it bookmarked. =) Some day I'll probably attempt something similar. The tradeoff between VGA and composite is of course that the VGA signal has a higher pixel clock, but in the composite signal you've got to modulate the colour signals. But when one tries to build something generic, such as your console, one needs external ram, and then it's not such a big deal to add further external components. Yeah, I've already got it bookmarked. =) Some day I'll probably attempt something similar. The tradeoff between VGA and composite is of course that the VGA signal has a higher pixel clock, but in the composite signal you've got to modulate the colour signals. But when one tries to build something generic, such as your console, one needs external ram, and then it's not such a big deal to add further external components.



It will still have a few external 8pin chips (i use a Tiny13 as my keyboard controller -heh! compare THAT to the standard 40-pin controller you find in XT's and AT's), and 1 external EEPROM for storing the BASIC program. The prototype PCB has already been desinged and should be 45x45mm only, but it requires SMD.



Cheers!

Eddy-B Once i have a nice working version of my Console32, i will revert back to my Mega88 and create the same Console project (with limited graphics, since the Mega88 has only 2k RAM to work with).It will still have a few external 8pin chips (i use a Tiny13 as my keyboard controller -heh! compare THAT to the standard 40-pin controller you find in XT's and AT's), and 1 external EEPROM for storing the BASIC program. The prototype PCB has already been desinged and should be 45x45mm only, but it requires SMD.Cheers!Eddy-B

Anonymous

Thu 19-Jun-2008 22:56 just brilliant!

you rule, dude

8 bits is enough!

coley

Graham Cole

Fri 27-Jun-2008 22:23 That was breathtaking Linus, probably the best thing I've seen an 8 bit micro do!

I'd be interested to see what you can do with a Parallax Propeller 32 Bit 8 Cores 32K RAM MCU :-)



Coley

Anonymous

Tue 15-Jul-2008 07:32 You are awesome. Thank you for sharing this!

Anonymous

Wed 16-Jul-2008 01:46 !!!I'M SPEECH-LESS!!!



Great demo!

Anonymous

Tue 22-Jul-2008 13:03 It's unbelievable !



Congratulations for your great work :)

Anonymous

Wed 23-Jul-2008 11:06 Very inspiring. I will give it a try. I hope this starts a new demo category.

Nice work!



-- George Laskowsky Ziguilinsky

Anonymous

Wed 23-Jul-2008 11:44 Great Job. You are an AVR SuperHero!

Anonymous

Wed 23-Jul-2008 13:03 Great job, it reminds me the old days of the C64 demo scene :).

I feel 20 year younger now :)

Anonymous

Tue 29-Jul-2008 08:04 I am highly impressed!

I was doing something similar, but I've only generated VGA signal and no sound... and my scheme involves two memory chips (page switching), a CPLD to control sync pulses and memory, and a PIC to write data into the memory.

Anyway, props to you for doing this all in software on one chip!



TSM

Anonymous

Wed 30-Jul-2008 16:53 I like this project. I like atmel. I like life.



After this, build your own OS.



Then automations...

metal

oash82@yahoo.com

Thu 31-Jul-2008 11:08 Hi,



I was wondering what software do u use to draw the stripboard layout ?



Thanks

Anonymous

Fri 1-Aug-2008 14:29 This is awesome! Never thought that little thing would have the power to generate that.

Anonymous

Fri 1-Aug-2008 14:45 Brilliant stuff man, really impressive.

Anonymous

Fri 1-Aug-2008 14:52 very impressive, and thank you for uploading the music.

Anonymous

Fri 1-Aug-2008 16:00 Wow, awesome! The music was absolutely fantastic!

Anonymous

Fri 1-Aug-2008 18:03 So nice! Just got teleported back to the 80's. This is awesome.

Anonymous

Sat 2-Aug-2008 01:26 awsome :D najs

Anonymous

Sat 2-Aug-2008 05:03 Your work is great!



AtomicZombie

Anonymous

Sat 2-Aug-2008 07:19 This is just breathtaking.. AMAZING!

Anonymous

Sat 2-Aug-2008 12:18 I have drawn the schematic in eagle, check it here as png:

http://www.bramsonderdelen.nl/vga_gen_m8.png

or as eagle sch:

http://www.bramsonderdelen.nl/vga_gen_m8.sch

contact me:

bram at atasco dot nl

what kind of transistor did you use?

Anonymous

Sat 2-Aug-2008 13:04 Mycket mycket imponerande bygge, och demot är kanon.

Anonymous

Sat 2-Aug-2008 19:27 Grymt snyggt!

Anonymous

Sat 2-Aug-2008 21:14 Cooool!!!

Respect!

Anonymous

Mon 4-Aug-2008 10:40 Mycket snyggt jobbat!

Man får en riktig resa tillbaka till den tid då dataspelen var som roligast och även oskyldigast. Jag måste säga att jag är mycket imponerad av det du gjort, det är alltid svårare att ha få resurser och utnyttja dessa till 100% än att ha den senaste tekniken och bara utnyttja delar av den.

Respekt från 40-årig gammal räv!

elosh

Henrik

Mon 4-Aug-2008 12:32 Kan bara säga hur imponerande det är. Påminner om gammla C64 och Amiga demos. Keep up the good work.

lft

Linus Åkesson

Tue 5-Aug-2008 07:41 metal wrote: Hi,



I was wondering what software do u use to draw the stripboard layout ?



Thanks Hi,I was wondering what software do u use to draw the stripboard layout ?Thanks

Hi! Those are written in a text editor, in the PostScript language. Have a look in the .eps file and you'll see what I mean. Hi! Those are written in a text editor, in the PostScript language. Have a look in the .eps file and you'll see what I mean.

Anonymous

Tue 5-Aug-2008 22:19 Wow. I'm speechless.

Anonymous

Thu 7-Aug-2008 13:10 ...



I would congratulate you, but there are no words to describe how amazing that was.

Anonymous

Sat 9-Aug-2008 02:24 You have a really demoscene talent, man!

Anonymous

Tue 12-Aug-2008 03:59 Have you been at all tempted by the AT94K05AL? It's a bit more towards the pricey end but soo many possibilities. I guess the best cheap boost would be a low end xmega.



I have this half baked idea of having a challenge where you take a standard pc keyboard and video connector and add $20 worth of parts to make the best computer you can. (you can use volume pricing for your price calculations though because the idea is to imagine if you made thousands of them)

Anonymous

Wed 27-Aug-2008 19:10 this is just amazing. would it be possible to have several of these chips work together, and specialize one chip for one kind of work, thus getting a better result? (higher computational power). couple that with a homemade input device (or something like an old NES controller), and you could make your own game console.



many, many kudos to you.

Anonymous

Sat 30-Aug-2008 23:05 .. mad skills, mad skills!

Anonymous

Mon 1-Sep-2008 08:11 Very nice work!!! What is the programming software/compiler you used for your source code?

lft

Linus Åkesson

Tue 2-Sep-2008 07:50 Very nice work!!! What is the programming software/compiler you used for your source code?

That would be the AVR port of the GNU toolchain. During early development I used C routines (compiled with avr-gcc) along with the assembly code. Have a look in the makefile for all the details. That would be the AVR port of the GNU toolchain. During early development I used C routines (compiled with avr-gcc) along with the assembly code. Have a look in the makefile for all the details.

Anonymous

Fri 5-Sep-2008 13:36 Hi lft!



I'm very much impressed by your work! I would like to ask a question:

Since you obviously have the knowhow to produce graphics and the VGA signals at the same time, would it be possible to create some kind of simple vga-driver for the MEGA88 in a way that you can set some graphic elements on the screen using a I²C or RS232 interface?

What I would like to see is a lib for the MEGA8. We just flash it and can do the following for example:

- setPixel(x,y,color)

- setCircle(x,y,radius, color, bfill)

- setText(x,y,cString, color, ...)

- other handy stuff



I know that communication between µC use a lot of time, but there is no need to have an ultra steady vga signal using a TFT? So we could transfer some instructions and the MEGA8 would display the data on the VGA-Panel. A couple of FPS per second would be enough.



Would that be possible?

Anonymous

Fri 5-Sep-2008 19:28 An AVR console using NES controllers and NTSC Composite Video output.



-> http://belogic.com/uzebox/

lft

Linus Åkesson

Sat 6-Sep-2008 14:24 ... would it be possible to create some kind of simple vga-driver for the MEGA88 in a way that you can set some graphic elements on the screen using a I²C or RS232 interface?

What I would like to see is a lib for the MEGA8. We just flash it and can do the following for example:

- setPixel(x,y,color)

- setCircle(x,y,radius, color, bfill)

- setText(x,y,cString, color, ...)

- other handy stuff



Hi! The main problem with this approach is that the chip would have to keep track of a frame buffer. 1 kB of RAM is not a lot. Even if we opt for a simple black and white bitmap, there would only be room for 128 x 64 pixels. One alternative would be to use a tiled display, but without external RAM it would still be very limited.



Once we start using external RAM, we can do lots of things, and that area has been explored by others in several projects. Hi! The main problem with this approach is that the chip would have to keep track of a frame buffer. 1 kB of RAM is not a lot. Even if we opt for a simple black and white bitmap, there would only be room for 128 x 64 pixels. One alternative would be to use a tiled display, but without external RAM it would still be very limited.Once we start using external RAM, we can do lots of things, and that area has been explored by others in several projects.

Anonymous

Sat 6-Sep-2008 17:56 lft wrote: ... would it be possible to create some kind of simple vga-driver for the MEGA88 in a way that you can set some graphic elements on the screen using a I²C or RS232 interface?

What I would like to see is a lib for the MEGA8. We just flash it and can do the following for example:

- setPixel(x,y,color)

- setCircle(x,y,radius, color, bfill)

- setText(x,y,cString, color, ...)

- other handy stuff



Hi! The main problem with this approach is that the chip would have to keep track of a frame buffer. 1 kB of RAM is not a lot. Even if we opt for a simple black and white bitmap, there would only be room for 128 x 64 pixels. One alternative would be to use a tiled display, but without external RAM it would still be very limited.



Once we start using external RAM, we can do lots of things, and that area has been explored by others in several projects. Hi! The main problem with this approach is that the chip would have to keep track of a frame buffer. 1 kB of RAM is not a lot. Even if we opt for a simple black and white bitmap, there would only be room for 128 x 64 pixels. One alternative would be to use a tiled display, but without external RAM it would still be very limited.Once we start using external RAM, we can do lots of things, and that area has been explored by others in several projects.

If the problem with the above is just the 1K RAM, would a larger chip with, say 4K RAM, be enough to do some basic text and graphics? Thank you for your participation. If the problem with the above is just the 1K RAM, would a larger chip with, say 4K RAM, be enough to do some basic text and graphics? Thank you for your participation.

Anonymous

Sat 6-Sep-2008 18:14 I posted the above question and just realized that 4K would only allow 512 x 256 pixels, so how about some of the 8K RAM processors? Would that allow some basic text and graphics capabilities using serial port for video data input? Thanks again!

Anonymous

Sat 6-Sep-2008 19:43 My initial idea about the setPixel and stuff was to keep track about how things are created. Not storing the actual image.

If you want to set a pixel you check if the pixel should be painted by searching some kind of ObjectPaintInstruction-stack or something.



I have to add that this approach would loose speed the more objects are to be displayed.... hmmm... maybe a dedicated VGA driver chip would be the easier choice ;)

Anonymous

Fri 19-Sep-2008 15:40 That is a very nice example of lateral thinking making the best of the AVR's potential.



Full marks!



Joey

Anonymous

Fri 19-Sep-2008 18:25 I've played about with generating video directly from an AVR myself, did most of a space invaders game as a demo, and I've actually used similar techniques on commercial designs to drive graphic LCD displays directly from an AVR (the timing is rather less critical with LCD's)... That included driving a windowed display using a Mega128 with next to no external hardware, so from the perspective of someone who knows exactly what's involved let me say that you've done a beautiful job there... Congratulations :)

Anonymous

Sun 21-Sep-2008 21:19 Whats the potentiometer for?

Anonymous

Mon 22-Sep-2008 03:20 Hi, great work. I am trying to rebuild this thing. Whats the PNP transistor? Is "BC560C" okay?

Anonymous

Mon 22-Sep-2008 13:59 Hi, great work. I am trying to rebuild this thing. Whats the PNP transistor? Is "BC560C" okay? Nevermind, I tried it. It works. Nevermind, I tried it. It works.

lft

Linus Åkesson

Fri 26-Sep-2008 18:18 Whats the potentiometer for?

It's for adjusting the intensity of the white high-res overlay used for text, so the text won't bleed (too high) or turn grey (too low). Different transistors have different hFE factors, which also vary with temperature, so it's convenient to be able to fine tune the system after it has been assembled. It's for adjusting the intensity of the white high-res overlay used for text, so the text won't bleed (too high) or turn grey (too low). Different transistors have different hFE factors, which also vary with temperature, so it's convenient to be able to fine tune the system after it has been assembled.

Anonymous

Tue 30-Sep-2008 23:04 Very impressive, then I saw the Mandelbrot being calculated in real-time and my mind possibly just exploded :-)

Anonymous

Thu 9-Oct-2008 07:35 Absolutely amazing! Easily the most brilliant demo I've seen in years, possibly ever!



Now get an ATmega1284p (16K RAM) clocked at 20 MHz and do some REALLY fancy stuff! :-)



klaxon44

Anonymous

Thu 9-Oct-2008 07:45 Absolutely amazing! Easily the most brilliant demo I've seen in years, possibly ever!



Now get an ATmega1284p (16K RAM) clocked at 20 MHz and do some REALLY fancy stuff! :-)



klaxon44

Anonymous

Tue 28-Oct-2008 17:36 Is anyone else having trouble viewing the fullscreen rip video? I can't seem to get it to play properly, even after an hour or so of messing with codecs. ~_~

Anonymous

Fri 7-Nov-2008 04:47 I bow down in awe and wonder. This is just amazing...

I saw this on http://www.demoscene.tv

It reminded me so much of my commodore c=64 pure genius!!!!!



Add me on http://www.myspace.com/stuckinfremont510 is my personal site, I've allways loved the demoscene, I've been a fan since I was six years old, all of the demoscene coders are Brilliant Minds that creative abilities and talents cannot be measured for you do this out of the love of the hobby in itself, which no engineer out of profession could compare. I saw this on http://www.demoscene.tvIt reminded me so much of my commodore c=64 pure genius!!!!!Add me on http://www.myspace.com/stuckinfremont510 is my personal site, I've allways loved the demoscene, I've been a fan since I was six years old, all of the demoscene coders are Brilliant Minds that creative abilities and talents cannot be measured for you do this out of the love of the hobby in itself, which no engineer out of profession could compare.

Anonymous

Tue 25-Nov-2008 22:21 AWESOME!!!! You're the god of microcontrollers.

i've just finished to make a little game for 2 players for the Atmel ATtiny13 connected to a TV (BAS signal generation) so i can imagine what you've programed.

Craft is really fantastic.

Anonymous

Fri 12-Dec-2008 16:26 Riktigt snyggt. Tror jag ska ta o bygga mej en sån själv så att jag verkligen kan visa hur kraftig en liten mega är.



Hur lång tid tog det att implementera?



Återigen riktigt snyggt!

Anonymous

Sun 4-Jan-2009 16:53 Awsome work!

I really loved this piece of Art when I saw it first, and I'm still in love. Being an Electrical Engineer I smile like hell when I see this demo. :))



Only one bug report:

This should be 31496 Hz, or 31.496 kHz I think:

""Sound is generated during the horizontal blanking periods. That gives a sample rate of 31496 kHz.""



Cheers....

NTAmi

lft

Linus Åkesson

Thu 8-Jan-2009 20:13 Only one bug report:

This should be 31496 Hz, or 31.496 kHz I think

Well spotted! I've fixed it now. Thanks! Well spotted! I've fixed it now. Thanks!

Anonymous

Wed 14-Jan-2009 16:41 WOW ! You guys are just sick ! Amazing !



Best Regards

Ruben Täufer

Germany

Anonymous

Wed 14-Jan-2009 23:30 I cannot decompress lft_craft_src.tar.gz on XP.

How can it be decompressed?



Any help would be appreciated.

Anonymous

Fri 16-Jan-2009 00:47 I cannot decompress lft_craft_src.tar.gz on XP.

How can it be decompressed?



Any help would be appreciated.

Download winRAR or 7-zip =) Download winRAR or 7-zip =)

Anonymous

Tue 24-Feb-2009 02:17 I'm pretty bad at analogue electronics but you write in the description that the red,green and blue lines vary between ground and 0.7V. But when i look at the ladder in your ascii schematics for for example red (PC4, PC5) i would have thought that when both is set to 1 (5V) you get 3.75V? Am i missing something?

lft

Linus Åkesson

Mon 2-Mar-2009 08:31 I'm pretty bad at analogue electronics but you write in the description that the red,green and blue lines vary between ground and 0.7V. But when i look at the ladder in your ascii schematics for for example red (PC4, PC5) i would have thought that when both is set to 1 (5V) you get 3.75V? Am i missing something?

Yeah, actually I think there's something strange going on, because I realize I haven't connected the AVcc pin, which powers port C according to the datasheet. So presumably port C is severely current limited. When you calculate signal levels, you have to take into account the input impedance of the VGA monitor (75 Ohm), but that still gives you a signal range from ground to 1.27 V, which is clearly out of spec. The proper theoretical value for R would be 460 Ohm. Anyway, I learned the hard way in another project: Always connect AVcc! Yeah, actually I think there's something strange going on, because I realize I haven't connected the AVcc pin, which powers port C according to the datasheet. So presumably port C is severely current limited. When you calculate signal levels, you have to take into account the input impedance of the VGA monitor (75 Ohm), but that still gives you a signal range from ground to 1.27 V, which is clearly out of spec. The proper theoretical value for R would be 460 Ohm. Anyway, I learned the hard way in another project: Always connect AVcc!

Anonymous

Thu 12-Mar-2009 07:10 Class! I try to create that or like..... The Author of the site many thanks and respect from Russia!

Anonymous

Sat 28-Mar-2009 23:52 One more respect to Author from Russia!!! Linus is a genius!

Anonymous

Fri 3-Apr-2009 10:14 I'm thinking how to change it in to a "graphic&sound card".

How to force it to display data from UART (or other interface).

Anyway, awsome work. I'm highly impressed.



I apologize for my English.

Anonymous

Wed 8-Apr-2009 13:23 This is sweet!



It kicks ass!

Anonymous

Thu 9-Apr-2009 03:32 Hi



I have some questions. This is really one of the most amazing things i have seen, and since you have uploaded the source and schematics i wanted to build my own copy of your demo board to see if it actually works. (I REALLY want to see it with my own eyes and show it to my friends)



So,

I have an atmega168 lying around, which almost is identical to atmega88, but with more flash. My board is ready and built according to your ASCII description, but I can't make it work for some reason. Im quite new to microcontrollers and im not familiar enough with assembler to understand most of your code (I have tried for hours, really). Linux is my main OS and i have avr-gcc, avrdude, the build-essential metapackage and so on installed, so compiling your sources went without problems. The hex-file is uploaded and the fuses are set as you described. But as mentioned, it does not work.. there is no signal on any pin.



I think this is because the source is unchanged, and written for atmega88, so there are most likely some things that need to be changed in order to run it on atmega168, but i dont even know where to start. Usually i use eclipse with the avr plugin, so i dont really know how most things actually work. Here is a comparision between atmega48, 88 and 168: http://www.atmel.com/dyn/resources/prod_documents/doc2554.pdf



Would you pleeease help me getting started, i really want to make this work. I will upload my eagle schematics and board layout once im sure it works, together with the atmega168 hex file in case someone is interested.

Anonymous

Wed 22-Apr-2009 09:41 amazing work man, the sounds of your demo brought me back to my youth playing games on ancient hardware :D

Anonymous

Thu 23-Apr-2009 03:13 lft wrote: the author should have drawn schematic more legibily using some circuit drawing software instead of this lousy ascii patterns



arun -

India

If you want to, feel free to draw the schematic using such a program, and I'll put it on the page. If you want to, feel free to draw the schematic using such a program, and I'll put it on the page.

I will take this up.

Ill draw it in eagle I will take this up.Ill draw it in eagle

Anonymous

Thu 23-Apr-2009 05:16 lft wrote: the author should have drawn schematic more legibily using some circuit drawing software instead of this lousy ascii patterns



arun -

India

If you want to, feel free to draw the schematic using such a program, and I'll put it on the page. If you want to, feel free to draw the schematic using such a program, and I'll put it on the page.

I will take this up.

Ill draw it in eagle I will take this up.Ill draw it in eagle

Finished!

I replaced the pnp transistor with a P-Mosfet

I can Make the PCBS for these, but they will cost about $40-$60 a board fully assembled.

I used axle resistors and diodes in the schematic

Here is the schematic: http://dump.no/files/de4e5c2db4de/craft-sch.7z

In it is a High Contrast and Low Contrast Image of the Schematic, Also an Eagle CAD schematic file.

Eagle CAD is Freeware, many people use it: http://www.cadsoft.de/

Enjoy :3 Finished!I replaced the pnp transistor with a P-MosfetI can Make the PCBS for these, but they will cost about $40-$60 a board fully assembled.I used axle resistors and diodes in the schematicHere is the schematic: http://dump.no/files/de4e5c2db4de/craft-sch.7zIn it is a High Contrast and Low Contrast Image of the Schematic, Also an Eagle CAD schematic file.Eagle CAD is Freeware, many people use it: http://www.cadsoft.de/Enjoy :3

Anonymous

Thu 23-Apr-2009 05:24 Hi



I have some questions. This is really one of the most amazing things i have seen, and since you have uploaded the source and schematics i wanted to build my own copy of your demo board to see if it actually works. (I REALLY want to see it with my own eyes and show it to my friends)



So,

I have an atmega168 lying around, which almost is identical to atmega88, but with more flash. My board is ready and built according to your ASCII description, but I can't make it work for some reason. Im quite new to microcontrollers and im not familiar enough with assembler to understand most of your code (I have tried for hours, really). Linux is my main OS and i have avr-gcc, avrdude, the build-essential metapackage and so on installed, so compiling your sources went without problems. The hex-file is uploaded and the fuses are set as you described. But as mentioned, it does not work.. there is no signal on any pin.



I think this is because the source is unchanged, and written for atmega88, so there are most likely some things that need to be changed in order to run it on atmega168, but i dont even know where to start. Usually i use eclipse with the avr plugin, so i dont really know how most things actually work. Here is a comparision between atmega48, 88 and 168: http://www.atmel.com/dyn/resources/prod_documents/doc2554.pdf



Would you pleeease help me getting started, i really want to make this work. I will upload my eagle schematics and board layout once im sure it works, together with the atmega168 hex file in case someone is interested.

My guess is the registries for the timer interrupts are different on the 88 then the 168.

You should see some signals on the pins tough.

Read the atmeag168 manual and the atmega88 manual

Look at the registries on the chips

Compare them, to what he is setting in code, make changes...

here is my email: (godberg[at]gmail{Dot}com)

I am also the one who posted the eagle schematic...

I'll help you out. My guess is the registries for the timer interrupts are different on the 88 then the 168.You should see some signals on the pins tough.Read the atmeag168 manual and the atmega88 manualLook at the registries on the chipsCompare them, to what he is setting in code, make changes...here is my email: (godberg[at]gmail{Dot}com)I am also the one who posted the eagle schematic...I'll help you out.

Anonymous

Mon 4-May-2009 02:31 Hi



I have some questions. This is really one of the most amazing things i have seen, and since you have uploaded the source and schematics i wanted to build my own copy of your demo board to see if it actually works. (I REALLY want to see it with my own eyes and show it to my friends)



So,

I have an atmega168 lying around, which almost is identical to atmega88, but with more flash. My board is ready and built according to your ASCII description, but I can't make it work for some reason. Im quite new to microcontrollers and im not familiar enough with assembler to understand most of your code (I have tried for hours, really). Linux is my main OS and i have avr-gcc, avrdude, the build-essential metapackage and so on installed, so compiling your sources went without problems. The hex-file is uploaded and the fuses are set as you described. But as mentioned, it does not work.. there is no signal on any pin.



I think this is because the source is unchanged, and written for atmega88, so there are most likely some things that need to be changed in order to run it on atmega168, but i dont even know where to start. Usually i use eclipse with the avr plugin, so i dont really know how most things actually work. Here is a comparision between atmega48, 88 and 168: http://www.atmel.com/dyn/resources/prod_documents/doc2554.pdf



Would you pleeease help me getting started, i really want to make this work. I will upload my eagle schematics and board layout once im sure it works, together with the atmega168 hex file in case someone is interested.

My guess is the registries for the timer interrupts are different on the 88 then the 168.

You should see some signals on the pins tough.

Read the atmeag168 manual and the atmega88 manual

Look at the registries on the chips

Compare them, to what he is setting in code, make changes...

here is my email: (godberg[at]gmail{Dot}com)

I am also the one who posted the eagle schematic...

I'll help you out. My guess is the registries for the timer interrupts are different on the 88 then the 168.You should see some signals on the pins tough.Read the atmeag168 manual and the atmega88 manualLook at the registries on the chipsCompare them, to what he is setting in code, make changes...here is my email: (godberg[at]gmail{Dot}com)I am also the one who posted the eagle schematic...I'll help you out.

Thanks for the reply!



I tried compiling it for the atmega 168 and it did not work. The problem seems to be related to many relative branch instructions. They did not work with 16 kb memory in some places for some reason. I tried simply replacing them with jmp instructions, but that seems to consume too many clock cycles, so the timing was way off after that. The registers used by this project however seemed to be the same on both mcus.



Well, i have replaced the atmega168 with an atmega88, and now it works perfectly!





Another thing i was thinking about is the way the sound is generated. As one 8-bit timer is free it should be possible to generate sound by running the timer in fast pwm with no prescale and simply adjusting the duty cycle by writing to OCRXX for the timer. Then the output from the OCXX pin for the timer could be used to simulate the analog sound value with a 78 kHz frequency with variable duty cycle. Doing this would be easier in software and much easier in hardware as one of the DA-converters is not needed any more, and i think it would give almost the same sound. Thanks for the reply!I tried compiling it for the atmega 168 and it did not work. The problem seems to be related to many relative branch instructions. They did not work with 16 kb memory in some places for some reason. I tried simply replacing them with jmp instructions, but that seems to consume too many clock cycles, so the timing was way off after that. The registers used by this project however seemed to be the same on both mcus.Well, i have replaced the atmega168 with an atmega88, and now it works perfectly!Another thing i was thinking about is the way the sound is generated. As one 8-bit timer is free it should be possible to generate sound by running the timer in fast pwm with no prescale and simply adjusting the duty cycle by writing to OCRXX for the timer. Then the output from the OCXX pin for the timer could be used to simulate the analog sound value with a 78 kHz frequency with variable duty cycle. Doing this would be easier in software and much easier in hardware as one of the DA-converters is not needed any more, and i think it would give almost the same sound.

Anonymous

Wed 3-Jun-2009 07:04 Awesome.

Just awesome.

I don't have any other words.

Anonymous

Sat 6-Jun-2009 21:08 Wow!

I am really impressed!

Need to learn some assembler, i think....

Enleth

Mon 8-Jun-2009 22:53 Hello,



first, I must say that I'm really in awe, and that reading the craft source code was possibly the most educational AVR experience I've ever had.



However, I've got a problem with getting my own copy to work - basically, the video is there, perfectly stable and all correct, but there's no sound. I've already octuple-checked (is that even a word?) all the connections, resistor values, polarity of the capacitor and so on, and still I've got no clue as to why wouldn't it work. There's a silent "knock" in the speakers when the microcontroller kicks in after reset, some interference from the video signal can be heard (the sound fluctuates with the "waves" in the opening screen and changes completely witch each screen), but absolutely no signs of music - and, most importantly, the "analyzer" screen (the one with a 3D cube and Manderbolt) indeed shows the vertical stripes completely motionless (save for the moment when they slide off to make more space for the cube).



I'm using a new ATmega88, with the fuses programmed correctly (well, the video wouldn't be there otherwise), and the circuit was built on a breadboard.



Any hints?

Anonymous

Tue 9-Jun-2009 23:43 Enleth wrote: Hello,



first, I must say that I'm really in awe, and that reading the craft source code was possibly the most educational AVR experience I've ever had.



However, I've got a problem with getting my own copy to work - basically, the video is there, perfectly stable and all correct, but there's no sound. I've already octuple-checked (is that even a word?) all the connections, resistor values, polarity of the capacitor and so on, and still I've got no clue as to why wouldn't it work. There's a silent "knock" in the speakers when the microcontroller kicks in after reset, some interference from the video signal can be heard (the sound fluctuates with the "waves" in the opening screen and changes completely witch each screen), but absolutely no signs of music - and, most importantly, the "analyzer" screen (the one with a 3D cube and Manderbolt) indeed shows the vertical stripes completely motionless (save for the moment when they slide off to make more space for the cube).



I'm using a new ATmega88, with the fuses programmed correctly (well, the video wouldn't be there otherwise), and the circuit was built on a breadboard.



Any hints? Hello,first, I must say that I'm really in awe, and that reading the craft source code was possibly the most educational AVR experience I've ever had.However, I've got a problem with getting my own copy to work - basically, the video is there, perfectly stable and all correct, but there's no sound. I've already octuple-checked (is that even a word?) all the connections, resistor values, polarity of the capacitor and so on, and still I've got no clue as to why wouldn't it work. There's a silent "knock" in the speakers when the microcontroller kicks in after reset, some interference from the video signal can be heard (the sound fluctuates with the "waves" in the opening screen and changes completely witch each screen), but absolutely no signs of music - and, most importantly, the "analyzer" screen (the one with a 3D cube and Manderbolt) indeed shows the vertical stripes completely motionless (save for the moment when they slide off to make more space for the cube).I'm using a new ATmega88, with the fuses programmed correctly (well, the video wouldn't be there otherwise), and the circuit was built on a breadboard.Any hints?

Hi



I have also rebuilt craft, and it works perfectly for me. I think you forgot to program the eeprom from eeprom.raw. I tried uploading flash.hex only, and i got the same behaviour you described.



Try downloading both flash.hex and eeprom.raw to the avr, and it should work. I'm using AVRDude from the command line, and i noticed i have to upload both files at the same time. If you are using AVRISP mkii with avrdude, try something like



<code>

avrdude -c avrispmkII -P usb -p m88 -e -U flash:w:test.hex -U eeprom:w:eeprom.raw

</code>



I'm not sure the command above is 100% correct, but i think it works.



Good luck! HiI have also rebuilt craft, and it works perfectly for me. I think you forgot to program the eeprom from eeprom.raw. I tried uploading flash.hex only, and i got the same behaviour you described.Try downloading both flash.hex and eeprom.raw to the avr, and it should work. I'm using AVRDude from the command line, and i noticed i have to upload both files at the same time. If you are using AVRISP mkii with avrdude, try something like avrdude -c avrispmkII -P usb -p m88 -e -U flash:w:test.hex -U eeprom:w:eeprom.raw I'm not sure the command above is 100% correct, but i think it works.Good luck!

Enleth

Fri 12-Jun-2009 18:58 I think you forgot to program the eeprom from eeprom.raw. I tried uploading flash.hex only, and i got the same behaviour you described.

You got it right there - thanks. As always, the problem is both in the most obvious and the most obscure place at the same time.



Now, it works perfectly. You got it right there - thanks. As always, the problem is both in the most obvious and the most obscure place at the same time.Now, it works perfectly.

Anonymous

Sat 25-Jul-2009 18:24 Really impressive work! Found you during research for PAL Signals...

Anonymous

Wed 29-Jul-2009 23:54 Man you rocks!!! Reminded me oldschool times.

Anonymous

Mon 7-Sep-2009 14:41 one of the most powerfull projects i've ever seen!



i'm just fooling around with one square wave and a rgb led...

Anonymous

Fri 2-Oct-2009 01:59 Hi



I have rebuilt craft for the second time this evening, and i wanted to contribute with something as this project is amazing and i really appreciate the effort of making it open source. I have made a PCB using the open source software KiCad under Linux. Here is a link to the files needed to recreate it (most components are smd, but making this by hand should be easy as the resistors and capacitors are 0805 and the pcb is single-sided):



http://dl.getdropbox.com/u/1026013/Projects/Craft_PCB.zip



Included are the KiCad project files and some other files:



* 3d rendering of the top and bottom of the PCB as jpg.



* The schematic as ps and pdf.



* The copper layer as ps and pdf.



* The copper silkscreen as ps and pdf.



* The component silkscreen as ps and pdf.



The board is 48mm x 55mm.



Hope this helps someone, feel free to use it however you like. I could make the pcb smaller, but i did not have much time as i made everything this afternoon/evening.



Linus, feel free to add these files to the download section and to use the included schematic in the description if you like, as it is a bit easier to read than the ascii one.

Anonymous

Thu 26-Nov-2009 15:21 Should be even easier with the XMEGA which has multiple SPI channels + DMA.

lft

Linus Åkesson

Thu 26-Nov-2009 16:56 Should be even easier with the XMEGA which has multiple SPI channels + DMA.

True, but "easier" was not my intention. =) True, but "easier" was not my intention. =)

hobgoblin

Ashley Fraser

Wed 9-Dec-2009 16:21 You sir are a genius, this has got to be the most impressive display I have ever seen on an 8 bit MCU, hell it's better than what I've seen some (most) much more powerful MCUs do.



I happened upon this page accidently as I have been spending the entire day trying to find enough documentation to do some VGA stuff and I have to say that I am glad I did, you made my day.

Anonymous

Sun 13-Dec-2009 10:32 Hey, great project. I've cloned your PCB but the Video doesn't work. Seems like Sync is broken. I've tried this with three monitors. Any idea? The colors seem to be right (they change) but no real video signal is visible.

Anonymous

Sun 13-Dec-2009 10:37 Another strange thing is: The music does only play if the monitor is connected..

Anonymous

Tue 15-Dec-2009 12:57 After circuit analysis I've found out that the 0V peak at the VGA-Sync Signals is acually at circa 1.7V. Are there any Port registers wrong and Pins not defined as output?

lft

Linus Åkesson

Mon 21-Dec-2009 10:27 After circuit analysis I've found out that the 0V peak at the VGA-Sync Signals is acually at circa 1.7V. Are there any Port registers wrong and Pins not defined as output?

There is a known error, namely that AVcc has been left floating in my design. Since AVcc powers port C, this will cause current limiting on the RGB outputs.



However, I haven't had any trouble with the sync levels. Have you verified that there are no cuts or shorts? There is a known error, namely that AVcc has been left floating in my design. Since AVcc powers port C, this will cause current limiting on the RGB outputs.However, I haven't had any trouble with the sync levels. Have you verified that there are no cuts or shorts?

Anonymous

Tue 12-Jan-2010 11:27 So very good - keep up the good work



-Dingo_aus

Anonymous

Tue 19-Jan-2010 02:03 And there I was playing away on my Arduino; happy to get 32 leds to flash in the correct sequence.

Exceptional work. Well done!

Anonymous

Mon 5-Apr-2010 00:51 Adorable work!



One question: I also tried using the MOSI pin to generate a video signal, but after the 8th bit is shifted out, the MOSI line stays high for a short time, before the next byte gets shifted out. How did you solve this?



Markus

lft

Linus Åkesson

Tue 6-Apr-2010 15:47 I also tried using the MOSI pin to generate a video signal, but after the 8th bit is shifted out, the MOSI line stays high for a short time, before the next byte gets shifted out. How did you solve this?

I decided to live with it. The MOSI trick is used when displaying text, either statically or in the sine scroller. In the font, every character is eight pixels wide, and the extra delay after the eighth bit forms the space between characters. The pin is connected to the video signal in such a way as to make it white when low and transparent when high. I decided to live with it. The MOSI trick is used when displaying text, either statically or in the sine scroller. In the font, every character is eight pixels wide, and the extra delay after the eighth bit forms the space between characters. The pin is connected to the video signal in such a way as to make it white when low and transparent when high.

Anonymous

Sun 13-Jun-2010 05:09 Could you please make a parts list? I know the schematics include all parts, but still, it would make it easier to acquire all components.

Anonymous

Thu 17-Jun-2010 22:14 Hi, i have a little problem here with craft. some colours doesn't seem to be the correct ones, cyan is missing in the plasma (showing another shade of blue instead) or the first tunnel isn't coloured red and white (it's purple and violet) for an example. any idea? i checked the hardware a few times and it looks ok.

lft

Linus Åkesson

Tue 22-Jun-2010 19:29 Hi, i have a little problem here with craft. some colours doesn't seem to be the correct ones, cyan is missing in the plasma (showing another shade of blue instead) or the first tunnel isn't coloured red and white (it's purple and violet) for an example. any idea? i checked the hardware a few times and it looks ok.

Did you connect AVcc? In the original design, AVcc was left floating (by mistake), and this probably affects the amount of current that can be sourced from PORTC. Otherwise I really don't know. Did you connect AVcc? In the original design, AVcc was left floating (by mistake), and this probably affects the amount of current that can be sourced from PORTC. Otherwise I really don't know.

Anonymous

Fri 25-Jun-2010 13:21 lft wrote: Did you connect AVcc? In the original design, AVcc was left floating (by mistake), and this probably affects the amount of current that can be sourced from PORTC. Otherwise I really don't know. Did you connect AVcc? In the original design, AVcc was left floating (by mistake), and this probably affects the amount of current that can be sourced from PORTC. Otherwise I really don't know.

At first I also connected the AVcc Pin, but then I disconnected it again since I found out that there's something wrong with the colours and I thought it could have something to do with AVcc but disconnecting it didn't change anything.



Anyway I also don't know what's the Problem here but I let you know what's wrong when I get it solved. At first I also connected the AVcc Pin, but then I disconnected it again since I found out that there's something wrong with the colours and I thought it could have something to do with AVcc but disconnecting it didn't change anything.Anyway I also don't know what's the Problem here but I let you know what's wrong when I get it solved.

Anonymous

Tue 20-Jul-2010 14:25 Sinistra (sinistra92)



This is really amazing,

I am into digital electronics as well, therefore it's a mine of information for me.



Thank you for such a great avr project.

Anonymous

Fri 23-Jul-2010 11:08 Im surprised you did'nt build the screen yourself too.



Hate to admit it, but the only word I can think of: awesome!

Anonymous

Fri 23-Jul-2010 18:48 I am quite amazed, not only is your build incredible, the music is actually really awesome, props from me ;)

Anonymous

Mon 9-Aug-2010 14:45 Wow, this is way up there on my favorites list. True blue ribbon winner project. Excellent use of additional capabilities shift register.



The best I have seen so far video & audio with AVR with such minimal parts and no overclocking...



I'd wait for this to download over 300bps, :P

Anonymous

Sun 24-Oct-2010 05:32 For all you guys interested in prototyping your circuits on this kind of PCBs (often called "perfboards"), a quick google search gave me this two links:



DIY Layout Creator (written in Java -> Free)

http://www.synthdiy.com/show/?id=2489



Lochmaster

http://www.abacom-online.de/html/lochmaster.html



I'm currently testing Lochmaster, and I must say that it's way better than nothing. It is certainly limited but one shouldn't wish a full-featured suite for simple circuit prototyping.



These two taken from this site:

http://www.sphere.ws/blog/?p=139



I hope this links are useful.



- Netshark

Anonymous

Wed 3-Nov-2010 12:17 Hi linus good work !!!!



can i get the correct schematic as i a a begineer to micro controller i am unable to get the schematic which u have did in text format. i read the comments someone has given the schematic in eagle format but unfotunately io didnt found that. so can u or anyone else mail me the schematic

My mail id is azhar.karnalkar@gmail.com

thanks in advance. and a great work man.

Anonymous

Sat 13-Nov-2010 19:39 Way to go Linus! I really love the both the audio and video.



Just so you know, Craft is now the ringtone of my cellphone and Turbulence is the alarm tone :-)

Anonymous

Tue 7-Dec-2010 05:45 I'm thinking that you are not human.

And i am scared when i realize that 'bad' programming a modern processor to do the same thing can probably waste 100 times the same energy. buh...!!!

thank you!

i'm italian so i can't speak/write in good english. eheh bye.

Anonymous

Sat 18-Dec-2010 00:41 Hey, youre awesome!

And the Soundtrack of Craft is beautiful :)

Anonymous

Wed 29-Dec-2010 11:25 its really W O N D E R F U L)))) very nice

I am addicted to needlework and crafting too....check it out my site http://www.oxima-homemade.com/en.html

Anonymous

Fri 28-Jan-2011 04:16 all I can say is WOW

Anonymous

Sat 29-Jan-2011 22:08 Amazing! It sounds exactly like AY8910/12 chip in famous ZX Spectrum.

Anonymous

Tue 22-Feb-2011 16:09 Dude, you are awesome, I'm really amazed! Keep on creating amazing stuff like this!!

Anonymous

Sun 5-Jun-2011 09:01 Linus the names of 2 people very good with computers

Anonymous

Tue 12-Jul-2011 13:16 Fantastic project Linus, very inspiring. I have a spare '88 somewhere so I think I'm going to build one. Many thanks for sharing!

Anonymous

Tue 26-Jul-2011 03:40 Really impressive. I'll be showing this to friends at KTH (kth.se), and probably build one or two. On my main lab board I have an AT90USB chip, which has to run at 16MHz to support USB, so I'd guess that means lower horizontal resolution. I think an Xmega could be really impressive, using its DMA engine to output high resolution colour signals.

-- Yann Vernier / LoneTech

Anonymous

Tue 26-Jul-2011 03:42 lft wrote: ... would it be possible to create some kind of simple vga-driver for the MEGA88 in a way that you can set some graphic elements on the screen using a I²C or RS232 interface?

What I would like to see is a lib for the MEGA8. We just flash it and can do the following for example:

- setPixel(x,y,color)

- setCircle(x,y,radius, color, bfill)

- setText(x,y,cString, color, ...)

- other handy stuff



Hi! The main problem with this approach is that the chip would have to keep track of a frame buffer. 1 kB of RAM is not a lot. Even if we opt for a simple black and white bitmap, there would only be room for 128 x 64 pixels. One alternative would be to use a tiled display, but without external RAM it would still be very limited.



Once we start using external RAM, we can do lots of things, and that area has been explored by others in several projects. Hi! The main problem with this approach is that the chip would have to keep track of a frame buffer. 1 kB of RAM is not a lot. Even if we opt for a simple black and white bitmap, there would only be room for 128 x 64 pixels. One alternative would be to use a tiled display, but without external RAM it would still be very limited.Once we start using external RAM, we can do lots of things, and that area has been explored by others in several projects.

Anonymous

Fri 29-Jul-2011 03:45 Thats astonishing work - cool music too!

Anonymous

Sat 31-Dec-2011 11:33 nihao! I'm a student from china.I am very interested in your work.Can you give me more details about all Data or the Electronic Components List,thank you this is my

gmail wkp1517@gmail.com. Thank you!!! >_<

Anonymous

Wed 4-Jan-2012 19:28 btw, i don't know if you know Uzebox, and what is your oppinion about this - http://uzebox.org - is this interesting enough for you coding something there as well?

tesla1980

Thomas

Thu 12-Jan-2012 12:20 Hello, i also build your craft before 3 Years now. Its just amazing. I have one problem : at the end its over and i wish to loop the programm , but i have no idea how to change the code and to compile it. Can you make this 4 me, please and send me via Email !?

Anonymous

Sat 11-Feb-2012 16:07 Wonderful project!

When did you do electronically?

Anonymous

Sun 12-Feb-2012 13:21 some 1 on mirc posted this today.. and I its so very AWESOME!!!!

this from 1 microcontroller. I feel tempted to just rebuild this as a standalone hehe

Did ya ever make more demo's on this hardware?

tesla1980

Thomas

Sun 12-Feb-2012 22:35 Please help me ! Can anyone tell me how to change the c - code to make that the whole program loops itself ? Where i must change the code. I`m absolutely a c-code noop - i have no idea ! PLZ HELP ME !

Anonymous

Tue 13-Mar-2012 13:40 tesla1980 wrote: Please help me ! Can anyone tell me how to change the c - code to make that the whole program loops itself ? Where i must change the code. I`m absolutely a c-code noop - i have no idea ! PLZ HELP ME ! Please help me ! Can anyone tell me how to change the c - code to make that the whole program loops itself ? Where i must change the code. I`m absolutely a c-code noop - i have no idea ! PLZ HELP ME !

#include <stdio.h>



int main() {

printf("This text will be looped");

main();

} #include int main() {printf("This text will be looped");main();

Anonymous

Wed 21-Mar-2012 23:40

#include <stdio.h>



int main() {

printf("This text will be looped");

main();

}

Uuh, that's a really bad idea.. Uuh, that's a really bad idea..

Anonymous

Mon 9-Apr-2012 23:09 tesla1980 wrote: Can anyone tell me how to change the c - code to make that the whole program loops itself ? I`m absolutely a c-code noop! Can anyone tell me how to change the c - code to make that the whole program loops itself ? I`m absolutely a c-code noop!

There is absolutely no C-code in Craft. It's pure assembly language.



Try having a look at mainloop.S, there's a label called "mainloop", which is the central loop.

Now, to understand the code, you need to know a few things...



Registers:

r0,r1,r2,r3....r30,r31 are all registers. A register on the AVR contains a value between 0 and 255.

x, y, z:

x register is two registers, r26:r27 combined

y register is two registers, r28:r29 combined

z register is two registers, r30:r31 combined, and is the only register that can be used with LPM



Instructions:

lpm,lds,ldi: these are LoaD instructions. LPM=Load from Program Memory, LDS=LoaD from SRAM, LDI=LoaD Immediate value

ST=STore

STS=STore in SRAM

CP,CPC=ComPare,ComPare with Carry

BRxx=BRanch if condition xx. xx could be for instance CS (Carry Set), NE (Not Equal), EQ (EQual), CC (Carry Clear) and a few more.

RCALL=call some subroutine

RET=RETurn (from a subroutine)

JMP=JuMP to address

RJMP=Relative JuMP

IJMP=Indirect JuMP (jumps to the value of the Z-register, which is two registers, r30:r31 combined)

LSL=Logically Shift Left

LSR=Logically Shift Right

CBI=Clear Bit

SBI=Set Bit

AND=logical AND

OR=logical OR

EOR=logical Exclusive OR

ADD=ADD two registers

ADDI=ADD Immediate value to register

ADC=ADd with Carry

SUB=SUBtract two registers

SBC=SuBtract with Carry

SUBI=SUBtract Immediate value from register

OUT=change the value of a port

IN=read the value of a port



Only one instruction is allowed per line, execution is top->down.



Here's your job now: Go and figure out what's going on in the program. :)

If there are instructions, that I did not mention, you can search the Web.

You may find help in the full datasheet for the ATmega8, the datasheet can be downloaded from Atmel.com (remember: There are two versions, a short and a full, download the full version) There is absolutely no C-code in Craft. It's pure assembly language.Try having a look at mainloop.S, there's a label called "mainloop", which is the central loop.Now, to understand the code, you need to know a few things...Registers:r0,r1,r2,r3....r30,r31 are all registers. A register on the AVR contains a value between 0 and 255.x, y, z:x register is two registers, r26:r27 combinedy register is two registers, r28:r29 combinedz register is two registers, r30:r31 combined, and is the only register that can be used with LPMInstructions:lpm,lds,ldi: these are LoaD instructions. LPM=Load from Program Memory, LDS=LoaD from SRAM, LDI=LoaD Immediate valueST=SToreSTS=STore in SRAMCP,CPC=ComPare,ComPare with CarryBRxx=BRanch if condition xx. xx could be for instance CS (Carry Set), NE (Not Equal), EQ (EQual), CC (Carry Clear) and a few more.RCALL=call some subroutineRET=RETurn (from a subroutine)JMP=JuMP to addressRJMP=Relative JuMPIJMP=Indirect JuMP (jumps to the value of the Z-register, which is two registers, r30:r31 combined)LSL=Logically Shift LeftLSR=Logically Shift RightCBI=Clear BitSBI=Set BitAND=logical ANDOR=logical OREOR=logical Exclusive ORADD=ADD two registersADDI=ADD Immediate value to registerADC=ADd with CarrySUB=SUBtract two registersSBC=SuBtract with CarrySUBI=SUBtract Immediate value from registerOUT=change the value of a portIN=read the value of a portOnly one instruction is allowed per line, execution is top->down.Here's your job now: Go and figure out what's going on in the program. :)If there are instructions, that I did not mention, you can search the Web.You may find help in the full datasheet for the ATmega8, the datasheet can be downloaded from Atmel.com (remember: There are two versions, a short and a full, download the full version)

Anonymous

Tue 24-Apr-2012 06:57 I don't know how to use mkstory.c

So,lol,Help!SOS!

Thhhhhhhhhhhank you!

^ ^

Anonymous

Thu 21-Jun-2012 00:40 http://www.gammon.com.au/forum/?id=11608

Anonymous

Tue 4-Sep-2012 00:16 Is it possible to replace the 442 resistors with a more common value like 390 or 470?

mporshnev

Max Porshnev

Mon 19-Nov-2012 11:41 tesla1980 wrote: Please help me ! Can anyone tell me how to change the c - code to make that the whole program loops itself ? Where i must change the code. I`m absolutely a c-code noop - i have no idea ! PLZ HELP ME ! Please help me ! Can anyone tell me how to change the c - code to make that the whole program loops itself ? Where i must change the code. I`m absolutely a c-code noop - i have no idea ! PLZ HELP ME !



Is it possible to replace the 442 resistors with a more common value like 390 or 470? Yes. Look at http://en.wikipedia.org/wiki/Resistor_ladder Keep in mind that DAC's output impedance should be low enough to drive 75 ohm load, that is the monitor input impedance. But not too low because microcontroller leg can't give much current. I think it should be possible to modify firmware hex file and make it use microcontroller's watchdog after the main program end. The watchdog will restart the whole microcontroller. Or use more stupid way: pull reset low with an external hardware thing. :)Yes. Look at http://en.wikipedia.org/wiki/Resistor_ladder Keep in mind that DAC's output impedance should be low enough to drive 75 ohm load, that is the monitor input impedance. But not too low because microcontroller leg can't give much current.

Anonymous

Sun 6-Jan-2013 07:05 Looking forward to your next project, whatever it may be!

Have you dug into the XMega yet? It has serious juice and can overclock up to 64MHz easily.

I did a bitbanged NTSC color and sound system all in software using an XMega384...



https://www.youtube.com/watch?v=CXFOTpM2Jn4



XMega must be the greatest 8 bit micro yet!



Cheers,

Brad

Anonymous

Thu 28-Mar-2013 08:05 Good Job............

Anonymous

Fri 29-Mar-2013 22:41 Awesome demo!

I saw your code. Mega respect!

Anonymous

Sat 8-Jun-2013 05:44 Ironic how a famous musician did something nearly identical to this years ago.



Also something even more intriguing is that his name was displayed on the screen as well!



I'm glad that acid head is still getting his "wobbly legs" and licking windows.



Hail the Analord!

Anonymous

Sat 8-Jun-2013 05:45 Ironic how a famous musician did something nearly identical to this years ago.



Also something even more intriguing is that his name was displayed on the screen as well!



I'm glad that acid head is still getting his "wobbly legs" and licking windows.



Hail the Analord!

Anonymous

Tue 11-Jun-2013 07:09 Looking forward to your next project, whatever it may be!

Have you dug into the XMega yet? It has serious juice and can overclock up to 64MHz easily.

I did a bitbanged NTSC color and sound system all in software using an XMega384...



https://www.youtube.com/watch?v=CXFOTpM2Jn4



XMega must be the greatest 8 bit micro yet!



Cheers,

Brad



Please release your source i lové your work

I h Please release your source i lové your workI h

Anonymous

Sun 16-Jun-2013 12:18 I really want to buy You an Amiga 500, i'm sure that U can make a PS3 emulator on it! GENIUS!

gazliddon

Gaz Liddon

Fri 6-Sep-2013 15:26 Hiya :D



Big thank you this, I'm now taking faltering steps playing with microcontrollers and digital electronics because of the great write up you posted here :D



I have a question, not sure if you read this and answer them but:



What are you using timer B for? In boot.s It -looks- like it would act like a reset and looks like if enabled it'll trigger every 72 * 8 cycles (just over a lines worth). I'm new to this so couldn't figure our exactly what you're doing :D Were you using it as a watchdog during dev?



Ones again many thanks for making a project so inspirational to me :D

Anonymous

Sun 20-Oct-2013 12:28 Ultimate seriously i also gonna do this one.

Anonymous

Mon 16-Nov-2015 03:34 Aw this is in assembly (I have done assembly before, it's just gonna take a while for me to understand your code) any way it's awesome!

I am experimenting with a r2r dac myself with a atmega16. and trying to make a synth :).

AstronBnX

Reha Bicer

Sun 3-Jan-2016 16:55 You are crayz! This is awesome!

Anonymous

Mon 4-Jan-2016 22:12 "One display line takes 24 μs, and is followed by a 7.75 μs break called the horizontal blanking period"



I am confused here - every place i read about 640x480@60hz VGA timings, the display line takes 25.17 us, the front porch 0.94us - the actual sync itself (pin down) is 3.77us and the remaining back porch, 1,89 us. Im pressuming you are aiming at the standard 25.175 mhz ?



Also, in your code you are correcting for some jitter or missing timing-precision - is this because you use prescaling ?

lft

Linus Åkesson

Tue 5-Jan-2016 22:04 "One display line takes 24 μs, and is followed by a 7.75 μs break called the horizontal blanking period"



I am confused here - every place i read about 640x480@60hz VGA timings, the display line takes 25.17 us, the front porch 0.94us - the actual sync itself (pin down) is 3.77us and the remaining back porch, 1,89 us. Im pressuming you are aiming at the standard 25.175 mhz ?

Yeah, the standard allows for some deviation, so I picked some values that worked. Summing the values above, you get 31.77 μs for a standards-compliant scanline, but 31.75 μs in my implementation. At 20 MHz, each clock cycle is 0.05 μs, so it would not be possible to achieve 31.77 μs.



Also, in your code you are correcting for some jitter or missing timing-precision - is this because you use prescaling ?

The jitter correction is necessary because even though the interrupts fire at just the right moment, the CPU will complete the currently executing instruction before jumping to the interrupt handler. AVR instructions are 1, 2 or 3 cycles (and reading from EEPROM will hold off interrupts for 4 cycles). Yeah, the standard allows for some deviation, so I picked some values that worked. Summing the values above, you get 31.77 μs for a standards-compliant scanline, but 31.75 μs in my implementation. At 20 MHz, each clock cycle is 0.05 μs, so it would not be possible to achieve 31.77 μs.The jitter correction is necessary because even though the interrupts fire at just the right moment, the CPU will complete the currently executing instruction before jumping to the interrupt handler. AVR instructions are 1, 2 or 3 cycles (and reading from EEPROM will hold off interrupts for 4 cycles).

Anonymous

Mon 28-Mar-2016 16:36 Hi!

Looking at the ASCII-drawing compared to the images of the craft, I see only 1 10uF capacitor, but there are two (seemingly) identical capacitors on the images of the 'real' craft?

I'm attempting to build one of these beauties, so I need to figure out what parts I need :-)

Amazing work, btw!

lft

Linus Åkesson

Wed 30-Mar-2016 00:44 Hi!

Looking at the ASCII-drawing compared to the images of the craft, I see only 1 10uF capacitor, but there are two (seemingly) identical capacitors on the images of the 'real' craft?

I'm attempting to build one of these beauties, so I need to figure out what parts I need :-)

Amazing work, btw!

You are right; I have forgotten to include the decoupling capacitor to the schematic. It's a 10 uF electrolytic that connects to Vcc on the plus side, and Gnd on the minus side. Its purpose is to stabilise the power supply against transients in the demand. You are right; I have forgotten to include the decoupling capacitor to the schematic. It's a 10 uF electrolytic that connects to Vcc on the plus side, and Gnd on the minus side. Its purpose is to stabilise the power supply against transients in the demand.

Anonymous

Wed 18-May-2016 21:31 Great stuff. Is the music inspired by the NES game Great Battle Cyber by chance?



https://youtu.be/c4DS-8IRLls?t=145

Seyedof

Ali Seyedof

Fri 3-Jun-2016 00:52 lft wrote: Hi, i have a little problem here with craft. some colours doesn't seem to be the correct ones, cyan is missing in the plasma (showing another shade of blue instead) or the first tunnel isn't coloured red and white (it's purple and violet) for an example. any idea? i checked the hardware a few times and it looks ok.

Did you connect AVcc? In the original design, AVcc was left floating (by mistake), and this probably affects the amount of current that can be sourced from PORTC. Otherwise I really don't know. Did you connect AVcc? In the original design, AVcc was left floating (by mistake), and this probably affects the amount of current that can be sourced from PORTC. Otherwise I really don't know.

Is AVcc mandatory while you are using PORTC for digital IO, not the ADC functionality? I guess AVcc is needed for A/D conversion and you don't need them while using PORTC as digital IO (which is the case with your impressive demo).

I'm trying to implement your demo on ATtiny13 as an even cheaper version, but with less color depth and no music:)

Great work dude Is AVcc mandatory while you are using PORTC for digital IO, not the ADC functionality? I guess AVcc is needed for A/D conversion and you don't need them while using PORTC as digital IO (which is the case with your impressive demo).I'm trying to implement your demo on ATtiny13 as an even cheaper version, but with less color depth and no music:)Great work dude

Anonymous

Mon 14-Aug-2017 10:43 I've seen craft for the first time. With mouth open I thougth: unbelievable !



JJ

Anonymous

Fri 1-Jun-2018 18:43 Is the music tracked?

Is it possible to rip it like a .mod or .ay music module?

Anonymous

Sat 4-May-2019 21:39 This microcomputer is so famous that it's emulated on MAME ( emulator that is mostly known for arcade emulation)

Anonymous

Mon 13-May-2019 20:19 This is absolutely the most impressive thing I've seen done with this type of micro controller. You have my respect good Sir!

Minecrafter

Wed 14-Aug-2019 16:39 Linus, can you make a standalone emulator of your various demos like Craft?

Minecrafter

Wed 14-Aug-2019 16:40 Minecrafter wrote: Linus, can you make a standalone emulator of your various demos like Craft? Linus, can you make a standalone emulator of your various demos like Craft? I meant an emulator for your various demos like Craft

Anonymous

Thu 29-Aug-2019 16:59 how do you made it?

Anonymous

Tue 12-Nov-2019 17:58 noorsun0035:



I see this project. i search a video generator with avr.

this is very nice.

but do this protect data is update?

the pic and schematic is low quality.

Unilein

Martin

Thu 20-Feb-2020 21:31 Really a great project! I am very impressed! I m going to build your demo just for fun. But it is really hard to get the DIP28 version of the Atmega88/20 MHz.



Could you compile your Version for the Atmega168 or the Atmega328? Until now I was not able to compile your code with the software I use (AVR Studio 7)



Thx & Greetz

Uni