Fórum témák

» Több friss téma
Fórum » PIC kezdőknek
 
Témaindító: Placi84, idő: Okt 3, 2005
Témakörök:
- A PIC ÖSSZES Vdd és Vss (AVdd és AVss) (tápfeszültség) lábát be kell kötni!
- A táplábak mellé a lehető legközelebb 100nF-os KERÁMIA kondenzátorokat kell elhelyezni.
- Az MCLR lábat, 10kohm-mal fel kell húzni a Vdd tápfeszültségre.
- Külső kvarc használatakor 4MHz-ig XT, a fölött pedig HS konfigurációt kell beállítani.
- Stabilizált tápegységet kell használni, a kapcsoló üzemű "telefon töltő" adapterek okozhatnak hibákat.
- Programozáshoz, használj lehetőleg PICKIT2 vagy 3 programozót. Kerülendő a JDM (soros porti) programozó.
- A PIC adatlapja (PDF), tartalmazza a lábak kiosztását és a PIC minden paraméterét. Az adatlap ingyen letölthető!
- Egyes PIC típusoknál az RA4 nyitott nyelőelektródás (Csak lefelé húz L szintre, H szintet nem ad ki!)
- Ha a PGM lábat digitális ki-/bemenetnek használod, az alacsony feszültségű programozási lehetőséget le kell tiltani.
Lapozás: OK   360 / 1210
(#) n_yálastrubadúr hozzászólása Jan 29, 2013 /
 
Jó éjszakát!
Most hogy mindegyik demo-panelen együttesen akarom az uart-ot használni, alapvető problémákba ütközöm. Az egyiken megjelenítésre van 2db 4digit -es 14 szegmenses multiplexált kijelző. Hasonlóan próbálkozom a bináris értéket decimálisra váltani mint assemblyben. Ami megy is, de kipróbáltam hogy gyorsan léptetetm magát az értéket és láthatóan súlyosan lassú, tehát erősen remeg a kijelzés. És jól láthatóan értékfüggő a remegés, szóval biztos hogy a konverziós művelet a hibás. Mondjuk nem 100%, mert van egy tábla is újdonságként. Megnéztem az asm kódját , le is szimuláltam. Az egész olyan 150-350us. Ezt nem lehetne látnom, szerintem.
Megcsináltam az átalakítást két verzióban is. Ittvan mind 2. Értelemszerűen van fölé írva, csak az egyik verzió ami mehet.
  1. const char table[10]={0xED,0xC,0xBB,0x3F,0x5E,0x77,0xF7,0x2C,0xFF,0x7F};
  2.  
  3.         void main () {
  4.         init ();
  5.         for (;;){
  6.  
  7.         inc1 ++;
  8.         if (inc1 == 1)inc ++;
  9.         xxx = inc;
  10.  
  11.         xxx = 253;
  12.  
  13. ///////////////////// 1-es verzió ////////////////////////
  14. s100:
  15.         xxx = xxx -100;
  16.         if (c) {numh ++; goto s100;}
  17.         else xxx = xxx + 100;
  18. s10:
  19.         xxx = xxx -10;
  20.         if (c) {numt ++; goto s10;}
  21.         else xxx = xxx + 10;
  22. s1:
  23.         xxx = xxx -1;
  24.         if (c) {num ++; goto s1;}
  25.         else xxx = xxx + 1;
  26.  
  27. ///////////////////// 2-es verzió ////////////////////////
  28.  
  29. //      while (xxx >= 100){ xxx= xxx-100; numh++; }    
  30. //      while (xxx >= 10){ xxx= xxx-10; numt++; }
  31. //      while (xxx >= 1){ xxx= xxx-1; num++; }
  32.  
  33. /////////////////////////////////////////////////////////
  34.  
  35.         pd = 1; pb = table[num];
  36.         __delay_us(20);
  37.         pd = 0; pb = 0;
  38.         pd = 8; pb = table[numt];
  39.         __delay_us(20);
  40.         pd = 0; pb = 0;
  41.         pd = 2; pb = table[numh];
  42.         __delay_us(20);
  43.         pd = 0; pb = 0;
  44.         num = 0; numt = 0; numh = 0;
  45. }
  46. }
(#) Kovabe hozzászólása Jan 29, 2013 /
 
Sziasztok
Esetleg van tapasztalata valakinek 16F628A-val hogy hogyan müködik az RA4 láb, felfelé is huz vagy csak le?
(#) pjg válasza Kovabe hozzászólására (») Jan 29, 2013 /
 
Open Drain Output
(#) Kovabe válasza pjg hozzászólására (») Jan 29, 2013 /
 
Ok csak olvastam a fejlécben hogy némely PIC csak lefelé huzza RA4-et.
(#) pjg válasza Kovabe hozzászólására (») Jan 29, 2013 /
 
Ez is. Mint az open kollektor. Kell neki pár k Ohm ellenállás.
A hozzászólás módosítva: Jan 29, 2013
(#) Kovabe válasza pjg hozzászólására (») Jan 29, 2013 /
 
Ok köszi most már felfogtam. Megint bele futottam, mert ugyebár mindig csak utolag kérdez az ember.
(#) n_yálastrubadúr hozzászólása Jan 29, 2013 1 /
 
Nagyon szépen kérném, ha valakinek van jobban optimalizáló hi-tech compliere, az legyen olyan kedves küldeje már el az incompatible@freemail.hu -ra. Nagyon szépen köszönöm. Nem teljesen ingyen kérném, de nagyon örülnék neki.
(#) tom75 válasza icserny hozzászólására (») Jan 29, 2013 /
 
De gondolom az számít mekkora feszültség kerül a bemenetre.
Szoftverbe kel beállítani, hogy mit jelezzen ki.
pl. ha 30 V a mérendő érték akkor nem mindegy, hogy 3 V-ra vagy 0,3V ra osztom le.
Ezt szoftverbe meg kell adni úgy e?
(#) icserny válasza tom75 hozzászólására (») Jan 29, 2013 /
 
Idézet:
„Ezt szoftverbe meg kell adni ugye?”
Természetesen.
(#) mykymokus hozzászólása Jan 29, 2013 /
 
Sziasztok kis segítséget kérnék. Assembly-ben PIC16f84A-ba. Táblázatból olvasok be adatokat 27h-ba Növelem 1el hogy a következő sort olvassa a táblázatból.Eddig rendbenm is van müxik rendesen de ha eléri a 255 lenulláz s kezdi előről.Hogy tudnám kibővíteni hogy tovább olvasson ?
  1. Table1  
  2.         ADDWF 02h,1   ;Start
  3.         RETLW 00h
  4.         RETLW 7Fh  
  5.         .
  6.         .
  7.         RETLW 0ffh    ; Táblázat vége
  8. Run1
  9.         CLRF 08h       ;törlés 8-25h-ig
  10.         .
  11.         .
  12.         CLRF 25h
  13.  
  14.         MOVLW 00       ; W-be tölt 0-át nullázza 27-et      
  15.         MOVWF 27h      ; W tartalmát mozgatja 27h-ba 27h=0
  16.  
  17. Run2
  18.         MOVLW 08h      ; 08 at mozgat W-be
  19.         MOVWF 30h      ; W tartalmát mozgatja 30h-ba 30h=08  Sebesség.
  20.         CALL Shift         ; Meghívja shift -et
  21.         INCF 27h,1       ; 1el növeli 27h tartalmát eredmény f-be kerül
  22.         MOVF 27h,0      ; 27h f regiszter tartalmának másolása W-be
  23.         CALL Table1      ; Meghívja a táblázat soronkövetkező adatát
  24.         MOVWF 25h      ; Beolvasott tábla adatot 25H-ba tölti
  25.         XORLW 0FFh     ; EZT NEM ÉRTEM !!! ha 0FFh talál a táblázatban kezdi előről?
  26.         BTFSC 03,2       ; bit 2 of file 3 will be SET (=1)  Ezt sem értem !!!
  27.         GOTO Run1       ; Run 1 - re ugrás
  28.  
  29. Run3    DECFSZ 30h,1  
  30.           GOTO Run4
  31.           GOTO Run2
  32. Run4    CALL Scan


Köszönöm
A hozzászólás módosítva: Jan 29, 2013
(#) icserny válasza mykymokus hozzászólására (») Jan 29, 2013 /
 
Idézet:
„Hogy tudnám kibővíteni hogy tovább olvasson ?”

Itt a segítség (4. oldal vége, Táblázatkezelés)
A hozzászólás módosítva: Jan 29, 2013
(#) mykymokus válasza icserny hozzászólására (») Jan 29, 2013 /
 
Köszönöm olvasom de nem nagyon értem.
(#) icserny válasza mykymokus hozzászólására (») Jan 29, 2013 /
 
Kettőnk között az a különbség, hogy én nem is akarom megérteni, csak kikerestem neked.
(#) mykymokus válasza icserny hozzászólására (») Jan 29, 2013 /
 
Köszönöm kedvességed azt hittem kened vágod
(#) Szamy hozzászólása Jan 30, 2013 /
 
Üdvözletek!
Két pic -et beszéltetnék egymással, rs232-n. Kell felhúzó ellenállást tennem ?
(#) zolek hozzászólása Jan 30, 2013 /
 
Üdv mindenkinek! Hp41C végre hajtottam amit ajánlottál, kicseréltem arra amit meg adtál de így sem működik. Nézd már meg ezt a kapcsolási rajzot hogy jó -e.
(#) Hp41C válasza zolek hozzászólására (») Jan 30, 2013 /
 
Szia!
A kapcsolás jónak tűnik, az oldalról letöltött program a szimulátorban fut. A tiedet nem tudom fordítani, mert nincs meg minden állomány hozzá.

fut.JPG
    
(#) zolek hozzászólása Jan 30, 2013 /
 
A PICkit2-vel két 16F628A-at programoztam , ebből csak az 1-et sikerült a másikat nem , azt csak felismeri .Mind kettőbe ugyan az a program lett volna. Próbáltam másik programmal is de az eredmény ugyan az. Ha valakinek volt ilyen segítsen.
(#) zolek válasza Hp41C hozzászólására (») Jan 30, 2013 /
 
Üdv Hp41C! Köszönöm a fáradozásodat
(#) mhatalyak hozzászólása Jan 30, 2013 /
 
Üdv mindenkinek!

.c kiterjesztésű fájlt hogyan tudom beégetni?

Előre is köszönöm a segítséget!
mhatalyak
(#) kistee válasza mhatalyak hozzászólására (») Jan 30, 2013 /
 
Szia,

Röviden: sehogy. Ugyanis az C nyelvű forráskód.
Bővebben: fordítás után .hex fájl lesz belőle, azt már be lehet égetni.

Üdv: t
(#) mhatalyak válasza kistee hozzászólására (») Jan 30, 2013 /
 
Igen, de nem bírom lefordítani HEX-re, esetleg, ha fel töltöm ide, valaki meg tudja nekem csinálni?
(#) llaczo hozzászólása Jan 30, 2013 /
 
Sziasztok. Van néhány bontott ( de tuti jó ) 18F452 I-/pt PICkem. JDM programozóval, WinPic800 as progi felismeri de semmi több. Mit gondoltok le vannak védve az ICk vagy kell szereznem egy komolyabb programozót? Köszi a választ. Üdv
(#) Hp41C válasza llaczo hozzászólására (») Jan 30, 2013 /
 
Egy teljes törléssel el lehet dönteni. A törlés után ki lehet olvasni a 0xFFFF tartalmat a program memróriából, a0xFF -et az adatmemóriából.
(#) mhatalyak válasza mhatalyak hozzászólására (») Jan 31, 2013 /
 
Hát ilyen nincs, egyszerűen nem bírom lefordítani, még a "bevezetés a PIC ológiába" c. videót is megnéztem és az alapján követtem a sorrendet, de még az .asm-et sem tudom lefordítani HEX-re. Most már az MPLAB a PicKit2-t sem engedi kipipálni. Bemásolom a forráskódot, hátha valami hiba van benne, én sajnos nem értek hozzá, de a legjobb lenne ha valaki le tudná fordítani nekem HEX-re.
  1. ;----------------------------------------------------------------------;
  2. ; bike3.asm   Combines: Time , Dist, Av velocity, Inst Vel  
  3. ;             Fred Maher             1st March 2002  
  4. ;   BASIC BICYCLE  COMPUTER WITH THESE FUNCTIONS              
  5. ;----------------------------------------------------------------------;
  6.  
  7. ; 1          Trip Time    HRS:MIN:SEC
  8. ; 2          Trip Dist    000km 00m
  9. ; 3          Trip AvSpd   00.00km/hr
  10. ; 4          Speed        00.00km/hr    
  11.  
  12.  
  13.  
  14.  
  15.  
  16. ;---------------------------------------------------------------------              
  17. ;-------                 HEADER                ----------
  18. ;---------------------------------------------------------------------
  19.  
  20. ;                      LCD MESSAGES
  21. ; position at beginning of 1st line col 0  movlw H'80
  22. ; position at beginning of second line     movlw H'C0'
  23.      
  24.  
  25.      LIST P=16F84           ;  16F84 Runs at 4.096 MHz
  26.      INCLUDE "p16f84A.inc"
  27.      __CONFIG    _CP_OFF & _WDT_OFF & _XT_OSC & _PWRTE_ON  
  28.  
  29.      ERRORLEVEL -224        ;  suppress annoying message because of tris
  30.      ERRORLEVEL -302        ;  suppress message because of page change
  31.  
  32. ; Define Information
  33.     #DEFINE RS PORTA, 2
  34.     #DEFINE E  PORTA, 3
  35.    ;#DEFINE TOGGLESW PORTB, 6  ; not used at the moment
  36.    ;#DEFINE LED PORTB, 5
  37. ;  Macro
  38.  
  39. ;---------------------------------------------------------------
  40.            CBLOCK     0CH   ;  0C to 4F = 67
  41. ;---------------------------------------------------------------
  42.  
  43. ;                   MATH ROUTINES    
  44.  
  45. ;                16 X16 Mult , --> 32
  46. ;     mah mal x mbh mbl = mq4 mq3 mq2 mq1 ( mq4 highest)
  47. mq4
  48. mq3
  49. mq2
  50. mq1        
  51. mbh
  52. mbl
  53. mah
  54. mal
  55. ;                   16 / 16 Div --> 16
  56. denlo          
  57.  denhi     
  58.  numlo           
  59.  numhi   
  60.  rmdrlo            
  61.  rmdrhi          
  62. reshi
  63. reslo
  64. ;temp       also used in nybble
  65.  
  66. ; Addition 16+16 out max 65536 (no carry)
  67. ; Subtraction q1_16-q2_16 out r_16; neg numbers not allowed
  68.          
  69.  q1hi                  
  70.  q1lo            
  71.  q2hi                            
  72.  q2lo            
  73.  rhi             
  74.  rlo             
  75. ;------------    Distance         -----------------------
  76.  
  77. dtotlo       ; total trip distance in metres
  78.  dtothi           ; dtothi/lo hold a max of 65km 536m,  
  79. dtothi2      ; with this added max now 16777km
  80. dist54       ; corrects +2m every 54m (27x2.0747 =56)
  81. dm
  82. dm1000
  83. dm10000
  84. dm100000
  85.  
  86. ;------------   Average velocity Vav    -------------------
  87.  
  88. ;vavhi
  89. ;vavlo
  90. ;divrat
  91. ;stemphi     ;second info passed to stemphi/lo
  92. ;stemplo    
  93.  ;dtemphi     ;dist info passed to dtemphi/lo  
  94. ;dtemplo
  95. m
  96. m10
  97. m100
  98. m1000
  99. ;---------   Time and trip time        --------------------
  100. ;
  101. sectotlo        ; total trip seconds
  102. sectothi        ; max 65536 = aprox 18hrs  
  103. sec             ; seconds digit
  104. sec10           ; 10's of second digit
  105.  min             ; minutes digit
  106.  min10           ; 10's of minutes digit
  107. hr              ; hours digit
  108. hr10            ; 10's of hours digit
  109.  oldsec          ; holds last value of sec
  110.  cntmsec         ; count ms
  111.  TMR18           ; TMR0 217* TMR18 18 = 1 SEC
  112.  
  113. ;----        isr interrupt service routine push pop  -------
  114.  w_temp          ; W isr var
  115.  status_temp     ; STATUS isr var
  116.  fsr_temp        ; FSR isr var
  117.  
  118.  
  119. ; ---------  Instantaneous Velocity  Vin  --------------------
  120.  vinhi
  121.  vinlo
  122.  sectemp
  123.  oldtemp
  124.  totmslo
  125.  totmshi
  126.  totms2lo
  127.  totms2hi
  128.  mshi
  129.  mslo
  130.  spdflg   ; 1st pass =0 2nd pass =1, diff is time between pulses
  131.  
  132.  
  133.  
  134. ;--------         Miscellaneous     ------------------
  135.  temp            ; a temporary used in divide and nybble
  136.  count
  137.  menu
  138.  
  139.  
  140.  
  141.        ENDC     ; end of definition block
  142. ;-------------------------------------------------------------------
  143.  
  144.          
  145.    ORG 0        ; start at location 0
  146.    goto main    ; jump over to main routine      
  147.    ORG 4
  148.    goto Isr     ; jump to interrupt routine
  149.  
  150.  
  151. ;----------------------------------------------------------------------;
  152. ;                           The Main routine                           ;
  153. ;----------------------------------------------------------------------;
  154.  
  155. ; --------       THE   MAIN MODULES    ---------
  156.  
  157.       ;  Isr       stores elapsed TRIP time and generates hr:min:sec
  158.       ;  Disptime  TRIP time, to max 99:59:59
  159.       ;  Dist      Calculates total TRIP distance
  160.       ;  Dispdist  TRIP distance to a max of 999km 999m
  161.       ;  Velav     Average velocity, Totdist/totsecs max 99km/hr
  162.       ;  Dispvav   Average TRIP speed up to  99.99 km/hr
  163.       ;  Velocity  Speed   2m/(time diff of pulse2-pulse1)
  164.       ;  Dispd     Speed  up to 99.99km/hr
  165.        
  166. ; NOTE. Speed is your  calculated velocity  every second
  167.        
  168. ; --------    more to come??? NO, running out of space         ---------
  169.  
  170.  
  171. ;-----------------------------------------------------------------------
  172. ;                           M A I N
  173. ;-----------------------------------------------------------------------
  174.  
  175.  
  176. main:
  177.        call Init               ; Initialize ports, set up timer
  178.        call Initlcd          ; Initialize the LCD DUMMY
  179.  
  180.  
  181. Initend:    
  182.  
  183.  
  184. ;------------------------------------------------------------------
  185. ; Changesec Changewhlpulse wait for interrupts  newsec or newwheelpulse
  186. ; -----------------------------------------------------------------
  187.  
  188.         clrf menu   ; initially set to 0 menu loop
  189.         clrf spdflg  ; Initially = 0 2nd =  sub for time  zero
  190.                          ; every new sec, set to zero
  191.  
  192. ;              CHANGESEC  LOOPS TILL SEC CHANGES  
  193.    
  194.       ;clrw                          ;DUMMY
  195.       ;xorwf sec,w              ;DUMMY
  196.       ;btfsc STATUS,2       ;DUMMY
  197.       ;incf sec,f               ;DUMMY
  198.  
  199. Changesec:               ;loops checking new sec and new wheel pulse
  200.      movf  oldsec, w
  201.      xorwf sec,w    
  202.                   ; if equal, w= 0 and Z bit=1
  203.     btfsc STATUS,2    ; test Z bit
  204.     goto  Changesec  ; no change, loop
  205.     movf  sec,w          ; sec has  increased, update
  206.     movwf oldsec       ; sec and oldsec are = again
  207.     incf  menu,f          ; increases menu every sec
  208.                  
  209.  
  210.             ; Note1, sectotlo/hi are updated every sec in ISR module
  211.             ; Note2, Decimal time also created in ISR module
  212.                              ; but time display for LCD  controlled
  213.                              ; the automatic menu below
  214.          
  215.       call Disptime   ;TRIP time,  will appear on LCD top line
  216.  
  217. Changewhp:          ; 1st detected wheelpulse starts menu sequence                
  218.                                    
  219.       clrf PORTB
  220.       bcf PORTB,5   ; start with green LED off
  221. loop:
  222.       btfss PORTB, 4  ;(PUT BTFSC FOR TEST); i/p hi,?DUMMY
  223.       goto loop            ; not yet
  224.                                  ; i/p hi detected
  225.                  ;green LED flashes with every wheel pulse    
  226.       bsf PORTB, 5    ; LED on
  227.                                 ; wait a while to make sure switch has
  228.                                 ; settled  
  229.       movlw D'10'      ; wait about 10 msec
  230.       call nmsec
  231.          
  232.       btfsc PORTB, 4  ; will be lo (0) when finished
  233.       goto $ -1            ; still low
  234.                                 ; now must wait a make sure bouncing stopped
  235.       movlw D'10'       ; 10 milliseconds
  236.       call nmsec
  237.                                 ; and check again
  238.       btfsc PORTB, 4 ; if set, not finished
  239.       goto $ -5            ; still hi start debounce  wait again
  240. Tp1:                         ; green LED ready for next wheel pulse
  241.       bcf PORTB,5        ; i.e. LED off
  242.       movf PORTB,w  ; reading to clear
  243.        
  244.  
  245.                                        
  246. ;              AUTOMATIC MENU: (LCD Top line always time)  
  247. ;              --------------
  248.                 ; menu s at 10sec intervals in rotation
  249.                 ; Speed            menu  1 to 10
  250.                 ; Dist ance       menu 11 to 20
  251.                 ; Velav Avg vel menu 21 to 30
  252.          
  253.                           ; MENU 0 TO 10
  254.  
  255. ; as speed ( Speed) is stand alone, no sense in calculating it
  256. ; if it is not going to be displayed when menu is >10.
  257. ; BUT if SPEED AVERAGING IS TO BE USED,  kill off  the lines below that bypass
  258. ; the SPEED calc module
  259.  
  260. Menucheck:
  261.       movlw 0x0A          ;check menu > 10  (to meet >10 AND =<20)
  262.       subwf menu,w
  263.       btfss STATUS,C   ;compare with 10
  264.       goto $+2               ;menucount =< 10 not yet got to 11 jump to Speed
  265.       goto Distblk
  266.      
  267.       call Speed            ; Calculates instant speed,(time between pulses)
  268.       movlw 0x0A         ; DUMMY, was  movlw 0xA
  269.       subwf menu,w
  270.       btfss STATUS,C  ;compare with 10
  271.       call Spdflgcheck  ;menucount =< 10 ; also see 0-1 spdflg  
  272.       goto Distblk
  273.  
  274. Spdflgcheck:
  275.       clrw  
  276.       xorwf spdflg,w
  277.       btfsc STATUS,Z
  278.       call Dispd        ;menucount =< 10 AND  spdflg =1
  279.       Return
  280.  
  281. Distblk:
  282.       call Dist        ;menucount  > 10 skip Dispd update Dist
  283.  
  284.  
  285.                                   ; MENU 11 TO 20
  286.       movlw 0x0A       ;check menu > 10  (to meet >10 AND =<20)
  287.       subwf menu,w
  288.       btfss STATUS,C   ;compare with 10
  289.       goto $+5         ;menucount =< 10 not yet got to 11 jump to velav
  290.       movlw 0x14
  291.       subwf menu,w
  292.       btfss STATUS,C   ;compare with 20
  293.       call Dispdist    ;menucount =< 20  
  294.       call Velav       ;menucount  > 20 skip dispdist update  Velav
  295.  
  296.  
  297.                           ; MENU 20 TO 30
  298.       movlw 0x14         ;check menu > 20  (to meet >20 AND =<30)
  299.       subwf menu,w
  300.       btfss STATUS,C  ;compare with 20
  301.       goto $+5             ;menucount =< 20 not yet got to 21 jump to NEXT
  302.       movlw 0x1E
  303.       subwf menu,w
  304.       btfss STATUS,C  ;compare with 30
  305.       call Dispvav         ;menucount =< 30
  306.       movlw 0x1F        ;if it has reached 31 reset menu, before return  
  307.       xorwf menu,w      
  308.       btfss STATUS,Z  
  309.       goto $ +2           ; not 31 goto changewhp1 direct
  310.       clrf menu           ; is 31, reset menu before changewhp1
  311.  
  312. Menuend:
  313.                                ; before changewhp jump, check that sec has not updated
  314.                                ; if it has , jump back to changesec routine
  315.       movf  oldsec, w
  316.       xorwf sec,w          ; if equal, w= 0 and Z bit=1
  317.       btfsc STATUS,2   ; test Z bit
  318.       goto  Changewhp ; no sec change, check whpulse change
  319.       goto  Changesec  ; a new sec starts measurements  
  320.  
  321.                                    ; loop while NOT newsec
  322. ; ---------------------------------------------------------------
  323. ;                          End Main
  324. ; ----------------------------------------------------------------
  325.  
  326.    
  327.  
  328.  
  329.  
  330.  
  331.  
  332.  
  333. ;----------------------------------------------------------------------;
  334. ; ISR, increments TMR0 by 1 every 256 ľsec. Basically just             ;
  335. ; reset the INTCON and TMR0 bits. The FSR,w, STATUS push pop kept      ;
  336. ;----------------------------------------------------------------------;
  337. Isr:
  338.             movwf w_temp             ; save W
  339.             swapf STATUS,W        ; save status
  340.             movwf status_temp      ; without changing flags
  341.             swapf FSR,W               ; save FSR
  342.             movwf fsr_temp           ; without changing flags
  343.  
  344.                                      ;256us * 217 * 18 = 0.999936 sec.  
  345.                                      ;1hr_err = 0.23sec or 1 sec in 4hr
  346.  
  347.   ;The time loop starts  with TMR0 loaded with  (256-217)=39 After 217
  348.   ;steps interrupt is set, TMR0 rolls to zero and the TMR18 inc +1  
  349.  
  350.             movlw D'39'           ;39 = 0x27
  351.             movwf TMR0
  352.             incf  TMR18,f
  353.             movlw D'18'          ; DUMMY18 = 0x12
  354.             xorwf TMR18,w    ; if equal, w= 0 and Z bit=1
  355.             btfss STATUS,2   ; test Z bit
  356.             goto  restore        ; NOT 18 so pop stack and return to main
  357. Firstsec:
  358.             clrf  TMR18          ; is 18. set TMR18 to zero and INC sec            
  359.             incf  sec,f             ; also inc sectot (eventually lo and hi)
  360.  
  361.             incf  sectotlo,f      ; check sectot lo 00->inc hi
  362.             clrw
  363.            xorwf sectotlo,w   ; if equal, w= 0 and Z bit=1
  364.             btfsc STATUS,2
  365.             incf sectothi,f      ; increases every 256 x sectotlo
  366.  
  367.             movlw 0xA          ; check if =10
  368.            xorwf sec,w          ; if equal, w= 0 and Z bit=1
  369.            btfss STATUS,2   ; test Z bit
  370.            goto  restore        ; NOT 10 so pop stack and return to main
  371.  
  372.             clrf sec               ; is 10. set sec to zero and inc sec10
  373.             incf sec10,f        
  374.             movlw 0x6         ; = 0x6
  375.             xorwf sec10,w   ; if equal, w= 0 and Z bit=1
  376.             btfss STATUS,2  ; test Z bit
  377.             goto  restore      ; NOT 6 so pop stack and return to main
  378.  
  379.  
  380.             clrf  sec10         ; is 6. set sec10  to zero and INC min            
  381.             incf  min,f
  382.             movlw 0xA       ; check if =10
  383.             xorwf min,w     ; if equal, w= 0 and Z bit=1
  384.             btfss STATUS,2  ; test Z bit
  385.             goto  restore        ; NOT 10 so pop stack and return to main
  386.  
  387.             clrf min                ; is 10. set sec to zero and inc min10
  388.             incf min10,f        
  389.             movlw 0x6          ;= 0x6
  390.            xorwf min10,w     ; if equal, w= 0 and Z bit=1
  391.            btfss STATUS,2  ; test Z bit
  392.             goto  restore      ; NOT 6 so pop stack and return to main
  393.  
  394.             clrf  min10         ; is 6. set min10  to zero and INC hr            
  395.             incf  hr,f
  396.             movlw 0xA        ;check if =10
  397.             xorwf hr,w         ; if equal, w= 0 and Z bit=1
  398.             btfss STATUS,2  ; test Z bit
  399.             goto  restore       ; NOT 10 so pop stack and return to main
  400.  
  401.             clrf hr                   ; is 10. set hr to zero and inc hr10
  402.             incf hr10,f        
  403.             movlw 0xA          ;= 10
  404.             xorwf hr10,w       ; if equal, w= 0 and Z bit=1
  405.            btfss STATUS,2  ; test Z bit
  406.             goto  restore      ; NOT 10 so pop stack and return to main  
  407.  
  408.                              
  409.                              
  410.             clrf sec              ; is ten (99hr 59min 59sec +1sec) we are at MAX
  411.             clrf sec10          ;all reset to zero and start again
  412.             clrf min
  413.             clrf min10
  414.             clrf hr
  415.             clrf hr10
  416.             clrf TMR18
  417.             clrf oldsec
  418.             goto restore
  419.  
  420. restore:
  421.             swapf status_temp,W      ; get original status back
  422.             movwf STATUS             ; into status register
  423.             swapf fsr_temp,W         ; get original fsr back
  424.             movwf FSR                  ; into status register
  425.             swapf w_temp,f           ; old no flags trick again
  426.             swapf w_temp,W         ; to restore W
  427.             bcf INTCON,T0IF        ; clear the TMR0 interrupt flag
  428.             retfie                           ; finished, reset GIE
  429.  
  430. ;----------------------------------------------------------------------;
  431. ;                       Initialize the ports                           ;
  432. ;----------------------------------------------------------------------;
  433. Init:
  434.             clrf   PORTA
  435.             clrf   PORTB
  436.  
  437.             movlw B'00000000'          ;  Porta all outputs
  438.             tris PORTA
  439.  
  440.             movlw B'01010000'          ; 7o 6i-Wire 5o-LED 4i-multivib,
  441.             tris PORTB                     ; 0to3lcd
  442.  
  443.  
  444.             movlw B'00000111'          ;  opt pull-ups enabled                                    
  445.                                                      ;  opt prescaler assigned to TMR18
  446.                                                      ;  opt prescaler set to 1:256
  447.             option                               ;  opt rolls over each 125th second
  448.                            
  449.  
  450.  movlw 0                                       ;  zero out all registers
  451.  
  452.    
  453.  clrf m
  454.  clrf m10
  455.  clrf m100
  456.  clrf m1000
  457.  clrf dm
  458.  clrf dm10
  459.  clrf dm100
  460.  clrf dm1000
  461.  clrf dm10000
  462.  clrf dm100000
  463.  
  464.  clrf totmshi
  465.  clrf totmslo
  466.  clrf totms2hi
  467.  clrf totms2lo
  468.  clrf dist54
  469.  
  470.            
  471.  clrf hr10
  472.  clrf hr
  473.  clrf min10                
  474.  clrf min
  475.  clrf oldsec
  476.  clrf sec10
  477.  clrf sec
  478.  clrf sectotlo
  479.  clrf dtotlo
  480.  clrf dtothi
  481.  clrf sectotlo
  482.  clrf sectothi
  483.  clrf TMR18   ; when this reaches 18, 1 sec has elapsed        
  484.            
  485.    
  486.             ; TMR0 has to start at 256-217 :39, so that the first rollover
  487.             ; with prescaler 256, happens in 217*256us =0.055552sec
  488.             ; The TMR18 incs each roll and after 18  1 sec has elapsed
  489.             movlw 0x27       ; D39  
  490.             movwf TMR0    ; set to D39 217 counts later 256,
  491.                                      ; TMR0 resets and inc TMR18 in Isr loop
  492.  
  493.            clrf  INTCON      ; START WITH ALL AT 0
  494.        
  495.                                   ; movlw B'10100000'          ; GIE set T0IE set, T0IF cleared
  496.           movlw B'10100000' ; Set:GIE,T0IE,RBIE Clrd:T0IF,RBIF
  497.           movwf INTCON      ; ready to detect interrupts in ISR
  498.           return
  499.  
  500. ;----------------------------------------------------------------------;
  501. ;                 Initialize the LCD                                   ;
  502. ;----------------------------------------------------------------------;
  503. Initlcd:
  504.   movlw D'40'
  505.   call   nmsec                  ;  Wait 40 msecs before Reset
  506.   bcf    RS                       ;  send an 8 bit instruction
  507.   movlw  0x03                 ;  Reset Command
  508.  
  509.   call   NybbleOut          ;  Send the Nybble
  510.   call   Dlay5                  ;  Wait 5 msecs before Sending Again
  511.  
  512.   call EStrobe
  513.   call Dlay160                ;  Wait 160 usecs before Sending 2nd Time
  514.   call EStrobe
  515.   call Dlay160                ;  Wait 160 usecs before Sending 3rd Time
  516.   bcf    RS                     ;  send an 8 bit instruction
  517.   movlw  0x02               ;  Set 4 Bit Mode
  518.  
  519.   call   NybbleOut              
  520.   call Dlay160
  521.   movlw  0x028                  ;  4 bit, 2 Line, 5x7 font
  522.   call   SendINS
  523.   movlw  0x010                  ;  display shift off
  524.   call   SendINS
  525.   movlw  0x001                  ;  Clear the Display RAM
  526.   call   SendINS
  527.   call   Dlay5                      ;  Note, Can take up to 4.1 msecs
  528.   movlw  0x006                  ;  increment cursor
  529.   call   SendINS
  530.   movlw  0x00C                 ;  display on cursor off
  531.   call   SendINS
  532.   return
  533.  
  534. ;----------------------------------------------------------------------;
  535. ;              Send the character in W out to the LCD                  ;
  536. ;----------------------------------------------------------------------;
  537. SendASCII
  538.   addlw '0'                     ;  Send nbr as ASCII character
  539.  
  540. SendCHAR:                  ;  Send the Character to the LCD
  541.   movwf  temp               ;  Save the temporary Value
  542.   swapf  temp, w           ;  Send the High Nybble
  543.   bsf    RS                     ;  RS = 1
  544.   call   NybbleOut
  545.   movf   temp, w            ;  Send the Low Nybble
  546.   bsf    RS
  547.   call   NybbleOut
  548.   return
  549.  
  550. ;-------------------------------------------------------------
  551. ;              ES strobe
  552. ;-------------------------------------------------------------
  553. EStrobe:                ;  Strobe the "E" Bit
  554.  
  555.   bsf    E
  556.   bcf    E
  557.   return
  558. ;----------------------------------------------------------------------;
  559. ;              Send an instruction in W out to the LCD                 ;
  560. ;----------------------------------------------------------------------;
  561. SendINS:                  ;  Send the Instruction to the LCD
  562.   movwf  temp           ;  Save w
  563.   swapf  temp, w       ;  send Hi Nybble
  564.   bcf    RS                 ;  RS to 0
  565.   call   NybbleOut
  566.   movf   temp, w        ;  Send Lo Nybble
  567.   bcf    RS
  568.   call   NybbleOut
  569.   return
  570.  
  571. ;----------------------------------------------------------------------;
  572. ;              Send the nibble in W out to the LCD                     ;
  573. ;----------------------------------------------------------------------;
  574. NybbleOut:              ;  Send a Nybble to the LCD
  575.   movwf  PORTB        
  576.   call EStrobe          ;  Strobe out the LCD Data
  577.   bsf    E
  578.   call Dlay160          ;  delay for 160 usec
  579.   return
  580.  
  581. ;----------------------------------------------------------------------;
  582. ;                   Output the message on the LCD                      ;
  583. ;----------------------------------------------------------------------;
  584. OutMessage1:
  585.   movwf  FSR                    ;  Point at first letter
  586. OutLoop:
  587.   movf   FSR, w                 ;  Get pointer into W
  588.   incf   FSR, f                     ;  Set up for next letter
  589.   call   Dispmsg1               ;  Get character to output
  590.   iorlw  0                            ;  At the End of the Message?
  591.   btfsc  STATUS, Z            ;  Skip if not at end
  592.   return                              ;  Yes - Equal to Zero
  593.   call   SendCHAR             ;  Output the ASCII Character
  594.   goto   OutLoop                ;  Get the next character
  595.  
  596. ;----------------------------------------------------------------------;
  597. ;                    Data for message to be output                     ;
  598. ;----------------------------------------------------------------------;
  599. Dispmsg1:                         ;  Message to Output
  600.   addwf  PCL, f                  ;  Output the Characters
  601.   dt     "Bike Computer", 0
  602.  
  603. Dispmsg2:                       ;  Message to Output
  604.   addwf  PCL, f                 ;  Output the Characters
  605.   dt     "Dist", 0  
  606.  
  607. Dispmsg3:
  608.   addwf PCL,f                 ; message to output
  609.   dt     " Av speed:",0      ; output characters
  610.  
  611.  ;----------------------------------------------------------------------;
  612.  ;                        time delay routines                           ;
  613.  ;----------------------------------------------------------------------;
  614. ;Note . The original application needed precise times  the  delay code that
  615.  ; follows. But the Simple  Bike application does NOT use the routines for
  616.  ; any CRITICAL time measurement.
  617.  
  618. Dlay160:    
  619.   movlw D'41'                ;  delay about 160 usec
  620.  
  621. micro4:    
  622.  addlw H'FF'                ;  subtract 1  'W'
  623.  btfss STATUS,Z         ;  skip when you reach zero
  624.  goto micro4                ;  more loops
  625.  return                    
  626.  
  627. Dlay5:      
  628.  movlw 5                     ;  delay for 5 milliseconds    
  629.  goto $ + 2
  630. msec250:    
  631.  movlw D'250'              ; delay for 250 milliseconds
  632.  
  633.                             ; --- N millisecond delay routine ---
  634. nmsec:      
  635.  movwf cntmsec            ; delay for N (you put in W) millisec
  636. msecloop:  
  637.  movlw D'254'               ; load takes .9765625 microsec
  638.  call micro4                  ; by itself CALL takes ...
  639.                                     ; about 1ms
  640.                                        
  641.  nop                             ; 1usec
  642.  decfsz cntmsec, f       ; .98 skip not taken, else 1.95
  643.  goto msecloop           ; 1.95 here: total ~1000 / loop
  644.  return                         ; final time through ~999 to here
  645.                                    ; overhead in and out ignored
  646.  
  647.                                   ; this block is functional for tests, but not used in bike
  648. Dlay1sec:          ; this is a marker routine to see where
  649.  call msec250             ; the prg is at.
  650. ; bsf  LED
  651.  call msec250          ;flash led on portb pin6
  652. ;bcf  LED
  653.  call msec250
  654. ; bsf  LED
  655.  call msec250   ; finishes with green led lit
  656.  return
  657.  
  658. ;----------------------------------------------------------------------;
  659. ;                       Display the Time                               ;
  660. ;----------------------------------------------------------------------;
  661. Disptime:
  662.    
  663.  movlw H'80'        ;  position at beginning of first line
  664.  call SendINS
  665.  movf hr10, W      ;  tens of hours
  666.  call SendASCII
  667.  movf hr, W          ;  hours
  668.  call SendASCII
  669.  movlw ":"        
  670.  call SendCHAR
  671.  movf min10, W    ;  tens of minutes
  672.  call SendASCII
  673.  movf min, W        ;  minutes
  674.  call SendASCII
  675.  movlw ":"
  676.  call SendCHAR
  677.  movf sec10, W    ;  tens of seconds
  678.  call SendASCII
  679.  movf sec, W       ;  seconds
  680.  call SendASCII
  681.  movlw " "
  682.  call SendCHAR   ; the h m s really not needed
  683.  movlw "h"
  684.  call SendCHAR
  685.  movlw "m"
  686.  call SendCHAR
  687.  movlw "s"
  688.  call SendCHAR
  689.  movlw " "
  690.  call SendCHAR
  691.  
  692. Dispend:
  693.               RETURN
  694.  
  695. ;----------------------------------------------------
  696. ;               End of display time
  697. ;----------------------------------------------------
  698.  
  699.  
  700. ;----------------------------------------------------------------------;
  701. ;                    Display the Distance , (trip distance at moment)                               ;
  702. ;----------------------------------------------------------------------;
  703. Dispdist:      
  704.  movlw H'C0'       ;  position at beginning of second line
  705.  call SendINS
  706.  
  707.  movf dm100000, W     ;  0 of 065km 536m
  708.  call SendASCII
  709.  
  710.  movf dm10000, W      ;  6 of 065km 536m
  711.  call SendASCII
  712.  
  713.  
  714.  movf dm1000, W       ;  5 of 065km 536m
  715.  call SendASCII
  716.  
  717.  movlw "k"                 ;  k of 065km 536m
  718.  call SendCHAR
  719.  movlw "m"                ;  m of 065km 536m
  720.  call SendCHAR
  721.  movlw " "                  ;  " " of 065km 536m
  722.  call SendCHAR
  723.  
  724.  movf dm100,W         ;  5 of 065km 536m
  725.  call SendASCII
  726.  
  727.  movf dm10,W          ;  3 of 065km 536m
  728.  call SendASCII
  729.  movf dm, W             ;  6 of 065km 536m
  730.  call SendASCII
  731.              
  732.  movlw "m"               ;  m of 065km 536m    
  733.  call SendCHAR
  734.  
  735.  movlw " "                 ; " "  
  736.  call SendCHAR
  737.  movlw "D"               ; "D "  
  738.  call SendCHAR
  739.  movlw "i"                ; " i"  
  740.  call SendCHAR
  741.  movlw "s"               ; "s "  
  742.  call SendCHAR
  743.  movlw "t"                ; " t"  
  744.  call SendCHAR
  745.  movlw " "               ; " " ( to wipe screen)
  746.  call SendCHAR  
  747.  
  748. Distend:
  749.               RETURN
  750.  
  751.  
  752. ;
  753. ;---------------------------------------------------------------------*
  754. ;                Multiplication  16x16 Out32
  755. ;---------------------------------------------------------------------*
  756. Mult16x16:
  757.         clrf mq4
  758.         clrf mq3
  759.         clrf mq2
  760.         clrf mq1
  761.  
  762.  
  763.         bsf mq2, 7
  764. Mu1:
  765.         rrf mah, f
  766.         rrf mal, f
  767.         skpc
  768.         goto Mu2
  769.         movf mbl, w
  770.         addwf mq3, f
  771.         movf mbh, w
  772.         skpnc
  773.         incfsz mbh, w
  774.         addwf mq4, f
  775. Mu2:
  776.         rrf mq4, f
  777.         rrf mq3, f
  778.         rrf mq2, f
  779.         rrf mq1, f
  780.         skpc
  781.         goto Mu1
  782.  
  783. Endmult16:
  784.       clrf mbh
  785.       clrf mbl
  786.       clrf mah
  787.       clrf mal
  788.  
  789.         Return
  790.  
  791.  
  792.        
  793.  
  794. ;---------------------------------------------------------------------*
  795. ;            End Multiplication   16x16 Out32
  796. ;---------------------------------------------------------------------*
  797.  
  798. ;---------------------------------------------------------------------*
  799. ;       New routine Division  16/16 Out 16
  800. ; ---------------------------------------------------------------------*
  801. ; Finally:- Result 000AH in reshi/lo, remainder 0096H in rmdrhi/lo
  802. ; so, checking end of division A=10 and 96H/E1H= 150/225 =0.666  OK
  803.  
  804. Div:
  805.        call    D_divS          ; remainder in Rmdr.
  806. Divend:
  807.           nop
  808.           return
  809. D_divS:
  810.         call    setup
  811.         clrf    rmdrhi
  812.         clrf    rmdrlo
  813. dloop:
  814.       bcf     STATUS,C
  815.         rlf     reslo, f
  816.         rlf     reshi, f
  817.         rlf     rmdrlo, f
  818.         rlf     rmdrhi, f
  819.         movf    denhi,w
  820.         subwf   rmdrhi,w      ;check if a>c
  821.         btfss   STATUS,Z
  822.         goto    nochk
  823.         movf    denlo,w
  824.         subwf   rmdrlo,w      ;if msb equal then check lsb
  825. nochk:
  826.         btfss   STATUS,C    ;carry set if c>a
  827.         goto    nogo
  828.         movf    denlo,w        ;c-a into c
  829.         subwf   rmdrlo, f
  830.         btfss   STATUS,C
  831.         decf    rmdrhi, f
  832.         movf    denhi,w
  833.         subwf   rmdrhi, f
  834.         bsf     STATUS,C    ;shift a 1 into b (result)
  835. nogo:
  836.                 rlf     numlo,f
  837.         rlf     numhi,f
  838.         decfsz  temp, f        ;loop untill all bits checked
  839.         goto    dloop
  840.  
  841. setup:
  842.                 movlw   .16             ; for 16 shifts
  843.         movwf   temp
  844.         movf    numhi,w      ;move Num to Res
  845.         movwf   reshi
  846.         movf    numlo,w
  847.         movwf   reslo
  848.         clrf    numhi
  849.         clrf    numlo
  850.         retlw   0
  851.  
  852.  ;--------------------------End Div 16 by 16----------------------------
  853.  
  854.  
  855.  
  856.         return
  857.        
  858. ;---------------------------------------------------------------------*
  859. ; END DIVISION  16/16 OUT 16
  860. ;---------------------------------------------------------------
  861.  
  862. ;---------------------------------------------------------------------*
  863. ; START Addition  16-16 OUT 16
  864. ;---------------------------------------------------------------
  865. Add:  ; R = q1 + q2
  866.  
  867.         movf q1lo, W
  868.         addwf q2lo, W
  869.         movwf rlo
  870.  
  871.         movf q1hi, W
  872.         btfsc STATUS, C
  873.         addlw .1                ; If A Carry Occurred, Add 1
  874.  
  875.         addwf q2hi, W
  876.         movwf rhi
  877.         ;clrf q1hi                  ; added this to stop next user summing;
  878.         ;clrf q1lo
  879.         ;clrf q2hi
  880.         ;clrf q2lo
  881.        
  882.         Return
  883.  
  884. ;---------------------------------------------------------------------*
  885. ; END Addition  16-16 OUT 16
  886. ;---------------------------------------------------------------
  887.  
  888.  
  889.  
  890. ;---------------------------------------------------------------------*
  891. ; START Subtraction  16-16 OUT 16
  892. ;---------------------------------------------------------------
  893.  
  894.  
  895. Sub:    ; R = q1 - q2
  896.  
  897.         movf q2lo, W
  898.         subwf q1lo, W   ; W = q1lo - q2lo
  899.         movwf rlo
  900.  
  901.         btfss STATUS, C
  902.         Goto Borrow
  903.         Goto Sub1
  904. Borrow:
  905.         Decf q1hi, F
  906.        
  907. Sub1:
  908.         movf q2hi, W
  909.         subwf q1hi, W   ; W = q1hi - q2hi
  910.         movwf rhi
  911.  
  912.         Return
  913.  
  914. ;---------------------------------------------------------------
  915. ; END Subtraction  16-16 OUT 16
  916. ;---------------------------------------------------------------
  917.  
  918.  
  919.  
  920.  
  921.  
  922.  
  923. ;---------------------------------------------------------------
  924. ;                 Dist = counting wheel pulses
  925. ;---------------------------------------------------------------
  926.  
  927. Dist:                ; whlcirc = 2.0747, for initial test =2
  928.                       ;  
  929.                       ; movlw 0x2          ; <-- don't forget, this is just for 26"wheel
  930.                      ; movwf whlcirc  ; start count at 0 and inc till same as whlcirc
  931.                      ; (range will be 1 to 4 m)
  932.  
  933.          clrf count     ;  count can be 2 or 4 in this 26" case
  934.  
  935. Whloop:            ; although the distance pulses ( in this example) jump in steps of 2m
  936.                         ; the m counter has to increase in 1's to catch the
  937.                  ; decimal rollover  10 to 0
  938.                          ; so count, here, is stepped  0 to 2 (whlcirc)
  939.                          ; Also, when the dist54 var increases 54m, COUNT adds an  extra 2m  
  940.                          ; to the hex and decimal totals, before resetting to zero.
  941.                 ; Note that as dist54 is in the loop it will also receive
  942.                  ; the 2m increase so it  really  counts to 56 (54 +2).
  943.  
  944.  
  945.        movlw 0x2               ; wheel circumference  of 26 inch
  946.        xorwf count,w          ; if equal, w= 0 and Z bit=1
  947.        btfsc STATUS,2      ; test Z bit
  948.        goto DistanceEnd    ; they are the same, so jump distanceEnd and return  
  949.        goto Mcount            ; NOT  yet = whlcirc, so inc mcount by 1 and  return  
  950.  
  951. Mcount:       ; Distance to decimal for display , i/p m, o/p 000km 000m
  952.             ; starts  with m, m10, m100, m1000 , m10000, m100000 = 0
  953.             ; Later correct m every 54m (add 2m ???? )
  954.  
  955.       incf dm,f
  956.       movlw D'10'      
  957.       xorwf dm,w           ; if equal, w= 0 and Z bit=1
  958.       btfss STATUS,2   ; test Z bit
  959.       goto Mcountend   ; NOT 0 so return
  960.  
  961.       clrf dm
  962.       incf dm10,f
  963.       movlw D'10'    
  964.       xorwf dm10,w      ; if equal, w= 0 and Z bit=1
  965.       btfss STATUS,2   ; test Z bit
  966.       goto Mcountend   ; NOT 0 so return
  967.  
  968.       clrf dm10
  969.       incf dm100,f
  970.       movlw D'10'      
  971.       xorwf dm100,w     ; if equal, w= 0 and Z bit=1
  972.       btfss STATUS,2   ; test Z bit
  973.       goto Mcountend   ; NOT 0 so return
  974.  
  975.       clrf dm100
  976.     incf dm1000,f
  977.       movlw D'10'        
  978.       xorwf dm1000,w    ; if equal, w= 0 and Z bit=1
  979.       btfss STATUS,2   ; test Z bit
  980.       goto Mcountend   ; NOT 0 so return
  981.  
  982.       clrf dm1000
  983.       incf dm10000,f
  984.       movlw D'10'      
  985.       xorwf dm10000,w   ; if equal, w= 0 and Z bit=1
  986.       btfss STATUS,2   ; test Z bit
  987.       goto Mcountend   ; NOT 0 so return
  988.      
  989.       clrf dm10000
  990.       incf dm100000,f
  991.       movlw D'10'        
  992.       xorwf dm100000,w  ; if equal, w= 0 and Z bit=1
  993.       btfss STATUS,2      ; test Z bit
  994.       goto Mcountend      ; NOT 0 so return
  995.       clrf dm                     ; is distmax, reset to 0     
  996.       clrf dm10
  997.       clrf dm100
  998.       clrf dm1000
  999.       clrf dm10000
  1000.       clrf dm100000
  1001.  
  1002.       goto Mcountend  ; see if whpl  update is now finished
  1003.  
  1004.  
  1005.  
  1006.          
  1007. Mcountend:  ;update the hex counters dtot /lo/hi/hi2
  1008.       incf dtotlo,f
  1009.       clrw
  1010.       xorwf dtotlo,w       ; if equal, w= 0 and Z bit=1
  1011.       btfss STATUS,2   ; test Z bit
  1012.       goto Dtotend        ; dtotlo NOT 0
  1013.       incf dtothi,f           ; add 1, dtotlo is 0
  1014.       clrw
  1015.       xorwf dtothi,w      ; if equal, w= 0 and Z bit=1
  1016.       btfss STATUS,2   ; test Z bit
  1017.       goto Dtotend        ; dtothi NOT 0
  1018.       incf dtothi2,f         ; add 1, dtothi is 0
  1019.  
  1020. Dtotend:
  1021.       movlw D'54'
  1022.       movwf numhi       ; not in use here, use to store 54
  1023.       movf  dist54,w                     
  1024.       subwf numhi,w
  1025.       btfsc STATUS,C      
  1026.       goto  Noextra      ; dist54=< 53, don't freeze COUNT
  1027.      movlw D'56'        ; dist54>53   add 2 extra counts
  1028.      movwf numhi      ; not in use here to store 56
  1029.       movf  dist54,w                     
  1030.      subwf numhi,w
  1031.      btfsc STATUS,C              
  1032.      goto  Extra          ; dist54=< 56, freeze COUNT
  1033.      clrf dist54
  1034.      goto Noextra
  1035.  
  1036.  
  1037.  
  1038. Noextra:
  1039.     incf dist54,f
  1040.     incf count,f
  1041.    goto Whloop
  1042.  
  1043. Extra:                          ; an extra loop BUT count is NOT increased
  1044.    incf dist54,f
  1045.   goto Whloop    
  1046.  
  1047. DistanceEnd:  ;  All conversion loops have executed and
  1048.                       ; only left to display in decimal, when ed
  1049.                   ;  
  1050.      
  1051.  return          ; BACK TO MAIN
  1052.  
  1053.  
  1054. ;--------------------------------------------------------------------------
  1055. ;              End of Trip  Distance calculation Module
  1056. ;--------------------------------------------------------------------------
  1057.  
  1058.  
  1059. ;----------------------------------------------------------  
  1060. ;     Calculate Average velocity  Velav = totdist/totsec                   
  1061. ;-----------------------------------------------------------
  1062. ; 1st time round distto = 0 and sectot =0.
  1063. ; Disttot lo/hi zero is prob OKbut test sec=0. If zero return
  1064. Velav:
  1065.  
  1066.          
  1067.     clrw
  1068.     xorwf sectotlo,w
  1069.     btfss STATUS,Z
  1070.     goto  Spdstart     ; not 0, onto Avspeed calc
  1071.      clrw                ; lo was 0, but hi byte may not be
  1072.     xorwf sectothi,w
  1073.     btfss STATUS,Z    
  1074.     goto  Spdstart     ; was not 0, onto Avspeed calc
  1075.      ;incf  sectotlo,f   ; DUMMY
  1076.      ;goto  Spdstart   ; DUMMY
  1077.       return             ; was also 0, abort module  wait for sec inc
  1078.  
  1079.                 ; to slow down the number of whpul in the test we add Dummies  
  1080. Spdstart:                 ; for test delay incf sec and sectot, gives 7.2km/hr
  1081.            
  1082.      
  1083.       ;incf  sec,f        ; DUMMY
  1084.      ;incf sectotlo,f      ; DUMMY
  1085.  
  1086.  
  1087. ;Lpstart:
  1088.       movlw 0x07                 ; 1800   comp hi bytes
  1089.      subwf dtothi,w
  1090.      btfsc STATUS,C      
  1091.      goto  Divratio      ;  dtothi is > 1800hi and needs dividing
  1092.                          ;  we suppose that the hibyte test is sufficient,
  1093.                  ;  it may not be true. e.g hi's the same but lo's diff
  1094.                                ;  pass dtot to m1000,m100
  1095.    movf dtothi,w        ; dtothi <1800
  1096.    movwf m1000
  1097.    movf dtotlo,w
  1098.    movwf m100         ; m1000,m100 hold dtothi/lo ( no div needed)
  1099.    movf  sectothi,w    
  1100.    movwf m10
  1101.    movf sectotlo,w
  1102.    movwf m             ; m10,m hold sectothi/lo ( no div needed)  
  1103.  
  1104.                        ; note, this is dtot to m1000,m100 not needing division
  1105.    goto  Ratend       ; if divratio is needed, then m1000,m100 is used there
  1106.  
  1107. Divratio:                   ; enter variables and 1800
  1108.  
  1109.      movf  dtothi,w
  1110.      movwf numhi
  1111.      movf  dtotlo,w
  1112.      movwf numlo
  1113.      movlw 0x07
  1114.      movwf denhi
  1115.      movlw 0x08
  1116.      movwf denlo
  1117.      call  Div
  1118.      incf  reslo,w    ; reslo holds INT of Divratio +1
  1119.      movwf count   ; not used at the moment
  1120.      movf  dtothi,w ; divide dtothi/lo by count
  1121.      movwf numhi
  1122.      movf  dtotlo,w
  1123.      movwf numlo
  1124.      clrf  denhi
  1125.      movf  count,w  ; e.g. D 37
  1126.      movwf denlo
  1127.      call  Div          ; we need parking space for results, REuse the m1000 etc
  1128.      movf  reshi,w  
  1129.      movwf m1000 ;
  1130.      movf  reslo,w
  1131.      movwf m100   ; m1000, m100 =dtot/count
  1132.                            ; repeat for sectot
  1133.      movf  sectothi,w
  1134.      movwf numhi
  1135.      movf  sectotlo,w
  1136.      movwf numlo
  1137.      clrf  denhi
  1138.      movf  count,w    ; e.g D 37
  1139.      movwf denlo
  1140.      call  Div
  1141.      movf  reshi,w
  1142.      movwf m10  
  1143.      movf  reslo,w
  1144.      movwf m         ; m10, m =sectot/count
  1145. Ratend:
  1146.  
  1147. ;    WE CAN NOW DO DTOT/SECTOT x3.6  as we have SCALED TO AVOID OVERFLOW
  1148.  
  1149. ;                m1000,m100   x 36   (top line)
  1150. ;     Vav=   -------------------------                      = Average speed in km/hr
  1151.  
  1152. ;               m10,m        x 10   (bottom line)         ;     36(24H), 10(AH)
  1153.  
  1154.  
  1155.  
  1156.      movf m1000,w     ; MULT dtot, top line,  by 24H
  1157.      movwf mah
  1158.      movf m100,w
  1159.      movwf mal
  1160.      clrf  mbh
  1161.      movlw 0x24
  1162.      movwf mbl
  1163.      call  Mult16x16  ; ( store top line result in the same variables)
  1164.      movf  mq2,w
  1165.      movwf m1000
  1166.      movf  mq1,w
  1167.      movwf m100    ;  dtot x 36
  1168.  
  1169.     movf m10,w      ; MULT sectot, bottom line,  by AH
  1170.     movwf mah
  1171.     movf m,w
  1172.     movwf mal
  1173.      clrf  mbh
  1174.      movlw 0xA
  1175.      movwf mbl
  1176.      call  Mult16x16 ; ( store bottom line result in the same variables)
  1177.      movf  mq2,w
  1178.      movwf m10
  1179.      movf  mq1,w
  1180.      movwf m         ;  sectot x 10
  1181. Tp3:
  1182.  
  1183.       ; As we are reusing variables, trying to show where the results to here are being held
  1184.  ;                                      m1000,m100     
  1185. ;   We now have as  Average speed     ----- ---------       km/hr
  1186. ;                                                              m10,m
  1187.  
  1188.  
  1189.   ;the AVERAGE SPEED AT LAST
  1190.  
  1191.      movf  m1000,w  ; dtotx36/sectotx10
  1192.      movwf numhi
  1193.      movf  m100,w  
  1194.      movwf numlo
  1195.      movf  m10,w
  1196.      movwf denhi    ; needed below for decimal place
  1197.     movf  m,w
  1198.     movwf denlo    ; needed below for decimal place
  1199.     call  Div
  1200.                             ; denhi/lo can chanfge as the div routine reuses bits
  1201.                     ; so we reestablish previous denom values before losing
  1202.    movf  m10,w
  1203.    movwf denhi
  1204.    movf  m,w
  1205.    movwf denlo   ; we can now write over m and m10  
  1206.                        
  1207.    movf  reshi,w  ;will be zero
  1208.                    ;(bikes don't exceed 256km/hr normally)
  1209.     movf  reslo,w  ; reuse variables m10 INT and later m FRAC
  1210.     movwf m10     ;we have integer part of Vav Average speed
  1211.                    
  1212.    
  1213.  
  1214.                          ; rmdrhi/lo holds decimal fraction.we will only use 1 decimal place.  
  1215.                 ; so mult the rmdrhi,lo x10  before dividing by denhi/lo
  1216.        
  1217.  
  1218.   movf  rmdrhi,w     ; mult top by 10
  1219.   movwf mah
  1220.   movf  rmdrlo,w
  1221.   movwf mal           ; rmdr in tot storage
  1222.   clrf  mbh
  1223.   movlw 0xA
  1224.   movwf mbl
  1225.   call  Mult16x16  ; rmdrhi,lo x 10
  1226.                             ; top line is now  mq2,mq1 ( nothing in mq4,mq3)  
  1227.                             ; Bottom line..remember we already have loaded
  1228.                            ; the denominator above which says  
  1229.                             ; " needed below for decimal place"  
  1230. Tp4:
  1231. movf mq2,w       ;rmdrhi,w      
  1232.     movwf numhi
  1233.     movf  mq1,w        ;rmdrlo,w    
  1234.     movwf numlo      
  1235.     call Div                ; div for the decimal( just 1 place), in reslo
  1236.                 ; reshi,reslo holds decimal place results
  1237.                                 ; m10+m are  av speed as INT+DEC but in hex
  1238.                                ; now change to decimal.
  1239.                                ; m10 and m are going to be wiped, but there is no
  1240.                                ;divide routine so for INT +FRAC we use reshi reslo
  1241.       movf  m10,w
  1242.       movwf reshi      ; OK? yes reshi +reslo = INT+FRAC in hex, convert         
  1243.        
  1244.  
  1245. Vavh2d:
  1246.  
  1247.      clrf m
  1248.      clrf m10
  1249.     clrf count
  1250.  
  1251. Vavloh2d:                ; m is 2nd dec, use m10
  1252.        movf  count,w
  1253.        xorwf reslo,w
  1254.        btfsc STATUS,Z
  1255.        goto  Vavloend                
  1256.        incf  count,f
  1257.          incf  m10,f
  1258.        movlw 0xA        
  1259.        xorwf m10,w
  1260.        btfss STATUS,Z
  1261.        goto Vavloh2d
  1262.        clrf m10
  1263.        incf m,f
  1264.        goto Vavloh2d
  1265.  
  1266. Vavloend:
  1267.  
  1268.       clrf m100
  1269.       clrf m1000
  1270.       clrf count
  1271.  
  1272. Vavhih2d:
  1273.        movf  count,w
  1274.        xorwf reshi,w
  1275.        btfsc STATUS,Z
  1276.        goto  Vavhiend                
  1277.        incf  count,f
  1278.        incf  m100,f
  1279.        movlw 0xA        
  1280.        xorwf m100,w
  1281.        btfss STATUS,Z
  1282.        goto Vavhih2d
  1283.        clrf m100
  1284.        incf m1000,f
  1285.        goto Vavhih2d
  1286.  
  1287. Vavhiend:                 ; We have Vav as: INT m1000,m100 and FRAC  m10,m with Frac
  1288.        
  1289.        
  1290.  
  1291. Vavend:
  1292.          nop
  1293.          return
  1294.  
  1295.  
  1296. ;----------------------------------------------------------------------;
  1297. ;                    Display the Average velocity                               ;
  1298. ;----------------------------------------------------------------------;
  1299. Dispvav:
  1300.        
  1301.  movlw H'C0'       ;  position at beginning of second line
  1302.  call SendINS
  1303.  
  1304.  
  1305.  
  1306.  movf m1000, W     ;    x0 tens of km
  1307.  call SendASCII
  1308.  
  1309.  
  1310.  movf m100,W         ;   0x ones of km
  1311.  call SendASCII
  1312.  
  1313.  movlw "."                 ;  "." punto decimal  
  1314.  call SendCHAR
  1315.  
  1316.  movf m10,W             ;  "0.x0" decimal
  1317.  call SendASCII
  1318.  movf m, W              ;  "0.0x" decimal
  1319.  call SendASCII
  1320.              
  1321.  movlw "k"                   ;  k  
  1322.  call SendCHAR
  1323.  movlw "m"                 ;  m  
  1324.  call SendCHAR
  1325.  
  1326.  movlw "/"                   ;  /
  1327.  call SendCHAR
  1328.  
  1329.  movlw "h"                  ;  h
  1330.  call SendCHAR
  1331.  movlw "r"                   ;  r
  1332.  call SendCHAR
  1333.  
  1334.  movlw " "                   ;  " "
  1335.  call SendCHAR
  1336.  
  1337.  movlw "V"                ;  V
  1338.  call SendCHAR
  1339.  movlw "e"                  ;  e
  1340.  call SendCHAR
  1341.  
  1342.  movlw "l"                  ;  l
  1343.  call SendCHAR
  1344.  movlw "A"                 ;  A
  1345.  call SendCHAR
  1346.  
  1347.  
  1348.  movlw "v"                 ;  v
  1349.  call SendCHAR
  1350.  movlw "g"                 ;  g
  1351.  call SendCHAR
  1352.  movlw " "                   ;  " "
  1353.  call SendCHAR
  1354.  
  1355.  
  1356. Dispvavend:
  1357.                
  1358.   Return                    ; to change seconds for next second
  1359.      
  1360. ;--------------END OF AV SPEED-------------------
  1361.  
  1362.  
  1363.  
  1364.  
  1365.  
  1366.  
  1367.  
  1368.    
  1369.  
  1370.  
  1371. ; ---------------------------------------------------------------      
  1372. ;                   Instantaneous Speed  
  1373. ;-----------------------------------------------------------------      
  1374.  ;  Previous time values  are subtracted    the present
  1375.  ;  sec, TMR18, TMR0 values.
  1376.  ;  This time difference is the time between
  1377.  ; wheel pulses. This in turn for 26" wheel is a distance of 2.0747m
  1378. ; is covered in totms
  1379. ; ---------------------------------------------------------------      
  1380. ;                   Instantaneous Speed  
  1381. ;-----------------------------------------------------------------      
  1382. ; Note sec can only move between  0 and 9, 10 is a new 0
  1383. ; We start by reading sec, TMR18, TMR0 TO GET START TIME
  1384.  
  1385. Speed:
  1386.  
  1387.                        
  1388. Spdflg0:                  ; FIRST TIMEwith spdflg=0, second time with spdflg=1
  1389.                              ; First time captures timezero 0 in ms in totms
  1390.         clrw
  1391.         xorwf spdflg,w
  1392.         btfss STATUS ,Z
  1393.         goto Spdflg1    ; spdflg is not 0, this is the second time
  1394.      call Summs
  1395.      movf  mshi,w
  1396.      movwf totmshi  
  1397.      movf  mslo,w
  1398.      movwf totmslo
  1399.      incf spdflg,f  ; (spdflg = 1 for  SECOND TIME)
  1400.      return   ;jump back to main menu
  1401.      
  1402. Summs:   ; this routine is common to the first and second time
  1403.      movf sec,w     ; spdflg = 0
  1404.      movwf mbl      ; sec can only be in range 0 to 9
  1405.      clrf  mbh
  1406.       movlw 0x03                ; 1000 = 03E8
  1407.      movwf mah  
  1408.       movlw 0xE8                ; 1000 = 03E8
  1409.      movwf mal  
  1410.         call  Mult16x16 ;
  1411.      movf  mq2,w    ; hi byte
  1412.      movwf mshi
  1413.      movf  mq1,w    ; lo byte
  1414.      movwf mslo
  1415.      
  1416.         movf  TMR18,w
  1417.         movwf mal
  1418.         clrf  mah
  1419.      movlw D'56'
  1420.      movwf mbl
  1421.      clrf  mbh
  1422.         call  Mult16x16 ;  after themult we add
  1423.         movf  mshi,w
  1424.        movwf q1hi    
  1425.         movf  mslo,w
  1426.        movwf q1lo    
  1427.         movf  mq2,w
  1428.        movwf q2hi    
  1429.         movf  mq1,w
  1430.        movwf q2lo    
  1431.        call  Add
  1432.         movf  rhi,w
  1433.        movwf mshi
  1434.         movf  rlo,w
  1435.        movwf mslo   ; sum  (sec +TMR18)
  1436.                         ;TMR0 is a little more complex as we have to subtract39
  1437.                         ; before we can calculate ms in TMR0
  1438.        movf  TMR0,w
  1439.        movwf q1lo
  1440.        clrf  q1hi
  1441.        movlw  D'39'
  1442.        movwf q2lo
  1443.        clrf q2hi
  1444.        call Sub
  1445.        movf rlo, w
  1446.        movwf numlo
  1447.        clrf  numhi
  1448.        movlw 0x4
  1449.        movwf denlo
  1450.        clrf  denhi
  1451.         call  Div
  1452.  
  1453.         movf  mshi,w
  1454.        movwf q1hi    
  1455.         movf  mslo,w
  1456.        movwf q1lo    
  1457.         movf  reshi,w
  1458.        movwf q2hi    
  1459.         movf  reslo,w
  1460.        movwf q2lo    
  1461.        call  Add  
  1462.        movf  rhi,w
  1463.        movwf mshi
  1464.        movf  rlo,w
  1465.        movwf mslo ;   ( SEC +TMR18+ TMR0) in ms mshi/lo
  1466.  
  1467.        RETURN     ; Summs
  1468. Summsend:
  1469.  
  1470.  
  1471.  
  1472.  
  1473. Spdflg1: ; SECOND TIME is with spdflg =1
  1474.                          ; Second time captures timezero to  2nd Pulse
  1475.                     ; in ms, store  in totms2
  1476.                     ; for test we add 250ms to simulate time between
  1477.                     ; wheel pulses
  1478.                     ; 250ms delay
  1479.      ;movlw D'63'   ; DUMMY FOR TEST
  1480.      ;call nmsec     ; DUMMY FOR TEST            
  1481.  
  1482.         call Summs
  1483.  
  1484.      movf  mshi,w   ;
  1485.      movwf totms2hi ;  
  1486.      movf  mslo,w    ;  
  1487.      movwf totms2lo  ;
  1488.  
  1489.  
  1490. ; totms2 should be larger than totms,however if totms2 has just rolled,
  1491. ; then add 10000 to tot2
  1492.  
  1493. Testtot2:
  1494.       movf  totms2hi,w
  1495.       subwf totmshi,w
  1496.       btfss STATUS,C   ;compare for greater
  1497.       goto  Diffms     ;totms2 > totms  no add 10000 needed
  1498.       movlw 0xA        ;totms2 < totms, add 10000, hex 2710
  1499.          movlw 0x27
  1500.       movwf q1hi
  1501.          movlw 0x10
  1502.       movwf q1lo
  1503.       movf totms2hi,w
  1504.          movwf q2hi  
  1505.       movf totms2lo,w
  1506.          movwf q2lo
  1507.       call  Add     ; tot2 +10000
  1508.          movf  rhi,w
  1509.       movwf totms2hi
  1510.          movf  rlo,w
  1511.       movwf totms2lo  ; tot2 = tot2+10000
  1512.  
  1513.  
  1514.              
  1515. Diffms:
  1516.  
  1517.  
  1518.     ; sub  (tot2-tot1)for time between wheel pulses
  1519.  
  1520.         movf   totms2hi,w  ;
  1521.      movwf  q1hi  
  1522.         movf   totms2lo,w
  1523.      movwf  q1lo      
  1524.  
  1525.         movf   totmshi,w
  1526.      movwf  q2hi  
  1527.         movf   totmslo,w
  1528.      movwf  q2lo    
  1529.      call   Sub  ; result is  time diff, stored in rhi, rlo
  1530. tp2:
  1531.   ; we are almost ready to divide dist/time for speed
  1532.   ; complete equation is dist/time x3.6
  1533.   ; to avoid as far as possible fractions we multiply before divide
  1534.   ; but this time, better divide first.
  1535.  
  1536.   ; 2000            36        <--- this is more than 65536
  1537.   ; ----       x    --------
  1538.   ; denhi/lo         10    ( denhi/lo is sub result rhi/lo)
  1539.  
  1540.   ; so we can divide by 10 and x by 36 ( always,)
  1541.   ; so top  line is simply 7200.
  1542.   ; we finally have 7200/(denhi/lo) , SPEED IN HEX
  1543.  
  1544.  
  1545.      movf   rhi,w
  1546.         movwf  denhi
  1547.      movf   rlo,w
  1548.         movwf  denlo  ; denom is time in hex
  1549.      movlw  0x1C   ; 7200, hex 1C20
  1550.      movwf  numhi
  1551.      movlw  0x20   ; 7200, hex 1C20
  1552.      movwf  numlo
  1553.         call Div
  1554.                    ; the result , res, is  more than 1
  1555.                         ;and a remainder rmdr/den
  1556.                    ;we now have 6 free variables
  1557.                    ; mshi/lo  for INT hex speed lo is enough
  1558.                         ; totmshi/lo
  1559.                         ; totms2hi/lo    
  1560.                    ;we will reuse to convert  hex to decimal
  1561.  
  1562.         movf  reslo,w
  1563.      movwf mshi   ; INT part of hex speed ( hi, because FRAC will be in lo)
  1564.  
  1565.                    ;we will only use 1 decimal of
  1566.                         ;the hex speed remainder, so 1st  rmdrx10  
  1567.                    ;  so next calculation is
  1568.  
  1569.                           ; 10 x rmdrhi/lo
  1570.                    ; ---------------
  1571.                       ; denhi/lo
  1572.  
  1573.      movf rmdrhi,w
  1574.      movwf mah
  1575.      movf rmdrlo,w
  1576.      movwf mal
  1577.         clrf  mbh
  1578.         movlw 0x0A
  1579.         movwf mbl
  1580.      call  Mult16x16  ;( ten times top)  
  1581.      movf  mq2,w
  1582.      movwf numhi
  1583.      movf  mq1,w
  1584.      movwf numlo  ; the den is previously loaded so divide for
  1585.                   ; decimal part of speed ( still in hex)
  1586.         call  Div    ; we only use 1 decimal, so just use lo of Div result
  1587.      movf  reslo,w
  1588.      movwf mslo    ; FRAC  of speed in hex
  1589.                   ; now convert speed to decimal form
  1590.                   ; i.e. mshi, mslo --> 99.9 km/hr
  1591.  
  1592. Spdh2d:
  1593.  
  1594.         clrf m
  1595.         clrf m10
  1596.         clrf m100
  1597.         clrf m1000
  1598.         clrf count
  1599.  
  1600.  
  1601. Spdlo:
  1602.       movf  count,w
  1603.       xorwf mslo,w
  1604.       btfsc STATUS,Z
  1605.       goto  Spdhicnt                
  1606.       incf  count,f
  1607.          incf  m10,f
  1608.       movlw 0xA        
  1609.       xorwf m10,w
  1610.       btfss STATUS,Z
  1611.       goto Spdlo
  1612.       clrf m10
  1613.       incf m,f
  1614.       goto Spdlo
  1615.  
  1616. Spdhicnt:
  1617.         clrf m100    
  1618.         clrf m1000
  1619.         clrf count
  1620.  
  1621. Spdhi:
  1622.       movf  count,w
  1623.       xorwf mshi,w
  1624.       btfsc STATUS,Z
  1625.       goto  Spdhiend                
  1626.       incf  count,f
  1627.          incf  m100,f
  1628.       movlw 0xA        
  1629.       xorwf m100,w
  1630.       btfss STATUS,Z
  1631.       goto Spdhi
  1632.       clrf m100
  1633.       incf m1000,f
  1634.       goto Spdhi
  1635.  
  1636. Spdhiend:; We have filled m1000,m100 with INT and m10,m with Frac, of Vin.
  1637.         ; Note we only need m10 ( 1 decimal place)
  1638.      clrf spdflg ; reset to 0 for next pair of pulses
  1639.  
  1640.  
  1641.  
  1642.  
  1643.  
  1644.  
  1645.  
  1646.     ; incf spdflg,f  ; (spdflg = 1 for  SECOND TIME)
  1647.  
  1648.         return
  1649. ; ---------------------------------------------------------------**
  1650. ;                         End of Instantaneous Speed
  1651. ; ---------------------------------------------------------------**
  1652.  
  1653.  
  1654.  
  1655. Dispd:
  1656. ;----------------------------------------------------------------------;
  1657. ;                    Display the Instantaneous Speed (Speed)                               ;
  1658. ;----------------------------------------------------------------------;
  1659.        
  1660. movlw H'C0'       ;  position at beginning of second line
  1661. call SendINS
  1662.  
  1663.  
  1664.  
  1665. movf m1000, W     ;    x0 tens of km
  1666. call SendASCII
  1667.  
  1668.  
  1669. movf m100,W         ;   0x ones of km
  1670. call SendASCII
  1671.  
  1672. movlw "."         ;  "." punto decimal  
  1673. call SendCHAR
  1674.  
  1675. movf m10,W     ;  "0.x0" decimal
  1676. call SendASCII
  1677. movf m, W      ;  "0.0x" decimal
  1678. call SendASCII
  1679.            
  1680. movlw "k"         ;  k  
  1681. call SendCHAR
  1682. movlw "m"         ;  m  
  1683. call SendCHAR
  1684.  
  1685. movlw "/"         ;  /
  1686. call SendCHAR
  1687.  
  1688. movlw "h"         ;  h
  1689. call SendCHAR
  1690. movlw "r"         ;  r
  1691. call SendCHAR
  1692.  
  1693.  
  1694. movlw " "         ;  " "
  1695. call SendCHAR
  1696.  
  1697. movlw "S"         ;  S
  1698. call SendCHAR
  1699. movlw "p"         ;  p
  1700. call SendCHAR
  1701.  
  1702. movlw "e"         ;  e
  1703. call SendCHAR
  1704. movlw "e"         ;  e
  1705. call SendCHAR
  1706.  
  1707.  
  1708. movlw "d"         ;  d
  1709. call SendCHAR
  1710.  
  1711. Dispdend:
  1712.              
  1713.  Return    ; to change seconds for next second
  1714.      
  1715. ;--------------END OF Inst SPEED-------------------
  1716.  
  1717.     end
  1718. ;-----------------------------------------------------
  1719. ;             bike computer program end  ....enjoy
  1720. ;-----------------------------------------------------
  1721.  
  1722.  
  1723.  
  1724. ;                    WORK IN HAND
  1725.  
  1726. ; CLEAN UP  SPEED,  readout still a little jumpy,
  1727. ; can try integrating but need more space. Next version
  1728.  
  1729. ;           Coventions used in the program text.
  1730. ;Variables all small letters , exceptions, those defined
  1731. ; by microchip. e.g. STATUS
  1732. ;Labels: First letter always a Capital, exceptions imported
  1733. ; routines
  1734. ; Test points. These have  a comment DUMMY, the value of the code
  1735. ; has/had been changed for testing or simulating.  If YOU want
  1736. ;to polish  these points should be useful for value changes
  1737. ; example. In ISR the D'18' value to reach a sec is very slow.
  1738. ;Use for test , say 2, and you get going about 10 times  faster.
  1739. ;Also LCD INIT: can be bypassed to debug quicker
  1740.  
  1741.  
  1742. ;------------------------------------------------------------------------
  1743. ;                   End of the Simple Bike Computer
  1744. ;------------------------------------------------------------------------
A hozzászólás módosítva: Jan 31, 2013
(#) Hp41C válasza mhatalyak hozzászólására (») Jan 31, 2013 /
 
Szia!
Íme...

bike.zip
    
(#) mhatalyak válasza Hp41C hozzászólására (») Jan 31, 2013 /
 
Szia!
Nagyon szépen köszönöm! Szép napot!
Üdv!mhatalyak
A hozzászólás módosítva: Jan 31, 2013
(#) store92 hozzászólása Jan 31, 2013 /
 
Mplab-x ben, hol lehet beállítani, hogy debuggoláskor mutassa a program épp hol tart. Mert a régebbi verziókon mutatta ilyen zöld nyíllal, de ebben nem tudom, hogy kell. a régit meg nem tudom felrakni erre a gépre, mert nem megy valamiért.
(#) llaczo válasza Hp41C hozzászólására (») Jan 31, 2013 /
 
Köszönöm szépen az infót. ki fogom próbálni.
(#) n_yálastrubadúr hozzászólása Jan 31, 2013 /
 
Sziasztok!
Időközben meg lett a megoldás. De nem értem! A probléma az volt, hogy egy 8bites számot decimálássá alakított és ezt egy szegmenses kiejlzőn megjelenítettem multiplexálva. Basszus most ahogy írom leesett. 1-2-3 sorrendben kapcsolgattam a digitekhez a feteket és azok 0-ja a pic pwm-jéről ment. Ezért esett olykor úgy, hogy a pwm éppen 0 volt mikor a kijelző elvileg aktív.
Következő: »»   360 / 1210
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem