[abc80] koppla ABC80 till PIC32:an

Pontus Oldberg pontus.oldberg at invector.se
Tis Aug 31 02:38:51 PDT 2010


Se där, bara att tuta och köra mao. Intressant projekt, jag började själv
att pula med PIC32an nyligen. Prisvärd rackare.
/P

juhasz at abc.se skrev:
> 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
>>>>>>>>>> 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.
>>>>>>>>>> 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