[abc80] koppla ABC80 till PIC32:an

juhasz at abc.se juhasz at abc.se
Mon Aug 30 10:41:07 PDT 2010


Hej på er!

En liten rapport från mina försök att koppla in PIC32-kortet direkt på
ABC-bussen.

Jag gjorde som hpa föreslagit och kopplade två io-ledningar (INP1 och
OUT2) till PIC32:ans PORTB (RB0 och RB1) och dataporten till PORTE (då
tillkommer bara två sladdar till PMP-interfacet på port 0). PORTB
innehåller nämligen CN (change-notification)-pinnar som kan ge en
interrupt vid hög eller låg transition...

Det funkar - nästan!

kör jag OUT2,xx kan jag mycket riktigt läsa byten xx på PORTE. Detta
funkade redan från början trots att jag la in lite rutiner som läste av
vilken CN-pinne som var dragen och testade att det var OUT2-pinnen. Så
långt bra.

INP1 var lite knivigare: Interrupten kommer som den ska och jag kan testa
att det är INP1 som dragits. MEN jag har problem med att skriva till
databussen. Har både testat att temporärt göra om PORTE till output i
rutinen och att sätta PORTE som open drain (då behöver värdet bara vara
255 för att den ska funka som inport). Det senare verkar funka bäst men
jag kan bara få över ett värde till ABC:n om jag skriver direkt till PORTE
utan att göra något annat.

Detta är lite märkligt eftersom det verkar finnas gott om tid att läsa
från ABC:n. Och så länge ligger väl inte dataledningarna kvar efter att
IO-cykeln är klar???? Källkoden bifogas nedan....

Som ni ser skriver jag olika värden i följd direkt när interruptrutinen
börjar för att se vilket ABC:n tar. Den tar alltid det första... sen
längre ner testar jag vilken ioledning som dragits och skall egentligen
hoppa till två olika rutiner beroende på om det är IN1 elller OUT2. OUT2
funkar som sagt fint trots att det händer en del grejer innan vi läser
port E.

Det blir nog till att mixtra med RDY-pinnen...

Skall också göra ett schema med utförligare beskrivning snart....

Robert




void __ISR(_CHANGE_NOTICE_VECTOR, ipl2) ChangeNotice_Handler(void)
{
    unsigned int temp,data;
	PORTE=55;
	PORTE=66;
	PORTE=77;
    // clear the mismatch condition
    temp = mPORTBRead();

	if (!(temp & 1)) //IN1
	{

	mPORTEWrite(34); // output a " character
	while (!mPORTBReadBits(BIT_0)); // wait until read op finishes


	mPORTFToggleBits(BIT_1);
	putsUART2("\n CN2/IN1: ");
	putsUART2("\n\r");
	}

	 if ((temp & 2)==0) //OUT2
	{
	data=mPORTERead();
	mPORTFToggleBits(BIT_1);
	putsUART2("\n CN3/OUT2: ");
	putcUART2(data & 255);
	putsUART2("\n\r");
	}

    // clear the interrupt flag
    mCNClearIntFlag();
	mPORTEWrite(255);



}



More information about the ABC80 mailing list