Debugga i mikroprocessorer
Postat: 18 mars 2008, 18:32:48
Jag tycker mig se ett visst behov av att berätta hur man kan debugga i en µC utan så mycket utrustning.
Jag brukar se till att ha 1 eller 2 pinnar i reserv med testpunkter på ett kretskort, dessa använder jag till debuggning.
Nu kommer problemet: HUR ska man använda dom?
Svaret är att det beror på vad man har av utrustning. Man kan komma långt med en simpel LED då problemet ofta är "händer det att den kommer hit i programmet?" och då kan man nolla LED-pinnen vid programstart och peta in en instruktion som slår på LED'n när den kommer dit man vill veta.
Tänds den... då kom programmet dit.
Om man tror att den fastnar i en loop: slå på vid loop-starten och av vid loop-slut, blinkar den till lite då och då, går den in och ur men lyser den kontinuerligt "fullt" har den fastnat.
Detta kan man göra med 2 LED till att testa olika delar, i min erfarenhet kan man komma mycket långt på det vis.
Finns det en UART i kretsen? Kanon! Då kan man ställa rätt den och har en MAX232 liggande som är färdigkopplat, bara att plugga in +5V, GND samt seriesignalen.
Starta ett terminalprogram och lämpliga ställen i programmet som man vill "markera" begär man med en liten kodsnutt att den ska vänta på att UART'en kan sända (ifall något annat är på väg ut) och sedan skickar man ett tecken ('A', 'B'...) som ett tecken på att programmet passerade.
Detta stjäl minimalt med hastighet om man ser till att skriva ut så lite som möjligt.
Om man då har ett oscilloskop är det än bättre: Löd fast ett litet ögla på ett eller fler testpunkter, då kan man se dels i vilken sekvens som saker händer och dels vilka saker som sker:
Punkt #1: skicka en '1' och sedan en '0'
Punkt #2: skicka en '1' och sedan en '0', sedan en '1' och sist en '0'
osv.
Ha inte gärna mer än 5 pulser då det kan bli svårt att se direkt hur många pulser det finns, 5 är det värde man kan se med ett snabbt titt.
På det vis kan man se vilket punkt som programmet är på. Jag brukar använda det ena testpunkt till att markera start på main-loop (som man ju oftast har) och det andra till att markera de olika delar.
När man sedan har fått systemet att komma igång kan man utöka serieporten, om en beräkning blir fel kan man tvinga utförandet av beräkning och skriva ut alla mellanresultat i klartext på serieporten, på det vis kan man fånga många fel och konstigheter.
Om man har problem med att fler saker går fel eller att man misstänka att det är så kan det löna sig att kommentera bort kod som inte är essentiell. Det kan t.ex. röra sig om en timer-interrupt som kan haka upp sig.
Kommentera då bort det som inte är essentiellt för interruptdelen och tänd och släck en testpinne, om den växlar händer interrupten, om den lyser fullt eller är svart kontinuerligt sker det inte eller den har hängt sig.
Man kan även mäta spänningen på dessa testpunkter om det är snabba signaler, om vi utgår ifrån ett 5V system betyder en mätt DC-spänning på 2,5V att pinnen har en dutycycle på ca: 50%.
Så man kan komma långt med en LED, har man ett multimeter kan man kolla lite mer och med ett oscilloskop är det kanon.
Visst kan man använda en LSA (Logic State Analyzer, logikanalysator) men min erfarenhet är att det sällan är så allvarliga problem att det är aktuellt.
Jag brukar se till att ha 1 eller 2 pinnar i reserv med testpunkter på ett kretskort, dessa använder jag till debuggning.
Nu kommer problemet: HUR ska man använda dom?
Svaret är att det beror på vad man har av utrustning. Man kan komma långt med en simpel LED då problemet ofta är "händer det att den kommer hit i programmet?" och då kan man nolla LED-pinnen vid programstart och peta in en instruktion som slår på LED'n när den kommer dit man vill veta.
Tänds den... då kom programmet dit.
Om man tror att den fastnar i en loop: slå på vid loop-starten och av vid loop-slut, blinkar den till lite då och då, går den in och ur men lyser den kontinuerligt "fullt" har den fastnat.
Detta kan man göra med 2 LED till att testa olika delar, i min erfarenhet kan man komma mycket långt på det vis.
Finns det en UART i kretsen? Kanon! Då kan man ställa rätt den och har en MAX232 liggande som är färdigkopplat, bara att plugga in +5V, GND samt seriesignalen.
Starta ett terminalprogram och lämpliga ställen i programmet som man vill "markera" begär man med en liten kodsnutt att den ska vänta på att UART'en kan sända (ifall något annat är på väg ut) och sedan skickar man ett tecken ('A', 'B'...) som ett tecken på att programmet passerade.
Detta stjäl minimalt med hastighet om man ser till att skriva ut så lite som möjligt.
Om man då har ett oscilloskop är det än bättre: Löd fast ett litet ögla på ett eller fler testpunkter, då kan man se dels i vilken sekvens som saker händer och dels vilka saker som sker:
Punkt #1: skicka en '1' och sedan en '0'
Punkt #2: skicka en '1' och sedan en '0', sedan en '1' och sist en '0'
osv.
Ha inte gärna mer än 5 pulser då det kan bli svårt att se direkt hur många pulser det finns, 5 är det värde man kan se med ett snabbt titt.
På det vis kan man se vilket punkt som programmet är på. Jag brukar använda det ena testpunkt till att markera start på main-loop (som man ju oftast har) och det andra till att markera de olika delar.
När man sedan har fått systemet att komma igång kan man utöka serieporten, om en beräkning blir fel kan man tvinga utförandet av beräkning och skriva ut alla mellanresultat i klartext på serieporten, på det vis kan man fånga många fel och konstigheter.
Om man har problem med att fler saker går fel eller att man misstänka att det är så kan det löna sig att kommentera bort kod som inte är essentiell. Det kan t.ex. röra sig om en timer-interrupt som kan haka upp sig.
Kommentera då bort det som inte är essentiellt för interruptdelen och tänd och släck en testpinne, om den växlar händer interrupten, om den lyser fullt eller är svart kontinuerligt sker det inte eller den har hängt sig.
Man kan även mäta spänningen på dessa testpunkter om det är snabba signaler, om vi utgår ifrån ett 5V system betyder en mätt DC-spänning på 2,5V att pinnen har en dutycycle på ca: 50%.
Så man kan komma långt med en LED, har man ett multimeter kan man kolla lite mer och med ett oscilloskop är det kanon.
Visst kan man använda en LSA (Logic State Analyzer, logikanalysator) men min erfarenhet är att det sällan är så allvarliga problem att det är aktuellt.