|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
jereb Član
Pridružen-a: Pon 28 Feb 2011 12:15 Prispevkov: 17 Aktiv.: 0.11 Kraj: Ljubljana
|
Objavljeno: Pon Dec 02, 2013 12:18 am Naslov sporočila: PIC in asembler |
|
|
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 |
|
|
bferlic Član
Pridružen-a: Tor 09 Dec 2003 17:28 Prispevkov: 99 Aktiv.: 0.44 Kraj: Brezula, Rače
|
Objavljeno: Pon Dec 02, 2013 12:53 am Naslov sporočila: |
|
|
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 |
|
|
jereb Član
Pridružen-a: Pon 28 Feb 2011 12:15 Prispevkov: 17 Aktiv.: 0.11 Kraj: Ljubljana
|
Objavljeno: Pon Dec 02, 2013 9:38 am Naslov sporočila: |
|
|
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 |
|
|
s56al Član
Pridružen-a: Pon 19 Sep 2005 12:03 Prispevkov: 740 Aktiv.: 3.32 Kraj: JN66SI & JN76TM
|
Objavljeno: Pon Dec 02, 2013 1:49 pm Naslov sporočila: |
|
|
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 |
|
|
gumby Član
Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 19.64
|
Objavljeno: Pon Dec 02, 2013 4:46 pm Naslov sporočila: |
|
|
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 _________________ Tule nisem več aktiven. |
|
Nazaj na vrh |
|
|
jereb Član
Pridružen-a: Pon 28 Feb 2011 12:15 Prispevkov: 17 Aktiv.: 0.11 Kraj: Ljubljana
|
Objavljeno: Sre Dec 11, 2013 9:13 pm Naslov sporočila: |
|
|
Evo me spet nazaj.
Tista koda se je prevedla, vendar ni delovala, zato sem se lotil svoje...
Ampak tudi ta ne dela 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 |
|
|
PZUFIC Vseved
Pridružen-a: Sob 17 Nov 2007 19:06 Prispevkov: 6987 Aktiv.: 34.90 Kraj: Rakek
|
Objavljeno: Sre Dec 11, 2013 11:14 pm Naslov sporočila: |
|
|
Tole pa že ni več asembler. _________________ Ne čakaj, da se bo nekaj premaknilo pojdi in nekaj premakni.
Lp Primož |
|
Nazaj na vrh |
|
|
jereb Član
Pridružen-a: Pon 28 Feb 2011 12:15 Prispevkov: 17 Aktiv.: 0.11 Kraj: Ljubljana
|
Objavljeno: Čet Dec 12, 2013 9:34 am Naslov sporočila: |
|
|
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 |
|
|
|
|
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: 78 dni
Powered by phpBB © 2001, 2005 phpBB Group
|