[abc80] koppla ABC80 till PIC32:an

Pontus Oldberg pontus.oldberg at invector.se
Tis Aug 31 01:43:14 PDT 2010


En 1'a i TTL nivå är normalt mellan 2.2V till 5V (Varierar lite mellan
tillverkare och kan gå upp till 2.6V). PIC32'an lämnar garanterat 2.4 Volt
på I/O portarna för en 1'a. Kanske inte världens största marginal men för
lite labbande borde det funka. Kanske slänga på lite pull-up motstånd på
signalerna för säkerhetsskull. Annars kan man ju använda sånna fräcka
dubbelriktade nivåomvandlare som automatiskt byter riktning.

/Pontus

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




More information about the ABC80 mailing list