[abc80] koppla ABC80 till PIC32:an

juhasz at abc.se juhasz at abc.se
Mon Aug 30 13:53:09 PDT 2010


tack för tipset!

Ja, det blir väl till att lära sig MIPS-assembler... Jag ska kolla på
koden som genererar, men MPLAB gör allt för att gömma undan den!

Alternativt kan man lägga IN1 och IN0 direkt till interruptledningar (det
finns fem stycken på PIC32:an så det räcker precis inte till alla IN och
OUT) - då funkar det direkt i C...

Robert

> Hej!
>
> dsPIC33 har ett shadow RAM för att snabba upp context saving. Har PIC32
> det? Kolla vad kompilatorn producerar för assembler. Kanske den lägger in
> en massa push i början, och det tar 2 instruktionscykler per push. 250 ns
> är väl ungefär 20 instruktionscykler varav några går bort innan
> interruptet ens kommit igång. Eventuellt kan du skriva en interruptrutin i
> assembler istället. Om du har möjlighet i kompilatorn att reservera några
> register slipper du några push-pop och sparar därmed lite tid.
>
> Här är ett dsPIC33-exempel på assembler interrupt:
> deklarareras på vanligt sätt i header.
> extern void _T2Interrupt(void);
>
> Assemblern skrivs i en textfil med filändelsen ".s", tex "isrT2.s"
> --------------------------
>     .include p32xxxx.inc
>     .global __T2interrupt
>
> __T2Interrupt:
>  bclr T2CON, #TON
>  clr TMR2
>  push W0
>  disi #4
>  mov POS1CNT, W0
>  add _dZ32, WREG  ;only 16 bit
>  sub POS2CNT, WREG
> ...etc
> --------------------------
> Notera att MPLAB ibland gör skillnad på WREG och W0 trots att det är samma
> sak.
> _dZ32 är en variabel som deklareras och används i C (utan underscore).
> Men PIC32 assembler verkar vara ganska olika?!
>
> Hälsn.
> Anders.J
>
>
>
> ----- Original Message -----
> From: <juhasz at abc.se>
> To: "H. Peter Anvin" <hpa at zytor.com>
> Cc: <abc80 at abc80.org>
> Sent: Monday, August 30, 2010 7:41 PM
> Subject: [abc80] koppla ABC80 till PIC32:an
>
>
> 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);
>
>
>
> }
>
> _______________________________________________
> ABC80 mailing list
> ABC80 at abc80.org
> http://www.abc80.org/mailman/listinfo/abc80
>



More information about the ABC80 mailing list