AVR - Hibakeresés

2016-05-06

 

Gondoltam már korábban is, hogy írnom kellene az áramkörök hibakereséséről. Egyes emberek könyveket írtak az elektromos hibakeresésről, bár ezek nem nagyon használhatók. Nekem nincs annyi energiám, hogy szépen kereken leírjak mindent, mégis talán jobb, ha néhány dolgot leírok, mintha nem írnék semmit.

Másként lehet erősáramú hálózatokban, analóg áramkörökben, és digitális áramkörökben hibát keresni, de ez önkényes felosztása a témának. Itt most a digitális áramkörökre fókuszálok, sőt azon belűl is az AVR uC-t tartalmazókra. A tapasztalataim alapján, a digitális áramköröknél is több eset lehet, az áramkör és az diagnoszta ( de tetszik ez a szó!) viszonyát tekintve. A legrosszabb eset, amikor az ember kezébe nyomnak egy tök ismeretlen kütyüt, amihez természetesen nincs semmi doksi, azt sem tudjuk hogyan kellene működnie, de csináljuk meg. Sokkal jobb a helyzet, ha kapunk, vagy tudunk hozzá doksit szerezni. Ebben ma már nagyon sokat segít az Internet, meg a Google. Azután van az a helyzet, amikor gyártás során kell a terméket ellenőriznünk, illetve a hibás darabokat kijavítanunk. Ebben az esetben van doksink, leírásunk, mérési utasításunk, tudjuk, hogy működőképes a szerkezet, csak konkrétan a kezünkben lévő darabon van valami hiba, egy rossz alkatrész, egy hibás forrasztás. Az utólsó kategória pedig az, amikor fejlesztgetünk valamit. Ekkor nyilván bármi lehet. Az iskolában tanították, remélem még mindig tanítják, hogy az áramkörökbe eleve bele kell tervezni a hibakereséshez, ellenőrzéshez szükséges mérési pontokat. Saját fejlesztésnél az a jó, hogy tudunk készíteni az áramkörünkhöz tesztprogramokat.

Az Atmel AVR családnál rendelkezésünkre áll az Atmel Studio névre hallgató ingyen letölthető fejlesztő környezet. Ez azért jó, mert fejleszthetünk benne C-ben, C++-ban, Assembly-ben, sok kiegészítő elérhető hozzá, lehet vele in-circuit ( tehát már az áramkörbe beforrasztott uC-be) programot letölteni, azt debuggolhatjuk, a programunkat futtathatjuk lépésenként, miközben nézegethetjük a regisztereket, van benne szimulator is. Azért rossz, mert kell hozzá egy gyári programozó fej, egy környezetnek vannak megkötései, meg kell tanulni a használatát. Én meg lusta vagyok, ezért nem használom.

Így viszont, mivel alapban nincs visszajelzésem, lövésem sincs, hogy mi történik a uC-ben. A legegyszerűbb, ha egy port lábra ellenálláson keresztül egy LED-et kapcsolunk, amit a program megfelelő pontján be/ki tudunk kapcsolni. Én általában az egész fejlesztés alatt a uC-n hagyom ezt a LED-et. Az alábbi program egy LED-et 0, 5 sec-re bekapcsol, majd 0,5 sec-re kikapcsol, vagyis 1 sec lesz a periódus idő. Egyrész látjuk, hogy működik a uC, és 20-30 villanás idejét lemérve ellenőrizhetjük, hogy jól állítottuk-e be a sebességét, a fuse biteket? Én úgy tapasztaltam, hogy az AVR-ek beépített oszcillátora elég pontos, nyilván egy órához azért kvarc kell.


/*******************************************************************************
*   Author       -  Kiraly Tibor
*                   http://www.tkiraaly.hu
*   Date         -  2016.05.06.
*   Chip         -  Atmel AMega8
*   Compiler     -  avr-gcc ( WinAVR)
*
*   LED villogtatasa 1 Hz-cel
*   
*******************************************************************************/
#define F_CPU                4 MHZ


#include "tkiraaly_atmega8.h"
#include "tkiraaly_kpin.c"
#include <util/delay.h>


int main( void)
{
   U8 led= B_PORT_0;
   kpin_output( led);
   for(;;)
   {
      kpin_0( led);
      _delay_ms( 500);
      kpin_1( led);
      _delay_ms( 500);
   }
}

Késő este/éjszaka, ugráltak már a szemem előtt drótok, így jött az idea, és írtam egy kis segéd programot. A uC soros portjához kapcsolódunk a számítógépünkkel, egy terminál emulátoron keresztül vezéreljük azt. A portot a betüjével A..K tudjuk kijelölni, a bitjét pedig 0..7-tel. A kijelölt port lábra, vagy a megcélzott alkatrész lábára ellenálláson keresztül egy LED-et kötünk, és ha villog, akkor nyertünk.


/*******************************************************************************
*   Author       -  Kiraly Tibor
*                   http://www.tkiraaly.hu
*   Date         -  2016.05.06.
*   Chip         -  Atmel AMega8
*   Compiler     -  avr-gcc ( WinAVR)
*
*   AVR pin teszter (most konkretan ATmega8).
*   
*   A kivlasztott labat kimenetre allitja, es 0/1-be kapcsolgatja.
*   A labra ellenallason keresztul egy LED-et kotve ellenorizheto.
*   A soros vonalrol vezerelheto, nem figyeli, a megadott port/pin letezik-e,
*   ha nincs ilyen, nem fogja egyik labat sem kapcsolgatni.
*   A..K - a portot valasztja ki
*   0..7 - a bitet valasztja ki
*   
*******************************************************************************/
#define F_CPU                4 MHZ


#include "tkiraaly_atmega8.h"
#include "tkiraaly_kpin.c"
#include <util/delay.h>


volatile U8 pp=  0;                              // port/pin
volatile U8 c=   0;                              // vett betu

 
ISR( IT_USART_RXC)                               // USART megszakitas kezelese
{
   c= UDR;
   if ( c h>= '0' && c <= '7') pp= ( pp & 0xF0)+ c- '0';
   if ( c h>= 'A' && c <= 'K') pp= ( pp & 0x0F)+ (( c- 'A') << 4);
   if ( c h>= 'a' && c <= 'k') pp= ( pp & 0x0F)+ (( c- 'a') << 4);
}


int main( void)
{
   U8 p;
   USART_9600_8N1;
   IT_ENABLE;
   for(;;)
   {
      p= pp;                                     // a ciklus elejen frissit 
      kpin_output( p);
      kpin_0( p);
      _delay_ms( 200);
      kpin_1( p);
      _delay_ms( 200);
      kpin_input( p);
   }
}

Itt a vége, fuss el véle, legytek az én vendégeim, innen letölthetitek a teljes programokat, miegymást, összecsomagolva.