6502.org Forum  Projects  Code  Documents  Tools  Forum
It is currently Thu Apr 25, 2024 5:44 pm

All times are UTC




Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 55 posts ]  Go to page Previous  1, 2, 3, 4
Author Message
 Post subject: [85.54] Tip of the day
PostPosted: Mon Jan 28, 2002 5:07 am 
Offline
User avatar

Joined: Fri Aug 30, 2002 1:09 am
Posts: 8427
Location: Southern California
Tip of the day, #41: Getting started

Many times recently someone new has posted a "Help!" message and say they have an assignment or want to learn the 6502 by doing a project and don't know how to begin.  It has been hard to help them when they can't spell out exactly what they want to do and don't know enough to ask the right questions.

Although this is not the place for a hardware or software beginning tutorial, I can suggest a general development plan to get rid of some of that unsettling feeling of unfamiliarity.  Here's the order you will normally follow on a project:

A. Decide what you want the computer to do, and what I/O, memory, etc. will be needed.

B. Build the necessary hardware.

C. Get the hardware going. (tips #35 and 36)

D. Write routines to set up the I/O.

E. With rudimentary I/O routines working, begin the actual application program.

F. As the program develops, watch for ways you can simplify.

Missing D is probably one of the beginner's biggest road blocks, as he is probably thinking that after the more obvious A and B, you just start working on your application program (E).  Where do you start?  How do you know if anything at all is working?  Intuition itself hints that something is wrong with this idea; but without knowing what, the person is stopped before there's measurable progress.  Even if hardware debugging were unnecessary, the order here is part of the building-block approach.  It comes from lots of experience.

That is not to say there's no room for a top-down approach.  Indeed even in A you start at the top with your dreams—the end goal; but the realization will mostly come about as you build tiny components, get them working, and put them together to make bigger components.  As you move on, you no longer concern yourself with the internal details of the smaller parts.  The process continues until you have the completed system with all its parts quietly doing their jobs.

Previous tips will help at various stages.  Each step above does not necessarily need to be 100% finished before starting the next.  For example, C and D have to be done at least partly concurrently since you will need to write a little bit of code to operate at least some part of the output, minimal as it may be, for verifying the hardware.

As you progress through E, I/O software can be expanded, and you will no doubt also be adding things to the reset routine for initializing variables or other software resources.

F should be started early, soon after E is started.  The beginner may see it as time wasted for the sake of unnecessary neatness; but in the end it will prove invaluable.  F may include use of subroutines, macros, or re-arranging so certain parts become unnecessary and can be eliminated.  It's like factoring things out of an equation to simplify it or reduce it to lowest terms.  Document everything as you go!!  You'll get yourself in trouble if you leave that for last.  By maximizing structure, documentation, and simplicity, you will be able to keep control of the project and maintain it.  Otherwise there will be so many things you don't remember how you did that you can't unravel it to get control back, do updates later, or fix a routine with a bug that didn't show up until long after you wrote it.

I may be editing this depending on others' feedback as well as other things that come to mind.

_________________
http://WilsonMinesCo.com/ lots of 6502 resources
The "second front page" is http://wilsonminesco.com/links.html .
What's an additional VIA among friends, anyhow?


Last edited by GARTHWILSON on Wed Feb 22, 2012 9:27 am, edited 1 time in total.

Report this post
Top
 Profile  
Reply with quote  
 Post subject: [85.55] Tip of the day
PostPosted: Sun May 26, 2002 6:11 am 
Offline
User avatar

Joined: Fri Aug 30, 2002 1:09 am
Posts: 8427
Location: Southern California
Tip of the day, #42: Ghost interrupts

Tonight I had some puzzling "ghost" interrupts.  My 65c02 workbench computer's Forth interrupt handler was going through the list of installed interrupt-service routines (ISRs) and none of them claimed responsibility to take care of the interrupt.  The error message was "missing ISR".  What's going on?  I wrote and installed an ISR with the lowest possible priority so it would get executed only if the higher-priority ones failed to service the interrupt.  Instead of servicing a mysterious interrupt, this low-priority ISR's job was to look at the status registers and interrupt-enable registers of everything that had the ability to produce an interrupt.  It too said everything was clean.

The project used an interrupt every 20 microseconds (a rate of 50,000 per second) from a 65c22 VIA's timer, and the program running in the foreground turned the interrupting off and on several times per second, producing one-tenth-second bursts of interrupts.  What was happening was that sometimes the VIA would pull the IRQ line down during the instruction that was telling the VIA to disable that interrupt.  The line came down quickly, but the pull-up resistor takes a few clock cycles to get the line back up to a logic 1 again.  (See tip #2.)  The processor responded to the interrupt and took the vector; but by the time the first ISR could check to see if it was this VIA that caused the interrupt, the VIA's interrupt flag register said "None here!"-- like ringing the doorbell and running.

Attachment:
cartoon_5.gif
cartoon_5.gif [ 40.75 KiB | Viewed 1264 times ]

My immediate solution was to make the ISR sequence assume that a "ghost" interrupt like this came from the source that was just disabled.  In other words, for a few microseconds after the interrupt source is disabled, it's ok to exit the ISR sequence without action when no cause of interrupt was found.  Another possibility would be to do SEI, then disable the VIA's interrupt, then do CLI again after a safe amount of time.  After some discussion on the Yahoo 6502 forum, I believe this SEI/CLI method is best.  You may need to save the information as to whether the processor was accepting interrupts right before the SEI, so you don't CLI if it was temporarily inappropriate.  Another method suggested, which I see problems with for certain scenarios, is that the main routine just use a semaphore to tell the ISR to disable the source of the interrupt the next time the interrupt occurs.  This would probably be more useful in true multitasking, which I was not doing.  (Multitasking, by the way, is quite doable in Forth on a 6502, with minimal overhead.)

The fact that the ghost interrupt problem could occur is something simple I should have thought of long ago, but previous projects never had me disabling interrupts several times per second during a fast stream.  The less-than-handful of times it happened, it just seemed like a freak thing that was not repeatable, and it wasn't worth my time to hunt it down.

WDC's VIAs' IRQ outputs are not wire-ORable open-drain outputs, so they may produce less trouble of this kind.

Garth



I will keep improving these existing tips; but for further tips and more info on the ones above, see my 6502 primer.  The "circuit potpourri" page (which I keep adding things to) has so far, including diagrams and links to code to run them:
  • a very basic whole-computer schematic
  • Using the 6522's shift register for tons of output bits
  • Using the 6522's shift register for tons of input bits
  • Using the 6522's shift register for both input and output
  • SS22: Using the 6522's shift register for a link between computers
  • Converting to and from higher-voltage logic
  • driving relays from logic-level signals
  • High-voltage shift registers
  • Interfacing to I²C
  • Interfacing to SPI and Microwire
  • Keypads and keyboards
  • Displays
  • Printers
  • Digital-to-analog (D/A) converters, or DACs
  • Digital potentiometer
  • Analog-to-digital (A/D) converters, or ADCs
  • A note about A/D and D/A jitter (and other performance considerations)
  • Jeff Laughton's circuit tricks, for ultra-fast I/O (single-cycle!), and re-mapping op codes
  • Non-typical power-supply circuits run by the 6522 and digital components
(and I intend to add some analog supporting circuits)

_________________
http://WilsonMinesCo.com/ lots of 6502 resources
The "second front page" is http://wilsonminesco.com/links.html .
What's an additional VIA among friends, anyhow?


Report this post
Top
 Profile  
Reply with quote  
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 55 posts ]  Go to page Previous  1, 2, 3, 4

All times are UTC


Who is online

Users browsing this forum: No registered users and 4 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to: