[abc80] koppla ABC80 till PIC32:an

anders at abc80.net anders at abc80.net
Tis Aug 31 01:22:36 PDT 2010


Jag funderar på en sak, jag har inte lusläst databladet till PIC:en men
visst är det en 3,3V krets?

Det är ju så att den har 5V TTL tåliga ingångar, men kan den verkligen
driva  5V-TTL logik direkt?

Mvh Anders

> 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
>>
>
> _______________________________________________
> ABC80 mailing list
> ABC80 at abc80.org
> http://www.abc80.org/mailman/listinfo/abc80
>




More information about the ABC80 mailing list