www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

PIC in asembler

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
jereb
Član
Član



Pridružen-a: Pon 28 Feb 2011 12:15
Prispevkov: 17
Aktiv.: 0.11
Kraj: Ljubljana

PrispevekObjavljeno: Pon Dec 02, 2013 12:18 am    Naslov sporočila:  PIC in asembler Odgovori s citatom

Pozdravljeni,

na faksu delamo nek termostat, in imam na PIC12F752 priključen temperaturni senzor, TSiC 506, ki komunicira preko ZacWire protokola. Dobil sem celo njihovo kodo, in to celo za PIC, vendar kot kaže ima prevajalnik XC8 nekaj problemov, zato prosim za pomoč.

Koda:


10   void Branje_temp (void){
11   
12   #asm
13   
14       TEMP_HIGH EQU 0X24             //MEMORY LOCATION RESERVED FOR TEMP HIGH BYTE
15       TEMP_LOW EQU  0X25             //MEMORY LOCATION RESERVED FOR TEMP LOW BYTE
16                                      //THIS BYTE MUST BE CONSECUTIVE FROM TEMP_HIGH
17       LAST_LOC EQU 0X26              //THIS BYTE MUST BE CONSECUTIVE FROM TEMP_LOW
18       TSTROBE EQU  0X26             //LOCATION TO STORE START BIT STROBE TIME.
19   
20   
21   
22   
23   
24       MOVLW TEMP_HIGH                //MOVE ADDRESS OF TEMP_HIGH (0X24) TO W REG
25       MOVWF FSR                      //FSR = INDIRECT POINTER, NOW POINTING TO TEMP_HIGH
26   GET_TLOW: MOVLW 0X02           
27   
28       MOVWF TSTROBE                  //OVERHEAD IN GETTING TO THIS POINT OF ISR
29       CLRF INDF                      //CLEAR THE MEMORY LOCATION POINTED TO BY FS
30   
31   STRB: INCF TSTROBE,1           
32       BTFSC STATUS,Z                 //IF TSTROBE OVERFLOWED TO ZERO THEN
33       GOTO RTI                       //SOMETHING WRONG AND RETURN FROM INTERRUPT
34       BTFSS PORTA,1                  //LOOK FOR RISE ON ZAC WIRE
35       GOTO STRB                      //IF RISE HAS NOT YET HAPPENED INCREMENT TSTROBE
36       CLRF BIT_CNT                   //MEMORY LOCATION USED AS BIT COUNTER
37   
38   BIT_LOOP: CLRF STRB_CNT       
39       CLRF TIME_OUT                  //MEMORY LOCATION USED FOR EDGE TIME OUT
40   
41   WAIT_FALL: BTFSS PORTA,1       
42   
43       GOTO PAUSE_STRB                //NEXT FALLING EDGE OCCURRED
44       INCFSZ TIME_OUT,1              //CHECK IF EDGE TIME OUT COUNTER OVERFLOWED
45       GOTO WAIT_FALL
46       GOTO RTI                       //EDGE TIME OUT OCCURRED.
47   
48   PAUSE_STRB: INCF STRB_CNT,1   
49       MOVF TSTROBE,0                 //MOVE TSTROBE TO W REG
50       SUBWF STRB_CNT,0               //COMPARE STRB_CNT TO TSTROBE
51       BTFSS STATUS,Z                 //IF EQUAL THEN IT IS TIME TO STROBE
52       GOTO PAUSE_STRB                //ZAC WIRE FOR DATA, OTHERWISE KEEP COUNTING
53                                      //LENGTH OF THIS LOOP IS 6-STATES. THIS HAS TO
54                                      //MATCH THE LENGTH OF THE LOOP THAT ACQUIRED TSTROBE
55       BCF STATUS,C                   //CLEAR THE CARRY
56       BTFSC PORTA,1                  //SAMPLE THE ZAC WIRE INPUT
57       BSF STATUS,C                   //IF ZAC WIRE WAS HIGH THEN SET THE CARRY
58       RLF INDF,1                     //ROTATE CARRY=ZAC WIRE INTO LSB OF REGISTER
59                                      //THAT FSR CURRENTLY POINTS TO
60       CLRF TIME_OUT                  //CLEAR THE EDGE TIMEOUT COUNTER
61   
62   WAIT_RISE: BTFSC PORTA,1       
63       GOTO NEXT_BIT
64       INCFSZ TIME_OUT,1              //INCREMENT THE EDGE TIME OUT COUNTER
65       GOTO WAIT_RISE
66       GOTO RTI                       //EDGE TIME OUT OCCURRED.
67   
68   NEXT_BIT: INCF BIT_CNT,1     
69       MOVLW 0X08                     //THERE ARE 8-BITS OF DATA
70       SUBWF BIT_CNT,0                //TEST IF BIT COUNTER AT LIMIT
71       BTFSS STATUS,Z                 //IF NOT ZERO THEN GET NEXT BIT
72       GOTO BIT_LOOP
73       CLRF TIME_OUT                  //CLEAR THE EDGE TIME OUT COUNTER
74   
75   WAIT_PF: BTFSS PORTA,1         
76       GOTO P_RISE
77       INCFSZ TIME_OUT,1              //INCREMENT TIME_OUT COUNTER
78       GOTO WAIT_PF
79       GOTO RTI                       //EDGE TIMEOUT OCCURRED
80   P_RISE: CLRF TIME_OUT         
81   
82   WAIT_PR: BTFSC PORTA,1         
83       GOTO NEXT_BYTE
84       INCFSZ TIME_OUT,1              //INCREMENT EDGE TIME OUT COUNTER
85       GOTO WAIT_PR
86       GOTO RTI                       //EDGE TIME OUT OCCURRED
87   
88   NEXT_BYTE: INCF FSR,1         
89       MOVLW LAST_LOC
90       SUBWF FSR,0                    // COMPARE FSR TO LAST_LOC
91       BTFSS STATUS,Z                 // IF EQUAL THEN DONE
92       GOTO WAIT_TLOW
93                                      //;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
94                                      //;; IF HERE YOU ARE DONE READING THE ZAC WIRE AND HAVE THE DATA ;;
95                                      //;; IN TEMP_HIGH & TEMP_LOW ;;
96                                      //;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
97   WAIT_TLOW: CLRF TIME_OUT
98   WAIT_TLF: BTFSS PORTA,1       
99       GOTO GET_TLOW                  // START OF TEMP LOW BYTE
100       INCFSZ TIME_OUT
101       GOTO WAIT_TLF
102       GOTO RTI                       // EDGE TIMEOUT OCCURRED
103   
104   RTI:
105       BCF IOCAF, IOCAF1              // CLEAR INTERRUPT FLAG
106       BSF INTCON,INTE                // ENSURE INTERRUPT RE-ENABLED
107   #endasm;
108   }


Sem tudi preveril če kakšnega ukaza ta PIC ne prebavi, vendar kakor kaže bi jih moral. Tudi registrov ne razume...

Errorji ki mi ne povedo kaj dosti:
44. syntax error
48. syntax error
49. syntax error
50. syntax error
58. syntax error
64. syntax error
68. syntax error
70. syntax error
77. syntax error
84. syntax error
88. syntax error
90. syntax error
32. undefined symbol "Z"
55. undefined symbol "C"
105. undefined symbol "IOCAF1"
106. undefined symbol "INTE"

Vnaprej hvala!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
bferlic
Član
Član



Pridružen-a: Tor 09 Dec 2003 17:28
Prispevkov: 99
Aktiv.: 0.45
Kraj: Brezula, Rače

PrispevekObjavljeno: Pon Dec 02, 2013 12:53 am    Naslov sporočila:   Odgovori s citatom

Zdravo

Na vrhu funkcije imaš definiranih samo nekaj spremenljivk, kje pa imaš definirane: TIME_OUT, STRB_CNT, BIT_CNT, mogoče še katera?

LP Boštjan
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo MSN Messenger - naslov
jereb
Član
Član



Pridružen-a: Pon 28 Feb 2011 12:15
Prispevkov: 17
Aktiv.: 0.11
Kraj: Ljubljana

PrispevekObjavljeno: Pon Dec 02, 2013 9:38 am    Naslov sporočila:   Odgovori s citatom

Aja, glede tega, ne vem zakaj ni vključeno v kodo, vendar sem popravil, in tudi dodal tiste spremenljivke, vendar brez uspeha, napake ostajajo enake....
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
s56al
Član
Član



Pridružen-a: Pon 19 Sep 2005 12:03
Prispevkov: 740
Aktiv.: 3.33
Kraj: JN66SI & JN76TM

PrispevekObjavljeno: Pon Dec 02, 2013 1:49 pm    Naslov sporočila:   Odgovori s citatom

Tiste "ničle" in "enke" za vejico na koncu vrstic, kjer ti javlja napako "sintax error", poskusi zamenjati za bolj običajni "w" in "f" in sporoči, ali je kaj bolje. Striktno samo v teh vrsticah, argumente ("enke" za vejico) pri mnemonikih tipa "BTFxx....." pusti nespremenjene.

Nenavadno je, da ti javi nedefiniran simbol "C" v recimo vrstici 55, ne pa tudi v vrstici 57, kjer imaš "do pike" enak ukaz? Glede tega sicer poskusi veliki "C" in "Z" zamenjati za malo tiskano črko, morda je tvoj prevajalnik "case sensitive"?

LP, Sandi
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
gumby
Član
Član



Pridružen-a: Sob 28 Apr 2007 12:32
Prispevkov: 4066
Aktiv.: 19.74

PrispevekObjavljeno: Pon Dec 02, 2013 4:46 pm    Naslov sporočila:   Odgovori s citatom

ZacWire je tako enostavna stvar, da bolj že ne more bit. Prej boš gotov, če boš spisal svojo kodo, kot pa da boš našel napako v tuji Wink
_________________
Tule nisem več aktiven.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
jereb
Član
Član



Pridružen-a: Pon 28 Feb 2011 12:15
Prispevkov: 17
Aktiv.: 0.11
Kraj: Ljubljana

PrispevekObjavljeno: Sre Dec 11, 2013 9:13 pm    Naslov sporočila:   Odgovori s citatom

Evo me spet nazaj.
Tista koda se je prevedla, vendar ni delovala, zato sem se lotil svoje...
Ampak tudi ta ne dela Mad Malo že obupujem, saj mi jo nikakor ne uspe usposobit.

Koda:

void interrupt isr(void)
{
    if (IOCIE && IOCAF1)                  //Falling edge interrupt
    {
      if (i==0 || i==10)
      {

         TMR0 = 0;                     //Holding Register for the 8-bit Timer0 Register --> zaženem Timer0
                      
         while (PORTAbits.RA0 == 0)
         {
            asm("NOP");
         }
            Timer0_vrednost = 255 - TMR0;   // preberem vrednost Timer0
            IOCAF1 =0;                  // Brišem Falling edge flag
            i++;
         
      }   
      else
      {
         TMR0 = Timer0_vrednost;            // vpišem vrednost vzorčenja
         T0IE = 1;                        // Enables the Timer0 interrupt
         T0IF = 0;                     // Brišem  Timer0 interrupt flag
         IOCAF1 = 0;                     // Brišem Falling edge flag
         i++;      
      }
                   
        return;
    }
       if (T0IE && T0IF)                    // Timer0 overflow interrupt
       {
         T0IE = 0;                        //Disables the Timer0 interrupt

         if ((i>0 && i<9)||(i>10 && i<18))
         {
            vrednost = (PORTAbits.RA0 || vrednost) <<1;
            i++;
         }
         else if (i == 9)               //parity
         {
            i++;   
         }
         else if (i == 18)
         {
            vrednost = (PORTAbits.RA0 || vrednost);

            Zajem_Temp = vrednost;
            vrednost = 0;
            temp_flag = 1;
            i++;
         }
         else if (i==19)                  //parity
         {
            i = 0;   
         }
           return;
       } 
}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
PZUFIC
Vseved



Pridružen-a: Sob 17 Nov 2007 19:06
Prispevkov: 6987
Aktiv.: 35.08
Kraj: Rakek

PrispevekObjavljeno: Sre Dec 11, 2013 11:14 pm    Naslov sporočila:   Odgovori s citatom

Tole pa že ni več asembler. Wink
_________________
Ne čakaj, da se bo nekaj premaknilo pojdi in nekaj premakni.
Lp Primož
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
jereb
Član
Član



Pridružen-a: Pon 28 Feb 2011 12:15
Prispevkov: 17
Aktiv.: 0.11
Kraj: Ljubljana

PrispevekObjavljeno: Čet Dec 12, 2013 9:34 am    Naslov sporočila:   Odgovori s citatom

Ja res je, sem prešel rajši kar na C, in na novo spisal kodo.
Zdaj sem opazil, da bi moral timer0 flag vsakič brisati, saj drugače sploh ne pride iz interrupt rutine?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 48 dni


Powered by phpBB © 2001, 2005 phpBB Group