[abc80] koppla ABC80 till PIC32:an

juhasz at abc.se juhasz at abc.se
Tis Aug 31 02:26:31 PDT 2010


Behövs inte - det finns redan pull-ups på bussen. Senast jag testade körde
jag ju faktiskt med open-drain ut från PIC:en och det funkade fint, bara
man hann i tid.

Det fina med PIC32:an (o alla moderna microcontrollers) är ju just dess
5V-tålighet. Och dessutom är ju ABC80 gammal hederlig TTL-logik så den är
OK med 2.2V om jag minns rätt.

Robert

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



More information about the ABC80 mailing list