Avatar billede awsq Nybegynder
02. april 2001 - 13:41 Der er 5 kommentarer og
1 løsning

MPLAB: PIC programmering med C-compiler??

Jeg har programmeret i MPLAB med assembler. Jeg vil nu prøve at programmer i C. Jeg har fået C-compileren installeret, (Det er kun en demo udgave), og det ser ud til at virke fint.
Det jeg ønsker, er hjælp til at lave et lille program der ved at aktivere en indgang på en PIC 16f84 giver respons på en udgang. Sådan lige for at komme i gang.

Jeg har lavet et program i assembler, som jeg kunde tænke mig lavet i C. (Programmet har godt nok pral funktion på RA2, det han jeg jo springe over i første omgang).

Jeg har startet på et lille program i C men har brug for MEGET hjælp

Assembler
;*******************************************************************************
;Demo fil test_2.
;
;On/Off med dilay på RA2. Skriver 1 og 2 på display. (binær, RB4 - RB7)
;On/Off på RA3. Skriver 3 og 4 på display (binær, RB4 - RB7)
;
;Dato: 25.03.01
;*******************************************************************************

      LIST        P = 16F84,    R=DEC      ;radix gruntalsystem
         
#include      <p16f84.inc>

;#define    praloff
         

;-----------------------------------------------------------------------------------------------
; Variables
;-----------------------------------------------------------------------------------------------

Byte1    EQU    .12        ;
Byte2    EQU    .13        ;Korntrol for kontakt off, RA2.
Byte3    EQU    .14        ;Korntrol for kontakt off, RA3.
Byte10    EQU    .15        ;
Byte11    EQU    .16        ;1 / 2.
Byte12    EQU    .17        ;3 / 4.
DByte1    EQU    .18        ;Dilay for kontaktpral
DByte2    EQU    .19        ;Dilay for kontaktpral


;-----------------------------------------------------------------------------------------------
; Program Code
;-----------------------------------------------------------------------------------------------

        ORG 0
        Bsf    STATUS,RP0      ;Skift RAM bank. status bit der bruges for
                inst. Bcf, Bsf, Movwf.       
    Movlw B\'00000000\'    ;b = binæt værdi.  0 = output  1 = indput (tab.
                5-2).
        Movwf TRISB        ;Sætter alle PORTB ben som udgange.
        Bcf    STATUS,RP0   

        Clrf    Byte1                  ;Cleare for starter.
        Clrf    Byte2                  ;
        Clrf    Byte3                  ;
        Clrf    Byte10                  ;
        Clrf    Byte11                  ;

;        Incf      Byte1,f        ;Tæller register byte1 op med 1.
;        Incf      Byte4,f        ;Tæller register byte1 op med 1.

;-----------------------------------------------------------------------------------------------
; Main Program
;-----------------------------------------------------------------------------------------------

Start
;-RA2--------------------------------------------------------------------------------------------

        Btfsc  Byte2,0        ;Hopper hvis kontakt ikke har været on.
    Goto    Lin1
        Btfsc    PORTA,2        ;Pin RA3
    Call    Loop1
Lin1
        Btfss  Byte2,0        ;Hopper hvis kontakt har været on.
    Goto    Lin2
        Btfsc    PORTA,2        ;Pin RA3
    Goto    Lin2
ifndef  praloff

IncD7
        Incfsz  DByte1,f        ;Delay rutine for kontaktprall.
        Goto    IncD7
        Incfsz  DByte2,f
    Movf    DByte2,W
        Xorlw  .200            ;Indsætte et tal.
        Btfss  STATUS,Z
        Goto    IncD7
    Clrf    DByte2        ;------
endif
        Incf      Byte2,f        ;Tæller register byte2 op med 1.
Lin2

;-RA3-------------------------------------------------------------------------------------------

        Btfsc  Byte3,0        ;Hopper hvis kontakt ikke har været on.
    Goto    Lin3
        Btfsc    PORTA,3        ;Pin RA3
    Call    Loop2
Lin3
        Btfss  Byte3,0        ;Hopper hvis kontakt har været on.
    Goto    Lin4
        Btfss    PORTA,3        ;Pin RA3
        Incf    Byte3,f        ;Tæller register byte3 op med 1.
Lin4
    Goto    Start
;-----------------------------------------------------------------------------------------------

;-RA2.1--------------------------------------------------------------------------------------------

Loop1
        Bcf    PORTB,0         
        Bcf    PORTB,1         
        Bcf    PORTB,2         

        Btfsc  Byte10,0        ;Hopper hvis bit0 er cleret.
    Goto    Line10

      Bsf    PORTB,4
        Bcf    PORTB,5
        Bcf    PORTB,6
    Bcf    PORTB,7
    Goto    Slut1
Line10
      Bcf    PORTB,4
        Bsf    PORTB,5
        Bcf    PORTB,6
    Bcf    PORTB,7
Slut1
      Incf      Byte10,f        ;
ifndef  praloff

IncD8
        Incfsz  DByte1,f        ;Delay rutine for kontaktprall.
        Goto    IncD8
        Incfsz  DByte2,f
    Movf    DByte2,W
        Xorlw  .200            ;Indsætte et tal.
        Btfss  STATUS,Z
        Goto    IncD8
    Clrf    DByte2        ;------
endif

        Incf      Byte2,f        ;Tæller register byte2 op med 1.
    Return

;---------------------------------------------------------------------------------------------

;-RA3.1-------------------------------------------------------------------------------------------

Loop2
        Bcf    PORTB,0         
        Bcf    PORTB,1         
        Bcf    PORTB,2         

        Btfsc  Byte11,0        ;Hopper hvis bit0 er cleret.
    Goto    Line11

      Bsf    PORTB,4
        Bsf    PORTB,5
        Bcf    PORTB,6
    Bcf    PORTB,7
    Goto    Slut2
Line11
      Bcf    PORTB,4
        Bcf    PORTB,5
        Bsf    PORTB,6
    Bcf    PORTB,7
Slut2
      Incf      Byte11,f    ;

    Incf      Byte3,f        ;Tæller register byte3 op med 1.
    Return

;--------------------------------------------------------------------------------------------


END


C-program:

//Jeg ønsker her at lave et lille program, der ved at aktiver en indgang,
//kan give respons på en udgang!

#include <pic1684.h>


/********************************************************************
* Modulnavn    : Test for c compiler.
* Input        :
* Funktion    :
* Output    :
* Versionsbeskrivelse :
*
********************************************************************/

unsigned char PortRB;

#define InRA1            0x02


void main (void)
{

  TRISB = 0x00;        // Alle PORTB som output

//    if (InRA1)

//    do
    {
        PortRB = PORTB;
      PortRB &= 0xf0;        //RB4 - RB7 er hige
      PortRB |= 0x0f;        //RB0 - RB8 er low
      PORTB = PortRB;
    }
//    while ()
      }

Avatar billede Techwork Praktikant
02. april 2001 - 18:33 #1
Kan du ikke prøve at være lidt mere konkret i din problemformulering.

Umiddelbart ser det jo ud til at du er på rette vej.

Hvad er det præsic, som du ikke kan få til at virke i dit C program...?
Avatar billede awsq Nybegynder
03. april 2001 - 00:13 #2
Hardwaren er bygget med en switch (high puls) på RA1. Jeg ønsker når man trykker på den og slipper igen sætter den udgangene høje RB4 - RB7. og næste gang man trykker og slipper sætter den udgangene lav, osv.

Så i første omgang er mine spørsmål
Hvordan får jeg RA1 til at virke som indgang?

Og hvordan får jeg programmet til at køre kontinuerlig?
Avatar billede Techwork Praktikant
03. april 2001 - 00:52 #3
Følgende skulle gerne køre kontinuerlig, da 1 jo altid vil være lig 1:
    do
    {
      PortRB = PORTB;
      PortRB &= 0xf0;        //RB4 - RB7 er hige
      PortRB |= 0x0f;        //RB0 - RB8 er low
      PORTB = PortRB;
    }
    while (1=1)

For at få RA1 til at være indgang, skal du sætte det rigtige bitmønstre i registret TRISA.

Jeg kan ikke lige huske hvordan det er, men det står nærmere beskrevet i dokumentationen for din PIC kreds.
Avatar billede awsq Nybegynder
03. april 2001 - 12:23 #4
Jeg har nu TRISA alle porta som indgange, men egentlig tror jeg ikke det er nødvendig hvis alle porta skal være indgang.

For at læse en indgang i assembler er instruktionen:

        Btfsc    PORTA,1    ;Pin RA1 (Bit Test , Skip if Clear)
    Call    Loop1    ;eks. kunne også være Goto

Men hvad skriver jeg for at læse en indgang her i C?


#include <pic1684.h>

unsigned char PortRB;

//#define InRA1            0x02


void main (void)
{

  TRISA = 0xff;        // Alle PORTA som output
  TRISB = 0x00;        // Alle PORTB som output

//    if (InRA1)

    do
    {
        PortRB = PORTB;
      PortRB &= 0xf0;        //RB4 - RB7 er high
      PortRB |= 0x0f;        //RB0 - RB3 er low
      PORTB = PortRB;
    }
    while (1=1)
      }
Avatar billede Techwork Praktikant
03. april 2001 - 13:13 #5
Hmm. Du skal nok have fat i noget med bit-vis AND
kommandoen.

Prøv følgende, det skulle umiddelbart virke.

void main(void)
{
  int portRA = 0xFF; //Alle indgange er sat til 1
  int result;

  portRA = portRA & 0x01; // isolere første bit
  result = (1 & portRA); // test om bit 1 er sat. 1= sat 0 = ikke sat
}
Avatar billede awsq Nybegynder
05. april 2001 - 23:41 #6

Med hiv og sving er det lykkes at få det til at virke. Resultatet er her.

//Jeg her nu lave et lille program, der ved at aktiver en indgang,
//give respons på en udgang!

#include <pic1684.h>

void main (void)
{
      TRISB = 0x00;        // Alle PORTB som output
           
    while(1==1)
    {
        while(PORTA == 0x02)    //når RA1 high RAx low
        {
   
        PORTB = 0x50;        //RB4, RB7 er high

        }
        PORTB = 0x20;        //RB5 er high

    }


Måske fik jeg det ikke forærende, men jeg fik et skub. Så jeg siger mange tak for hjælpen i denne omgang.

Mvh. Anders

Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester