home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
World of A1200
/
World_Of_A1200.iso
/
programs
/
develop
/
galer
/
galer_deutsch
/
source
/
galersrcd.lha
/
GALerTest.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-03-27
|
12KB
|
536 lines
/****************************************************************/
/* */
/* Testprogramm für GAL-Brenner */
/* */
/* Soft- and Hardware copyright (c)1991 */
/* by Christian Habermann */
/* Asamstr. 17 */
/* 8050 Freising (W-Germany) */
/* */
/* cc -z4000 GALerTest.c */
/* as -n -c -d port.asm */
/* ln GALerTest.o port.o -lc */
/* */
/****************************************************************/
#include <exec/memory.h>
#include <exec/ports.h>
#include <exec/types.h>
#include <intuition/intuition.h>
#include <functions.h>
#include "GALer.h"
#define YPOS 30
void Clear();
void Print();
void WaitForAction();
struct MsgPort *timeport;
struct timerequest *timereq;
struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
struct IntuiMessage *message;
struct Window *window;
struct RastPort *rp;
struct TextFont *txtfont;
struct TextAttr txtattr;
SHORT BorderVectors1a[] = { 0,15,73,15,73,0 };
SHORT BorderVectors1b[] = { 0,15,0,0,73,0 };
struct Border Border1b = { -1,-1,2,0,JAM1,3,BorderVectors1b,NULL };
struct Border Border1a = { -1,-1,1,0,JAM1,3,BorderVectors1a,&Border1b };
struct IntuiText GadIText3 = { 1,0,JAM2,4,4,&txtattr,
(UBYTE *)" ENDE ",NULL };
struct IntuiText GadIText2 = { 1,0,JAM2,8,4,&txtattr,
(UBYTE *)"Abbruch",NULL };
struct IntuiText GadIText1 = { 1,0,JAM2,12,4,&txtattr,
(UBYTE *)"Weiter ",NULL };
struct Gadget CancelGad = { NULL, 530, 180, 72, 14,
NULL,
RELVERIFY,
BOOLGADGET+REQGADGET,
(APTR)&Border1a,NULL,
&GadIText2,NULL,NULL,1,NULL };
struct Gadget ContGad = { &CancelGad, 40, 180, 72, 14,
NULL,
RELVERIFY,
BOOLGADGET+REQGADGET,
(APTR)&Border1a,NULL,
&GadIText1,NULL,NULL,0,NULL };
struct NewWindow MyWin = { 0,0,640,200,
0,1,
CLOSEWINDOW|GADGETUP,
ACTIVATE|WINDOWCLOSE|WINDOWDRAG|WINDOWDEPTH,
&ContGad,NULL,
(UBYTE *)"GALerTest (c) 1993 by Christian Habermann",
NULL,NULL,
0,0,0,0,
WBENCHSCREEN
};
int prog_volt = 0; /*Dummy für das Modul "Port"*/
int ytxt = YPOS;
main()
{
int errorIC6, errorIC7;
int n;
openstuff();
if (GetTimer()) { /*Timer holen*/
puts("kann Timer nicht finden\n");
exit(FALSE);
}
rp = window -> RPort;
SetAPen(rp, 1L);
SetFont(rp, txtfont); /*Font für Textausgabe*/
InitParPort(); /*Datenrichtungsregister der CIAs*/
InitGALer();
Print("Testprogramm für die Hardware-Version 1.2 des GAL-Brenners");
Print("(Versionsnummer der Hardware siehe Schaltplan).");
Print("");
Print("Bitte messen Sie alle angegebenen Spannungen an der Textool-Fassung nach.");
Print("In dieser Fassung darf sich jetzt noch KEIN GAL befinden!!!");
Print("Sobald irgendwo ein Fehler auftritt, brechen Sie bitte das Programm");
Print("durch Anklicken von 'Abbruch' ab und beheben zuerst diesen Fehler.");
Print("");
Print("Bitte 'Weiter' anklicken, um den Test zu starten.");
WaitForAction(0);
Clear();
Print("Jetzt darf an keinem Pin der Textool-Fassung eine Spannung anliegen.");
Print("Außerdem soll die LED aus sein.");
Print("");
Print("Bitte 'Weiter' anklicken!");
EnableOutput();
WriteByte(0x00,IC3);
WriteByte(0x00,IC4);
WriteByte(0x00,IC5);
WaitForAction(0);
Clear();
Print("Jetzt soll die LED leuchten.");
Print("");
Print("Bitte 'Weiter' anklicken!");
LED(ON);
WaitForAction(0);
Clear();
Print("Jetzt soll die LED wieder aus sein.");
Print("");
Print("Bitte 'Weiter' anklicken!");
LED(OFF);
WaitForAction(0);
Clear();
Print("An Pin 24 sollten jetzt ca. +5V anliegen.");
Print("");
Print("Bitte 'Weiter' anklicken!");
SetGAL(GAL20V8);
EnableVcc();
WaitForAction(0);
Clear();
Print("An Pin 22 sollten jetzt ebenfalls ca. +5V anliegen.");
Print("");
Print("Bitte 'Weiter' anklicken!");
DisableVcc();
SetGAL(GAL16V8);
EnableVcc();
WaitForAction(0);
Clear();
Print("Jetzt sollte an allen Pins ca. +5V anliegen, außer an Pin 12.");
Print("");
Print("Bitte 'Weiter' anklicken!");
InitGALer();
EnableOutput();
WriteByte(0xff,IC3);
WriteByte(0xff,IC4);
WriteByte(0xff,IC5);
WaitForAction(0);
Clear();
Print("Jetzt sollte ab Pin 1 abwechselnd +5V,0V,+5V,0V usw. anliegen (ohne Pin 12).");
Print("");
Print("Bitte 'Weiter' anklicken!");
SetGAL(GAL20V8);
EnableVcc();
WriteByte(0x55,IC3);
WriteByte(0x55,IC4);
WriteByte(0x55,IC5);
WaitForAction(0);
Clear();
Print("Jetzt invertiert (ohne Pin 12).");
Print("");
Print("Bitte 'Weiter' anklicken!");
DisableVcc();
WriteByte(0xaa,IC3);
WriteByte(0xaa,IC4);
WriteByte(0xaa,IC5);
WaitForAction(0);
DisableVcc();
InitGALer();
EnableOutput();
VeditOn();
Clear();
Print("***************************************************************************");
Print("In den nachfolgenden Punkten werden die verschiedenen Programmierspannungen");
Print("eingestellt. Sollte das nicht funktionieren, dann ist wahrscheinlich in der");
Print("Umgebung von IC 9, IC 10, T3, T4 ein Fehler.");
Print("");
Print("Messen Sie jetzt am Pin 2 der Textool-Fassung die Spannung und stellen");
Print("Sie diese mit dem Poti R40 genau auf 16.5 Volt ein.");
Print("Bitte 'Weiter' anklicken!");
SetVolt(0);
SetGAL(GAL20V8);
EnableVEdit();
WaitForAction(0);
Print("");
Print("Messen Sie jetzt am Pin 2 der Textool-Fassung die Spannung und stellen");
Print("Sie diese mit dem Poti R41 genau auf 15.75 Volt ein.");
Print("Bitte 'Weiter' anklicken!");
SetVolt(1);
WaitForAction(0);
Print("");
Print("Messen Sie jetzt am Pin 2 der Textool-Fassung die Spannung und stellen");
Print("Sie diese mit dem Poti R42 genau auf 14.50 Volt ein.");
Print("Bitte 'Weiter' anklicken!");
SetVolt(2);
WaitForAction(0);
Print("");
Print("Messen Sie jetzt am Pin 2 der Textool-Fassung die Spannung und stellen");
Print("Sie diese mit dem Poti R43 genau auf 14.00 Volt ein.");
Print("Bitte 'Weiter' anklicken!");
SetVolt(3);
WaitForAction(0);
Print("");
Print("Messen Sie jetzt am Pin 2 der Textool-Fassung die Spannung und stellen");
Print("Sie diese mit dem Poti R44 genau auf 12.00 Volt ein.");
Print("Bitte 'Weiter' anklicken!");
SetVolt(4);
WaitForAction(0);
Print("");
Print("So, die Spannungen sind jetzt alle eingestellt.");
Print("Bitte 'Weiter' anklicken!");
Print("***************************************************************************");
WaitForAction(0);
Clear();
Print("Am Pin 2 sollten die 12.00 Volt wieder weg sein und dafür am Pin 4");
Print("anliegen. Wenn das nicht funktioniert, dann ist wahrscheinlich in der");
Print("Umgebung von T1, T2 ein Fehler.");
Print("");
Print("Bitte 'Weiter' anklicken!");
DisableVEdit();
SetGAL(GAL16V8);
EnableVEdit();
WaitForAction(0);
Clear();
/*ab hier wird überprüft, ob das Auslesen der*/
/*Ausgangspegel des GALs funktioniert (IC6a, IC7)*/
Print("überpüfe das Auslesen der Ausgangspegel von Pin 14-22 der");
Print("Textool-Fassung...");
SetGAL(GAL20V8);
InitGALer();
EnableVcc();
EnableOutput();
/*IC6a testen*/
errorIC6 = errorIC7 = 0;
WriteByte(0x40,IC3);
if (!ReadByte(IC6))
errorIC6 = 1;
WriteByte(0x00,IC3);
if (ReadByte(IC6))
errorIC6 = 1;
/*IC7 testen*/
WriteByte(0x00,IC5);
if (ReadByte(IC7))
errorIC7 = 1;
WriteByte(0x2A,IC3);
WriteByte(0x20,IC5);
if (ReadByte(IC7) != 0xAA)
errorIC7 = 1;
WriteByte(0x15,IC3);
WriteByte(0x10,IC5);
if (ReadByte(IC7) != 0x55)
errorIC7 = 1;
DisableVcc();
DisableOutput();
if (errorIC6 || errorIC7) {
Print(" FEHLER!!!");
Print(" Wenn sich bis jetzt 'GALer' fehlerfrei verhalten hat,");
Print(" dann überprüfen Sie bitte folgenden Bereich der Schaltung:");
Print(" BUSY-Leitung des Parallel-Ports, R27, Pins 1,2 von IC8, IC6a und");
Print(" IC6b, IC7 und R13. Irgendwo in diesem Bereich ist ein Fehler.");
Print(" Fehlerbeschreibung:");
if (errorIC6 && !errorIC7) {
Print(" Kann Pin 22 der Textool-Fassung nicht über die BUSY-Leitung des");
Print(" Parallel-Ports auslesen.");
}
if (!errorIC6 && errorIC7) {
Print(" Kann Pins 14-21 der Textool-Fassung nicht über die BUSY-Leitung des");
Print(" Parallel-Ports auslesen.");
}
if (errorIC6 && errorIC7) {
Print(" Kann Pins 14-21 und Pin 22 der Textool-Fassung nicht über die");
Print(" BUSY-Leitung des Parallel-Ports auslesen.");
}
Print("");
Print(" Falls bereits bei einem vorherigen Testpunkt eine Spannung nicht");
Print(" gestimmt hat, dann versuchen Sie bitte zuerst den obigen Fehler zu");
Print(" beseitigen.");
}
else {
Print(" alles o.k.");
Print("");
Print("Wenn alle Spannung korrekt waren und Sie alle Programmierspannungen");
Print("(12, 14, 14.5, 15.75 und 16.5 Volt) eingestellt haben, dann");
Print("funktioniert die Hardware sehr wahrscheinlich fehlerfrei.");
Print("Letzte Gewißheit bekommen Sie, indem Sie probeweise einige GALs");
Print("programmieren und anschließend austesten.");
}
CancelGad.GadgetText = &GadIText3;
OffGadget(&ContGad, window, NULL);
RefreshGList(&ContGad, window, NULL);
WaitForAction(0);
RestoreParPort();
FreeTimer();
closestuff();
}
GetTimer() /*Timer holen*/
{
timeport = CreatePort(0L,0L);
if (timeport == NULL)
return(-1);
timereq=(struct timerequest *)AllocMem(
(long)sizeof(struct timerequest),MEMF_PUBLIC);
if (timereq == NULL) {
DeletePort(timeport);
return(-1);
}
timereq->tr_node.io_Message.mn_Node.ln_Type=NT_MESSAGE;
timereq->tr_node.io_Message.mn_Node.ln_Pri=0;
timereq->tr_node.io_Message.mn_ReplyPort=timeport;
if (OpenDevice(TIMERNAME,UNIT_MICROHZ,timereq,0L)) {
FreeMem(&timereq,(long)sizeof(struct timerequest));
DeletePort(timeport);
return(-1);
}
return(0);
}
void FreeTimer() /*Timer wieder freigeben*/
{
CloseDevice(timereq);
FreeMem(timereq,(long)sizeof(struct timerequest));
DeletePort(timeport);
}
/*micro: microsec. to wait
secs: seconds to wait
*/
void WaitForTimer(micro)
ULONG micro;
{
timereq->tr_node.io_Command=TR_ADDREQUEST;
timereq->tr_time.tv_secs=0;
timereq->tr_time.tv_micro=micro;
DoIO(timereq);
}
void Clear()
{
ytxt = YPOS;
SetAPen(rp, 0L);
RectFill(rp, 10L, 22L, 630L, 170L);
SetAPen(rp, 1L);
}
void Print(text)
UBYTE *text;
{
if (ytxt < 160)
ytxt += 10;
else
ScrollRaster(rp,0L,10L,10L,22L,630L,170L);
Move(rp,20L,(long)ytxt);
Text(rp,text,(long)strlen(text));
}
/* wartet auf das Anklicken eines Gadgets
*/
void WaitForAction()
{
ULONG class;
USHORT code,gadID;
for(;;) {
Wait(1L<<window->UserPort->mp_SigBit);
if (message=(struct IntuiMessage *)GetMsg(window->UserPort)) {
class = message -> Class;
code = message -> Code;
if (class == GADGETUP)
gadID=((struct Gadget *)message->IAddress)->GadgetID;
ReplyMsg(message);
switch(class) {
case CLOSEWINDOW: closestuff(); /*Programm fluchtartig*/
FreeTimer(); /*verlassen*/
RestoreParPort();
exit(0);
break;
case GADGETUP: if (!gadID)
return;
else { /*Abbruch angeklickt*/
closestuff();
FreeTimer();
RestoreParPort();
exit (0);
}
break;
}
}
}
}
closestuff()
{
if (window) CloseWindow(window);
if (GfxBase) CloseLibrary(GfxBase);
if (IntuitionBase) CloseLibrary (IntuitionBase);
}
openstuff()
{
if ((IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",0L)) == NULL) {
puts ("kann intuition.library nicht öffnen");
exit(FALSE);
}
if ((GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0L)) == NULL) {
puts ("kann graphics.library nicht öffnen");
closestuff();
exit(FALSE);
}
txtattr.ta_Name = (STRPTR)"topaz.font"; /*Font holen*/
txtattr.ta_YSize = 8;
txtattr.ta_Style = 0;
txtattr.ta_Flags = 0;
if (!(txtfont = (struct TextFont *)OpenFont(&txtattr))) {
puts("kann topaz.font 8 nicht finden");
closestuff();
exit(FALSE);
}
if ((window = (struct Window *)OpenWindow(&MyWin)) == NULL) {
puts ("kann Fenster nicht öffnen");
closestuff();
exit(FALSE);
}
}