Sida 1 av 2

Har problem att ändra output på PORTC

Postat: 28 september 2012, 21:57:43
av OnkelF
Hej.

Tänkte prova på pic18 så jag har köpte ett antal pic18f14k50.
Började med att blinka en LED men får det inte att funka precis som jag vill. Har fattat att det är LATC som gäller för output på pic18.
Om jag skriver till en specifik pinne fungerar det men inte om jag försöker sätta om hela porten.
Om jag sätter om porten så lyser dioden hela tiden men flimrar till när den ska släckas.
Kod:

Kod: Markera allt

#include <stdio.h>
#include <stdlib.h>
#include <delays.h>



// PIC18F14K50 Configuration Bit Settings

#include <xc.h>

//#pragma config CONFIG1L = 0x0
__CONFIG(1, CPUDIV_NOCLKDIV & USBDIV_OFF);
//#pragma config CONFIG1H = 0x28
__CONFIG(2, FOSC_IRC & PLLEN_OFF & PCLKEN_ON & FCMEN_OFF & IESO_OFF);
//#pragma config CONFIG2L = 0x3F
__CONFIG(3, PWRTEN_OFF & BOREN_SBORDIS & BORV_19);
//#pragma config CONFIG2H = 0x1E
__CONFIG(4, WDTEN_OFF & WDTPS_32768);
//#pragma config CONFIG3H = 0x88
__CONFIG(5, HFOFST_ON & MCLRE_ON);
//#pragma config CONFIG4L = 0x85
__CONFIG(6, STVREN_ON & LVP_ON & BBSIZ_OFF & XINST_OFF);
//#pragma config CONFIG5L = 0x3
__CONFIG(7, CP0_OFF & CP1_OFF);
//#pragma config CONFIG5H = 0xC0
__CONFIG(8, CPB_OFF & CPD_OFF);
//#pragma config CONFIG6L = 0x3
__CONFIG(9, WRT0_OFF & WRT1_OFF);
//#pragma config CONFIG6H = 0xE0
__CONFIG(10, WRTC_OFF & WRTB_OFF & WRTD_OFF);
//#pragma config CONFIG7L = 0x3
__CONFIG(11, EBTR0_OFF & EBTR1_OFF);
//#pragma config CONFIG7H = 0x40
__CONFIG(12, EBTRB_OFF);

void init()
{
    TRISC = 0x0; // All output
    LATC = 0; // Clear PORTC output latch.
    ANSEL = 0; // All analog inputs are disabled and made digital.
    ANSELH = 0;
}

int main(int argc, char** argv) {
    init();
    while (1) 
    {
        LATCbits.LATC7 = 1;
        //LATC = 0x0;
        Delay10KTCYx(25);
        LATCbits.LATC7 = 0;
        //LATC = 0xff;
        Delay10KTCYx(25);
    }
    return (EXIT_SUCCESS);
}
Följande kod fungerar.
Om man kommenterar ut LATSbits och avkommenterar LATC så fungerar det inte.
Nån som har nåt förslag?

Re: Har problem att ändra output på PORTC

Postat: 28 september 2012, 22:02:54
av TomasL
Kompilator och IDE?
Olika kompilatorer och IDE har olika syntax.

Re: Har problem att ändra output på PORTC

Postat: 28 september 2012, 23:20:54
av OnkelF
Kompilatorn är XC8 v1.10 och IDEn är MPLAB 1.3

EDIT: Har en LED (med motstånd) kopplad till RC7. De andra pinnarna är inte anslutna.

Re: Har problem att ändra output på PORTC

Postat: 28 september 2012, 23:30:18
av TomasL
Ok, så du kör MPLAB-X och XC.
Va´d jag kan se saknar du inclidefilerna för processorn i fråga, dock använder inte den verktygskedjan utan vanliga MPLAB, där behövs en include
p16xxx.h eller nått sånt.

Re: Har problem att ändra output på PORTC

Postat: 29 september 2012, 00:32:12
av OnkelF
Jag inkluderar xc.h. Via en kedja (xc.h->htc.h->pic18h->pic18_chip_select.h) så inkluderas pic18f14k50.h
Skulle tro att IDE:n skickar med vilken pic man använder så att rätt väljs.

Re: Har problem att ändra output på PORTC

Postat: 29 september 2012, 14:03:49
av sodjan
> Om man kommenterar ut LATSbits och avkommenterar LATC så fungerar det inte.
> Nån som har nåt förslag?

Vad blir det för skillnad i ASM listan ??

Re: Har problem att ändra output på PORTC

Postat: 29 september 2012, 18:01:08
av OnkelF
Funkar:

Kod: Markera allt

!int main(int argc, char** argv) {
!    init();
0x3FD6: CALL 0x3FBE, 0
0x3FD8: NOP
0x3FDA: BRA 0x3FDC
!    while (1)
0x3FFA: BRA 0x3FDC
!    {
!        LATCbits.LATC7 = 1;
0x3FDC: BSF LATC, 7, ACCESS
!//        LATC = 0x0;
!        Delay10KTCYx(25);
0x3FDE: MOVWF 0x8, ACCESS
0x3FE0: MOVLW 0x19
0x3FE2: MOVWF unit, ACCESS
0x3FE4: MOVF 0x8, W, ACCESS
0x3FE6: CALL 0x3FA6, 0
0x3FE8: NOP
!        LATCbits.LATC7 = 0;
0x3FEA: BCF LATC, 7, ACCESS
!        //LATC = 0xff;
!        Delay10KTCYx(25);
0x3FEC: MOVWF 0x8, ACCESS
0x3FEE: MOVLW 0x19
0x3FF0: MOVWF unit, ACCESS
0x3FF2: MOVF 0x8, W, ACCESS
0x3FF4: CALL 0x3FA6, 0
0x3FF6: NOP
0x3FF8: BRA 0x3FDC
!    }
!    return (EXIT_SUCCESS);
!}
0x3FFC: GOTO 0x0
Funkar inte:

Kod: Markera allt

!int main(int argc, char** argv) {
!    init();
0x3FD4: CALL 0x3FBC, 0
0x3FD6: NOP
0x3FD8: BRA 0x3FDA
!    while (1)
0x3FFA: BRA 0x3FDA
!    {
!//        LATCbits.LATC7 = 1;
!        LATC = 0x0;
0x3FDA: MOVLW 0x0
0x3FDC: MOVWF LATC, ACCESS
!        Delay10KTCYx(25);
0x3FDE: MOVWF 0x8, ACCESS
0x3FE0: MOVLW 0x19
0x3FE2: MOVWF unit, ACCESS
0x3FE4: MOVF 0x8, W, ACCESS
0x3FE6: CALL 0x3FA4, 0
0x3FE8: NOP
!//        LATCbits.LATC7 = 0;
!        LATC = 0xff;
0x3FEA: SETF LATC, ACCESS
!        Delay10KTCYx(25);
0x3FEC: MOVWF 0x8, ACCESS
0x3FEE: MOVLW 0x19
0x3FF0: MOVWF unit, ACCESS
0x3FF2: MOVF 0x8, W, ACCESS
0x3FF4: CALL 0x3FA4, 0
0x3FF6: NOP
0x3FF8: BRA 0x3FDA
!    }
!    return (EXIT_SUCCESS);
!}
0x3FFC: GOTO 0x0


Re: Har problem att ändra output på PORTC

Postat: 29 september 2012, 18:43:46
av sodjan
Inget direkt uppenbart.
Dock undrar jag varför kompilatorn inte översätter
"LATC = 0x0;" med en "CLRF LATC, ACCESS" istället
för att ta omvägen över att ladda 0x0 till W...
Allså :

Kod: Markera allt

!        LATC = 0x0;
0x3FDA: CLRF LATC, ACCESS
!        Delay10KTCYx(25);
istället för :

Kod: Markera allt

!        LATC = 0x0;
0x3FDA: MOVLW 0x0
0x3FDC: MOVWF LATC, ACCESS
!        Delay10KTCYx(25);
I det andra fallet så använder den ju SETF...

Men som sagt, inget uppenbart som ger de symptom (eller i
alla fall min tolkning av dina symptom) som du beskriver.

Re: Har problem att ändra output på PORTC

Postat: 30 september 2012, 18:45:38
av OnkelF
Har hittat vad som händer nu.
Det är att den startar om när jag sätter alla pinnar höga (LATC = 0xFF;).
Hur kommer det sig? Alla pinnar är flytande förutom den som går till LEDen.
Kanske får ta fram oscilloskopen och se om min strömkälla inte pallar omslaget.

Re: Har problem att ändra output på PORTC

Postat: 30 september 2012, 19:38:48
av sodjan
Har du några öppna (d.v.s oanslutna) ingångar?
Det kan ge skumma fel. Sätt alla "flytande" (om det
nu alltså betyder oanslutna) pinnar som utgångar.

Re: Har problem att ändra output på PORTC

Postat: 1 oktober 2012, 00:06:08
av Icecap
Är spänningsmatningen avkopplat ordentligt?
Är alla oanvända portpinnar ställd som utgång?
Är alla ingångar kopplat till något?

Re: Har problem att ändra output på PORTC

Postat: 1 oktober 2012, 01:42:45
av OnkelF
Har ställt om alla portar till utgångar, bytt strömkälla och satt dit 400nF mellan VUSB och jord men problemen kvarstår.
Jag skrivit om koden lite och testar alla pinnar.
Jag får bara problem om jag sätter pinne RC4 och RC6 höga, inte om jag jag bara sätter en av dem.
Ska testa ett nytt chip i morgon även om jag inte tror att det är fel på processorn.

Re: Har problem att ändra output på PORTC

Postat: 1 oktober 2012, 10:24:41
av ghu
Det verkar vara PGM pinnen som ger problem.
Ändra i config så att LVP är avstängd eller jorda PGM-pinnen med ett 10 kohms motstånd.
__CONFIG(6, STVREN_ON & LVP_ON & BBSIZ_OFF & XINST_OFF);

Re: Har problem att ändra output på PORTC

Postat: 1 oktober 2012, 22:23:32
av OnkelF
Nu funkar det!
Tack för svaren!

Re: Har problem att ändra output på PORTC

Postat: 2 oktober 2012, 21:47:37
av sodjan
Jaha !?
Förbannat dålig beskrivning av vad problemet var! :roll: