Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
05/17/06 02:59
Read: times


 
#116341 - incremental read or write to seeprom
i'm trying to make a controller for cable winding machine,the controller uses AT89S52 and a 24W04 serial eeprom
i've also fit in a 10 keys key board to input numbers, and five seven segments led, my controller is expected to do these things:
- upon startup if power to the motor driver (a stepper motor) is connected the controller read data from seeprom and begin operate,
it will drive the motor till the number of pulse from it's encoder (20 pulse per motor turn) equals data read from seeprom, then motor
stops waiting for a pulse from cable's drum sensor (one pulse per turn) upon detecting this pulse it read another two byte from seeprom and begin the cycle till all data from seeprom are read.
-upon startup if power not apply to motor driver it enters setup, it first read two byte from keypad and if save button pressed
save these byte in seeprom in consecutive order,every time user pushed next then save the sequence repeats. When power applied to motor driver the controller ends programming task and begin operation
my keypad and all other button worked, read and display encoder as well as compare routine worked fine except seeprom read and write routine do not work or read wrong .I've included the code listing written in assembly. Please help me to find out my mistakes
(I'm a foreigner so my English might not be clear or concise! hope you don't mind my English.) this is my first time using seeprom.
Thanks alot
Vu Nhu Khanh
I've include the file listing so you can help me
011 PAGE 1

1 ;wire_con.asm
2 $mod52
3 ;=======================================
4 ;i/o port pins
5 ;=======================================
6
00A0 7 pause bit p2.0 ;pause program excecution by sensing 5 volt
level
00A1 8 scl bit p2.1 ;scl clock pin of 24C04
00A2 9 sda bit p2.2 ;sda pin of 24C04
00A3 10 on1 bit p2.3 ;first digit from the left
00A4 11 on2 bit p2.4 ;second digit
00A5 12 on3 bit p2.5 ;third digit
00A6 13 on4 bit p2.6 ;fourth digit
00A7 14 on5 bit p2.7 ;fifth digit from the left
0087 15 back_set bit p0.7 ;chose next program step
00B0 16 next_set bit p3.0 ;if error go back one step program
00B1 17 save bit p3.1 ;if all is well save present step
00B2 18 drum_turn bit p3.2 ;count wire drum revolution
00B3 19 encoder bit p3.3 ;count encoder turns
00B4 20 mrun bit p3.4 ;control motor setb to run
00B5 21 mdir bit p3.5 ;control movements of motor setb to change d
irection
00B6 22 relay2 bit p3.6 ;relay2 control pin setb to close
00B7 23 relay1 bit p3.7 ;relay1 control pin setb to close
24
25 ;=================================
26 ;counting data registers
27 ;=================================
28 ;digit display masks
29
0082 30 zero equ 10000010b
00DE 31 mot equ 11011110b
00A8 32 hai equ 10101000b
00C8 33 ba equ 11001000b
00D4 34 bon equ 11010100b
00C1 35 nam equ 11000001b
0081 36 sau equ 10000001b
00DA 37 bay equ 11011010b
0080 38 tam equ 10000000b
00C0 39 chin equ 11000000b
00C1 40 char_s equ 11000001b
00A5 41 char_t equ 10100101b
00BD 42 char_r equ 10111101b
00B0 43 char_p equ 10110000b
008C 44 char_d equ 10001100b
45
0020 46 addlo equ 20h ;low order address pointer in rom_sub routin
e
0021 47 addhi equ 21h ;high order address pointer in rom_sub routi
ne
0022 48 tdata equ 22h ;scratch register in rom_sub routine
0023 49 rwdata equ 23h ;read and write data register in rom_sub rou
tine
0024 50 count equ 24h ;store counting data in rom_sub rout
ine
0025 51 dig1 equ 25h ;data storage for digit1
0026 52 dig2 equ 26h ;data storage for digit2
011 PAGE 2

0027 53 dig3 equ 27h ;data storage for digit3
0028 54 dig4 equ 28h ;data storage for digit4
0029 55 dig5 equ 29h ;data storage for digit5
002A 56 count1 equ 2ah ;stores data from key pad,or read fr
om eprom
002B 57 count2 equ 2bh ;stores data from key pad,or read fr
om eprom
002C 58 set1 equ 2ch ;stores data from encoder
002D 59 set2 equ 2dh ;stores data from encoder
002E 60 reprom equ 2eh ;stores low order address pointer fo
r sequensial read or write eeprom
002F 61 dsp_prog equ 2fh ;display working steps number of mac
hine
0030 62 rom_count equ 30h ;stores programming steps number dur
ing read or write
0031 63 index bit 31h ;bit set to indicate when one cycle
of operation complete
0032 64 drum_pulse bit 32h ;one pulse per drum revolution
0033 65 direction bit 33h ;set or clear to call motor directio
n subroutine
0080 66 led_out equ p0
0090 67 key_port equ p1
68
69 ;===============================================================
0000 70 org 0000h
0000 0202E7 71 ljmp begin
0003 72 org 0003h
0003 0200AE 73 ljmp count_up
000B 74 org 000bh ;timer 0 interrupt
000B 020081 75 ljmp update
0013 76 org 0013h
0013 0200DE 77 ljmp drum_count
0040 78 org 040h
79
80 ;=================================================================
81
0040 82 init_baud:
0040 758911 83 mov tmod,#00010001b ;timer 0 in 8 bit reload mode
0043 D2AF 84 setb ea ;global interrupt
0045 D2A9 85 setb et0 ;the timer 0 interrupt
0047 D28C 86 setb tr0
0049 D288 87 setb it0 ;negative edge trigger interrupt
004B D28A 88 setb it1
004D D2A8 89 setb ex0 ;the external interrupt for count_up

004F D2AA 90 setb ex1 ;the external interrupt for count_do
wn
0051 22 91 ret
92
93 ;============================================
94 ;this routine initialize all defined register during reset
95 ;to ensure correct operation
96 ;===========================================
97
0052 98 init_reg:
0052 74FF 99 mov a,#0ffh
0054 F580 100 mov p0,a
0056 F590 101 mov p1,a
011 PAGE 3

0058 F5A0 102 mov p2,a
005A F5B0 103 mov p3,a
005C 752000 104 mov addlo,#00h
005F 752100 105 mov addhi,#00h
0062 752200 106 mov tdata,#00h
0065 752300 107 mov rwdata,#00h
0068 7400 108 mov a,#00h
006A F524 109 mov count,a
006C F525 110 mov dig1,a
006E F526 111 mov dig2,a
0070 F527 112 mov dig3,a
0072 F528 113 mov dig4,a
0074 F529 114 mov dig5,a
0076 F52A 115 mov count1,a
0078 F52B 116 mov count2,a
007A F52C 117 mov set1,a
007C F52D 118 mov set2,a
007E F52E 119 mov reprom,a
0080 22 120 ret
121
122 ;====================================
123 ;the routine to update the display
124 ;====================================
0081 125 update:
0081 C0E0 126 push acc
0083 C0D0 127 push psw ;loop delay 1/1000 sec
0085 758CCE 128 mov th0,#-50
0088 758ACE 129 mov tl0,#-50
008B 852B25 130 mov dig1,count2
008E 12024F 131 lcall digit1
0091 852A26 132 mov dig2,count1
0094 120260 133 lcall digit2
0097 852F27 134 mov dig3,dsp_prog
009A 120271 135 lcall digit3
009D 852D28 136 mov dig4,set2
00A0 12027C 137 lcall digit4
00A3 852C29 138 mov dig5,set1
00A6 12028D 139 lcall digit5
00A9 D0D0 140 pop psw
00AB D0E0 141 pop acc
00AD 32 142 reti
143
144 ;=====================================
145 ;this routine to count stepper motor encoder
146 ;=====================================
00AE 147 count_up:
00AE C0E0 148 push acc
00B0 C0D0 149 push psw
00B2 C2A8 150 clr ex0
00B4 1202B5 151 lcall delayms
00B7 1202B5 152 lcall delayms
00BA 1202B5 153 lcall delayms
00BD E52C 154 mov a,set1
00BF 2401 155 add a,#01h
00C1 D4 156 da a
00C2 F52C 157 mov set1,a
00C4 B41010 158 cjne a,#10h,xong_isr
00C7 752C00 159 mov set1,#00h
011 PAGE 4

00CA E52D 160 mov a,set2
00CC 2401 161 add a,#01h
00CE D4 162 da a
00CF F52D 163 mov set2,a
00D1 B41003 164 cjne a,#10h,xong_isr
00D4 752D00 165 mov set2,#00h
00D7 166 xong_isr:
00D7 D2A8 167 setb ex0
00D9 D0D0 168 pop psw
00DB D0E0 169 pop acc
00DD 32 170 reti
171
172 ;=====================================
173 ;this routine to detect when drum made one turn
174 ;=====================================
00DE 175 drum_count:
00DE C0E0 176 push acc
00E0 C0D0 177 push psw
00E2 C2AA 178 clr ex1
00E4 1202B5 179 lcall delayms
00E7 1202B5 180 lcall delayms
00EA 1202B5 181 lcall delayms
00ED D232 182 setb drum_pulse
00EF C231 183 clr index
00F1 D2AA 184 setb ex1
00F3 D0D0 185 pop psw
00F5 D0E0 186 pop acc
00F7 32 187 reti
188
189 ;=======================================
190 ;these routine were put on separate files to avoid
191 ;long main program, doing this might cause problem due to program
192 ;synchronization
193 ;========================================
=1 194 $ic(4x4_key.inc) ;key read routine,based on Mc Kenzie's sample code
=1 195
=1 196
=1 197 ;the routine for 4x4 key pad use in mcs51 product
=1 198 ;==============================================================
=1 199 ; debounce keypress and key release
=1 200 ;==============================================================
=1 201
00F8 =1 202 in_hex:
00F8 C0D0 =1 203 push psw
00FA 7C14 =1 204 mov r4,#20 ; debounce count
00FC =1 205 back:
00FC 120114 =1 206 lcall get_key ; key pressed?
00FF 5010 =1 207 jnc done1 ; no - check again
0101 DBF9 =1 208 djnz r3,back ; yes - repeat 50 times
0103 852A2B =1 209 mov count2,count1
0106 F52A =1 210 mov count1,a
0108 =1 211 back2:
0108 7D14 =1 212 mov r5,#20 ; wait for key release
010A =1 213 back3:
010A 120114 =1 214 lcall get_key ; key still pressed?
010D 40F9 =1 215 jc back2 ; yes - keep checking
010F DDF9 =1 216 djnz r5,back3 ; no - repeat 50 times
0111 =1 217 done1:
011 PAGE 5

0111 D0D0 =1 218 pop psw
0113 22 =1 219 ret
=1 220
=1 221 ;=============================================================
=1 222 ; get keypad status - return with C = 0 if not key pressed
=1 223 ; return with C = 1, and hex code in acc. if pressed
=1 224 ; =============================================================
=1 225
0114 =1 226 get_key:
0114 74FE =1 227 mov a,#0feh
0116 7E04 =1 228 mov r6,#4
0118 =1 229 test:
0118 F590 =1 230 mov key_port,a
011A FF =1 231 mov r7,a
011B E590 =1 232 mov a,key_port
011D 54F0 =1 233 anl a,#0f0h
011F B4F007 =1 234 cjne a,#0f0h,key_hit
0122 EF =1 235 mov a,r7
0123 23 =1 236 rl a
0124 DEF2 =1 237 djnz r6,test
0126 C3 =1 238 clr c
0127 8015 =1 239 sjmp exit
=1 240
0129 =1 241 key_hit:
0129 FF =1 242 mov r7,a
012A 7404 =1 243 mov a,#4
012C C3 =1 244 clr c
012D 9E =1 245 subb a,r6
012E FE =1 246 mov r6,a
012F EF =1 247 mov a,r7
0130 C4 =1 248 swap a
0131 7D04 =1 249 mov r5,#4
0133 =1 250 again:
0133 13 =1 251 rrc a
0134 5006 =1 252 jnc done
0136 0E =1 253 inc r6
0137 0E =1 254 inc r6
0138 0E =1 255 inc r6
0139 0E =1 256 inc r6
013A DDF7 =1 257 djnz r5,again
013C =1 258 done:
013C D3 =1 259 setb c
013D EE =1 260 mov a,r6
013E =1 261 exit:
013E 22 =1 262 ret
=1 263 ;================================================================
=1 264 $ic(rom_sub.inc) ;24c04 read,write routine,based on Fairchild's app note 957
=1 265 ;*****************************
=1 266 ;*nm24c16 functional routines *
=1 267 ;*****************************
=1 268 ;******************************************************;*
=1 269 ;*write performs a byte write operation into the nm24c16. the routine *
=1 270 ;*expects the address to modify to be specified in the addlo and addhi *
=1 271 ;*variables. the new data value is specified in the rwdata variable. *
=1 272 ;********************************************************
013F =1 273 write:
013F 1201A4 =1 274 lcall start ;issue start condition
0142 E521 =1 275 mov a,addhi ;build slave address
011 PAGE 6

0144 23 =1 276 rl a
0145 44A0 =1 277 orl a,#0a0h
0147 1201D0 =1 278 lcall sendb ;send slave address
014A 1201CA =1 279 lcall ack ;get ack from nm24c16
014D E520 =1 280 mov a,addlo
014F 1201D0 =1 281 lcall sendb ;send low order address
0152 1201CA =1 282 lcall ack ;get ack from nm24c16
0155 E523 =1 283 mov a,rwdata
0157 1201D0 =1 284 lcall sendb ;send data value to write
015A 1201CA =1 285 lcall ack ;get ack from nm24c16
015D 1201B2 =1 286 lcall stop ;issue stop condition
0160 22 =1 287 ret
=1 288 ;******************************************************;*
=1 289 ;*poll performs acknowledge to determine when a write cycle has *
=1 290 ;*completed. the routine repeatedly issues a dummy slave address and *
=1 291 ;*checks for an acknowledge from the nm24c16. once the nm24c16 *
=1 292 ;*responds with an acknowledge the routine terminates. *
=1 293 ;********************************************************
0161 =1 294 poll:
0161 1201A4 =1 295 lcall start ;issue a start condition
0164 74A0 =1 296 mov a,#0a0h
0166 1201D0 =1 297 lcall sendb ;send the dummy slave address
0169 1201CA =1 298 lcall ack ;look for acknowledge from nm24c16
016C 40F3 =1 299 jc poll ;loop until acknowledge is received
016E 1201B2 =1 300 lcall stop ;issue stop condition
0171 22 =1 301 ret
=1 302 ;******************************************************;*
=1 303 ;*read perfoms a byte read from the address specified in the addhi *
=1 304 ;*and addlo variables. the data that is read is returned in the *
=1 305 ;*variable rwdata. *
=1 306 ;********************************************************
0172 =1 307 read:
0172 1201A4 =1 308 lcall start ;issue a start condition
0175 E521 =1 309 mov a,addhi ;issue slave address with r/w=0
0177 23 =1 310 rl a
0178 44A0 =1 311 orl a,#0a0h
017A 1201D0 =1 312 lcall sendb ;send slave address
017D 1201CA =1 313 lcall ack ;get ack from nm24c16
0180 E520 =1 314 mov a,addlo
0182 1201D0 =1 315 lcall sendb ;send low order address
0185 1201CA =1 316 lcall ack ;get ack from nm24c16
0188 1201A4 =1 317 lcall start ;issue start condition
018B E521 =1 318 mov a,addhi
018D 23 =1 319 rl a
018E 44A1 =1 320 orl a,#0a1h
0190 1201D0 =1 321 lcall sendb ;issue slave address with r/w=1
0193 1201CA =1 322 lcall ack ;get ack from nm24c16
0196 1201E2 =1 323 lcall readb ;read data byte
0199 F523 =1 324 mov rwdata,a ;put data into rwdata variable
019B D2A2 =1 325 setb sda ;clock in a 1 (no acknowledge)
019D 1201BE =1 326 lcall clock
01A0 1201B2 =1 327 lcall stop ;issue a stop condition
01A3 22 =1 328 ret
=1 329 ;******************************************************;*
=1 330 ;*start issues a start condition to the nm24c16. the routine makes *
=1 331 ;*sure that both sda and scl are high. then bring sda low first *
=1 332 ;*followed by bringing scl low. *
=1 333 ;********************************************************
011 PAGE 7

01A4 =1 334 start:
01A4 D2A2 =1 335 setb sda ;make sure sda and scl are high
01A6 D2A1 =1 336 setb scl
01A8 C2A2 =1 337 clr sda ;bring sda low
01AA 00 =1 338 nop ;nops assure correct timing
01AB 00 =1 339 nop
01AC 00 =1 340 nop
01AD 00 =1 341 nop
01AE 00 =1 342 nop
01AF C2A1 =1 343 clr scl ;bring scl low
01B1 22 =1 344 ret
=1 345 ;******************************************************;*
=1 346 ;*stop issues a stop condition to the nm24c16. the routine makes *
=1 347 ;*sure that the sda line is low before trying to issue the stop. *
=1 348 ;*the routine then brings scl high followed by bringing sda high. *
=1 349 ;********************************************************
01B2 =1 350 stop:
01B2 C2A2 =1 351 clr sda ;make sure sda is low
01B4 D2A1 =1 352 setb scl ;bring scl high
01B6 00 =1 353 nop ;nops assure correct timing
01B7 00 =1 354 nop
01B8 00 =1 355 nop
01B9 00 =1 356 nop
01BA 00 =1 357 nop
01BB D2A2 =1 358 setb sda ;bring sda high
01BD 22 =1 359 ret
=1 360 ;******************************************************;*
=1 361 ;*clock issues a clock pulse to the nm24c16. the state of sda is *
=1 362 ;*sampled before the clock pulse is issued. *
=1 363 ;********************************************************
01BE =1 364 clock:
01BE A2A2 =1 365 mov c,sda ;sample sda and put state in carry flag
01C0 D2A1 =1 366 setb scl ;bring scl high
01C2 00 =1 367 nop ;nops assure correct timing
01C3 00 =1 368 nop
01C4 00 =1 369 nop
01C5 00 =1 370 nop
01C6 00 =1 371 nop
01C7 C2A1 =1 372 clr scl ;bring scl low
01C9 22 =1 373 ret
=1 374 ;******************************************************;*
=1 375 ; ack allows the nm24c16 to send an acknowledge back to the 8031. *
=1 376 ;********************************************************
01CA =1 377 ack:
01CA D2A2 =1 378 setb sda ;bring sda high
01CC 1201BE =1 379 lcall clock ;issue a clock pulse
01CF 22 =1 380 ret
=1 381 ;******************************************************;*
=1 382 ;*sendb sends a byte to the nm24c16. the routine receives the data *
=1 383 ;*to send in the a register. *
=1 384 ;********************************************************
01D0 =1 385 sendb:
01D0 F522 =1 386 mov tdata,a ;move data to send into tdata
01D2 7408 =1 387 mov a,#8 ;8 bits to send
01D4 F524 =1 388 mov count,a ;store 8 in down counter
01D6 E522 =1 389 mov a,tdata ;return data to send into a register
01D8 =1 390 nextr:
01D8 33 =1 391 rlc a ;send most significant bit first
011 PAGE 8

01D9 92A2 =1 392 mov sda,c ;move bit to sda port
01DB 1201BE =1 393 lcall clock ;issue clock pulse
01DE D524F7 =1 394 djnz count,nextr ;loop 8 times
01E1 22 =1 395 ret
=1 396 ;******************************************************;*
=1 397 ;*readb reads a byte from the nm24c16. the routine returns the byte *
=1 398 ;*that is read in the a register. *
=1 399 ;********************************************************
01E2 =1 400 readb:
01E2 7408 =1 401 mov a,#8 ;8 bits to read
01E4 F524 =1 402 mov count,a ;store 8 in down counter
01E6 =1 403 nextw:
01E6 1201BE =1 404 lcall clock ;issue clock pulse
01E9 33 =1 405 rlc a ;store and shift data from sda
01EA D524F9 =1 406 djnz count,nextw ;loop 8 times
01ED 22 =1 407 ret
408
409
410 ;**************************************************************************
411 ;display digits from digit mask
412 ;**************************************************************************
413
01EE 414 display_0:
01EE 758082 415 mov led_out, #zero
01F1 22 416 ret
417
01F2 418 display_1:
01F2 7580DE 419 mov led_out, #mot
01F5 22 420 ret
421
01F6 422 display_2:
01F6 7580A8 423 mov led_out, #hai
01F9 22 424 ret
425
01FA 426 display_3:
01FA 7580C8 427 mov led_out, #ba
01FD 22 428 ret
429
01FE 430 display_4:
01FE 7580D4 431 mov led_out, #bon
0201 22 432 ret
433
0202 434 display_5:
0202 7580C1 435 mov led_out, #nam
0205 22 436 ret
437
0206 438 display_6:
0206 758081 439 mov led_out, #sau
0209 22 440 ret
441
020A 442 display_7:
020A 7580DA 443 mov led_out, #bay
020D 22 444 ret
445
020E 446 display_8:
020E 758080 447 mov led_out, #tam
0211 22 448 ret
449
011 PAGE 9

0212 450 display_9:
0212 7580C0 451 mov led_out, #chin
0215 22 452 ret
453
454 ;=============================================
455 ;this routine identify digits and display them
456 ;=============================================
457
0216 458 get_number:
0216 B40003 459 cjne a, #00h, so1 ; jump if not 0
0219 31EE 460 acall display_0
021B 22 461 ret
021C 462 so1:
021C B40103 463 cjne a, #01h, so2 ; jump if not 1
021F 31F2 464 acall display_1
0221 22 465 ret
0222 466 so2:
0222 B40203 467 cjne a, #02h, so3 ; jump if not 2
0225 31F6 468 acall display_2
0227 22 469 ret
0228 470 so3:
0228 B40303 471 cjne a, #03h, so4 ; jump if not 3
022B 31FA 472 acall display_3
022D 22 473 ret
022E 474 so4:
022E B40403 475 cjne a, #04h, so5 ; jump if not 4
0231 31FE 476 acall display_4
0233 22 477 ret
0234 478 so5:
0234 B40503 479 cjne a, #05h, so6 ; jump if not 5
0237 5102 480 acall display_5
0239 22 481 ret
023A 482 so6:
023A B40603 483 cjne a, #06h,so7 ; jump if not 6
023D 5106 484 acall display_6
023F 22 485 ret
0240 486 so7:
0240 B40703 487 cjne a, #07h, so8 ; jump if not 7
0243 510A 488 acall display_7
0245 22 489 ret
0246 490 so8:
0246 B40803 491 cjne a, #08h, so9 ; jump if not 8
0249 510E 492 acall display_8
024B 22 493 ret
024C 494 so9:
024C 5112 495 acall display_9 ; sure is nine
024E 22 496 ret
497
498 ;********* display thousand digit *********************************
024F 499 digit1:
024F 7580FF 500 mov led_out,#0ffh
0252 E525 501 mov a,dig1
0254 540F 502 anl a, #00fh
0256 5116 503 acall get_number
0258 C2A3 504 clr on1 ; turn on 5th digit
025A 1202B5 505 lcall delayms
025D D2A3 506 setb on1
025F 22 507 ret
011 PAGE 10

508
509 ;********* display thousand digit *********************************
0260 510 digit2:
0260 7580FF 511 mov led_out,#0ffh
0263 E526 512 mov a,dig2
0265 540F 513 anl a, #00fh
0267 5116 514 acall get_number
0269 C2A4 515 clr on2 ; turn on 4th digit
026B 1202B5 516 lcall delayms
026E D2A4 517 setb on2
0270 22 518 ret
519
520 ;********* display hundred digit ******************************
0271 521 digit3:
0271 852780 522 mov led_out,dig3
0274 C2A5 523 clr on3 ; turn on 3rd digit
0276 1202B5 524 lcall delayms
0279 D2A5 525 setb on3
027B 22 526 ret
527 ;******** display ten digit ***********************************
027C 528 digit4:
027C 7580FF 529 mov led_out,#0ffh
027F E528 530 mov a,dig4
0281 540F 531 anl a, #00Fh
0283 5116 532 acall get_number
0285 C2A6 533 clr on4
0287 1202B5 534 lcall delayms
028A D2A6 535 setb on4
028C 22 536 ret
537 ;*********display unit digit ****************************
028D 538 digit5:
028D 7580FF 539 mov led_out,#0ffh
0290 E529 540 mov a,dig5
0292 540F 541 anl a, #00fh
0294 5116 542 acall get_number
0296 C2A7 543 clr on5
0298 1202B5 544 lcall delayms
029B D2A7 545 setb on5
029D 22 546 ret
547 ;===========================================
548 ;this routine compare set info with stepper motor's
549 ;encoder output pulse if all digits equal zero then
550 ;finish
551 ;============================================
029E 552 compare:
029E E52D 553 mov a,set2
02A0 B52B11 554 cjne a,count2,lost
02A3 E52C 555 mov a,set1
02A5 B52A0C 556 cjne a,count1,lost
02A8 752C00 557 mov set1,#0
02AB 752D00 558 mov set2,#0
02AE D231 559 setb index
02B0 C232 560 clr drum_pulse
02B2 C2A8 561 clr ex0
02B4 562 lost:
02B4 22 563 ret
564
565 ;===================================
011 PAGE 11

566 ;1/1000 sec delay loop
567 ;====================================
568
02B5 569 delayms:
02B5 7A00 570 mov r2,#00h
02B7 571 loopa:
02B7 0A 572 inc r2
02B8 EA 573 mov a,r2
02B9 B4FFFB 574 cjne a,#0ffh,loopa
02BC 22 575 ret
576
577 ;another longer delay loop
578
02BD 579 delayms1:
02BD 7832 580 mov r0,#50
02BF 581 loopb:
02BF 1202B5 582 lcall delayms
02C2 D8FB 583 djnz r0,loopb
02C4 22 584 ret
585
586 ;=======================================
587 ; routine to show program saving steps
588 ;=======================================
589
02C5 590 show_prog:
02C5 E52C 591 mov a,set1
02C7 B40A0D 592 cjne a,#10,ok_do
02CA 752C00 593 mov set1,#00
02CD 052D 594 inc set2
02CF E52D 595 mov a,set2
02D1 B40A03 596 cjne a,#10,ok_do
02D4 752D00 597 mov set2,#00
02D7 598 ok_do:
02D7 22 599 ret
600 ;========================================
601 ;MOTOR control routines
602 ;========================================
02D8 603 forward:
02D8 D2B4 604 setb mrun
02DA C2B5 605 clr mdir
02DC 22 606 ret
02DD 607 reverse:
02DD D2B4 608 setb mrun
02DF D2B5 609 setb mdir
02E1 22 610 ret
02E2 611 no_move:
02E2 C2B4 612 clr mrun
02E4 C2B5 613 clr mdir
02E6 22 614 ret
615
616 ;========================================================
617
02E7 618 begin:
02E7 758134 619 mov sp,#34h
=1 620 $ic(main.inc)
=1 621 ;======================================
=1 622 ;the main.asm
=1 623 ;======================================
011 PAGE 12

02EA 120052 =1 624 lcall init_reg
02ED =1 625 std_by:
02ED 1202E2 =1 626 lcall no_move
02F0 7580B0 =1 627 mov led_out,#char_p
02F3 C2A3 =1 628 clr on1
02F5 1202B5 =1 629 lcall delayms
02F8 D2A3 =1 630 setb on1
02FA 1202B5 =1 631 lcall delayms
02FD 7580BD =1 632 mov led_out,#char_r
0300 C2A4 =1 633 clr on2
0302 1202B5 =1 634 lcall delayms
0305 D2A4 =1 635 setb on2
0307 1202B5 =1 636 lcall delayms
030A 7580C1 =1 637 mov led_out,#char_s
030D C2A5 =1 638 clr on3
030F 1202B5 =1 639 lcall delayms
0312 D2A5 =1 640 setb on3
0314 1202B5 =1 641 lcall delayms
0317 7580A5 =1 642 mov led_out,#char_t
031A C2A6 =1 643 clr on4
031C 1202B5 =1 644 lcall delayms
031F D2A6 =1 645 setb on4
0321 1202B5 =1 646 lcall delayms
0324 75808C =1 647 mov led_out,#char_d
0327 C2A7 =1 648 clr on5
0329 1202B5 =1 649 lcall delayms
032C D2A7 =1 650 setb on5
032E 1202B5 =1 651 lcall delayms
0331 30B105 =1 652 jnb save,set_prog0
0334 20A0B6 =1 653 jb pause,std_by
0337 61BA =1 654 ajmp operate
=1 655
=1 656
0339 =1 657 set_prog0:
0339 120040 =1 658 lcall init_baud
033C 120052 =1 659 lcall init_reg
033F 753000 =1 660 mov rom_count,#00h ;clear low order address register
0342 C2B7 =1 661 clr relay1 ;to prepare saving in eprom operatio
ns
0344 C2B6 =1 662 clr relay2
0346 C231 =1 663 clr index
0348 1202E2 =1 664 lcall no_move
034B D232 =1 665 setb drum_pulse
034D C2A8 =1 666 clr ex0
034F C2AA =1 667 clr ex1
0351 =1 668 set_prog: ;let the user knows what we are goin
g to do
0351 752FB0 =1 669 mov dsp_prog,#char_p
0354 1202C5 =1 670 lcall show_prog
0357 1200F8 =1 671 lcall in_hex ;read keypad be ready to write to eprom
035A 20B1F4 =1 672 jb save,set_prog
035D =1 673 checking:
035D 1202BD =1 674 lcall delayms1
0360 30B1FA =1 675 jnb save,checking
0363 C28C =1 676 clr tr0
0365 752100 =1 677 mov addhi,#00h ;24C04 so let hi order address be 00

0368 052E =1 678 inc reprom ;writing the first byte
011 PAGE 13

036A 852E20 =1 679 mov addlo,reprom
036D E52A =1 680 mov a,count1
036F F523 =1 681 mov rwdata,a
0371 12013F =1 682 lcall write
0374 752100 =1 683 mov addhi,#00h
0377 052E =1 684 inc reprom ;writing the second byte
0379 852E20 =1 685 mov addlo,reprom
037C E52B =1 686 mov a,count2
037E F523 =1 687 mov rwdata,a
0380 12013F =1 688 lcall write
0383 752A00 =1 689 mov count1,#00
0386 752B00 =1 690 mov count2,#00
0389 E52E =1 691 mov a,reprom
038B F530 =1 692 mov rom_count,a ;count the last two saving steps
038D 30A02A =1 693 jnb pause,operate ;and save in rom_count for future use
0390 =1 694 waitup: ;go to next two byte saving cycle
0390 D28C =1 695 setb tr0 ;also notify use what prog step he's
at
0392 20B0FB =1 696 jb next_set,waitup
0395 052C =1 697 inc set1
0397 6151 =1 698 ajmp set_prog
0399 22 =1 699 ret
=1 700
=1 701
039A =1 702 run: ;runs the motor and compare data rea
d from
039A D2A8 =1 703 setb ex0 ;eprom with data from motor encoder
read from
039C D2AA =1 704 setb ex1 ;count_up when all equal read two mo
re byte
039E 1202DD =1 705 lcall reverse ;and repeat operation until all steps done
03A1 12029E =1 706 lcall compare
03A4 103103 =1 707 jbc index,over
03A7 619A =1 708 ajmp run
03A9 22 =1 709 ret
03AA =1 710 over:
03AA D2B7 =1 711 setb relay1
03AC D2B6 =1 712 setb relay2
03AE 1202D8 =1 713 lcall forward
03B1 =1 714 over1:
03B1 1202E2 =1 715 lcall no_move
03B4 30320C =1 716 jnb drum_pulse,operate1
03B7 619A =1 717 ajmp run
03B9 22 =1 718 ret
03BA =1 719 operate: ;read back from eprom
03BA 120040 =1 720 lcall init_baud
03BD 120052 =1 721 lcall init_reg
03C0 752E00 =1 722 mov reprom,#00h
03C3 =1 723 operate1: ;read two byte in consecutive order

03C3 C28C =1 724 clr tr0
03C5 752FA5 =1 725 mov dsp_prog,#char_t ;let user know we are running
03C8 752100 =1 726 mov addhi,#00h
03CB 052E =1 727 inc reprom ;begin read fisrt byte
03CD 852E20 =1 728 mov addlo,reprom
03D0 120172 =1 729 lcall read
03D3 E523 =1 730 mov a,rwdata
03D5 F52A =1 731 mov count1,a
011 PAGE 14

03D7 752100 =1 732 mov addhi,#00h
03DA 052E =1 733 inc reprom ;read second byte in order indicated

03DC 852E20 =1 734 mov addlo,reprom ;by reprom register
03DF 120172 =1 735 lcall read
03E2 E523 =1 736 mov a,rwdata
03E4 F52B =1 737 mov count2,a
03E6 D28C =1 738 setb tr0
03E8 12039A =1 739 lcall run
03EB 22 =1 740 ret
03EC 22 741 ret
742 end

VERSION 1.2k ASSEMBLY COMPLETE, 0 ERRORS FOUND
011 PAGE 15

ACC. . . . . . . . . . . . . . . D ADDR 00E0H PREDEFINED
ACK. . . . . . . . . . . . . . . C ADDR 01CAH
ADDHI. . . . . . . . . . . . . . NUMB 0021H
ADDLO. . . . . . . . . . . . . . NUMB 0020H
AGAIN. . . . . . . . . . . . . . C ADDR 0133H
BA . . . . . . . . . . . . . . . NUMB 00C8H
BACK . . . . . . . . . . . . . . C ADDR 00FCH
BACK2. . . . . . . . . . . . . . C ADDR 0108H
BACK3. . . . . . . . . . . . . . C ADDR 010AH
BACK_SET . . . . . . . . . . . . B ADDR 0087H NOT USED
BAY. . . . . . . . . . . . . . . NUMB 00DAH
BEGIN. . . . . . . . . . . . . . C ADDR 02E7H
BON. . . . . . . . . . . . . . . NUMB 00D4H
CHAR_D . . . . . . . . . . . . . NUMB 008CH
CHAR_P . . . . . . . . . . . . . NUMB 00B0H
CHAR_R . . . . . . . . . . . . . NUMB 00BDH
CHAR_S . . . . . . . . . . . . . NUMB 00C1H
CHAR_T . . . . . . . . . . . . . NUMB 00A5H
CHECKING . . . . . . . . . . . . C ADDR 035DH
CHIN . . . . . . . . . . . . . . NUMB 00C0H
CLOCK. . . . . . . . . . . . . . C ADDR 01BEH
COMPARE. . . . . . . . . . . . . C ADDR 029EH
COUNT. . . . . . . . . . . . . . NUMB 0024H
COUNT1 . . . . . . . . . . . . . NUMB 002AH
COUNT2 . . . . . . . . . . . . . NUMB 002BH
COUNT_UP . . . . . . . . . . . . C ADDR 00AEH
DELAYMS. . . . . . . . . . . . . C ADDR 02B5H
DELAYMS1 . . . . . . . . . . . . C ADDR 02BDH
DIG1 . . . . . . . . . . . . . . NUMB 0025H
DIG2 . . . . . . . . . . . . . . NUMB 0026H
DIG3 . . . . . . . . . . . . . . NUMB 0027H
DIG4 . . . . . . . . . . . . . . NUMB 0028H
DIG5 . . . . . . . . . . . . . . NUMB 0029H
DIGIT1 . . . . . . . . . . . . . C ADDR 024FH
DIGIT2 . . . . . . . . . . . . . C ADDR 0260H
DIGIT3 . . . . . . . . . . . . . C ADDR 0271H
DIGIT4 . . . . . . . . . . . . . C ADDR 027CH
DIGIT5 . . . . . . . . . . . . . C ADDR 028DH
DIRECTION. . . . . . . . . . . . B ADDR 0033H NOT USED
DISPLAY_0. . . . . . . . . . . . C ADDR 01EEH
DISPLAY_1. . . . . . . . . . . . C ADDR 01F2H
DISPLAY_2. . . . . . . . . . . . C ADDR 01F6H
DISPLAY_3. . . . . . . . . . . . C ADDR 01FAH
DISPLAY_4. . . . . . . . . . . . C ADDR 01FEH
DISPLAY_5. . . . . . . . . . . . C ADDR 0202H
DISPLAY_6. . . . . . . . . . . . C ADDR 0206H
DISPLAY_7. . . . . . . . . . . . C ADDR 020AH
DISPLAY_8. . . . . . . . . . . . C ADDR 020EH
DISPLAY_9. . . . . . . . . . . . C ADDR 0212H
DONE . . . . . . . . . . . . . . C ADDR 013CH
DONE1. . . . . . . . . . . . . . C ADDR 0111H
DRUM_COUNT . . . . . . . . . . . C ADDR 00DEH
DRUM_PULSE . . . . . . . . . . . B ADDR 0032H
DRUM_TURN. . . . . . . . . . . . B ADDR 00B2H NOT USED
DSP_PROG . . . . . . . . . . . . NUMB 002FH
EA . . . . . . . . . . . . . . . B ADDR 00AFH PREDEFINED
ENCODER. . . . . . . . . . . . . B ADDR 00B3H NOT USED
ET0. . . . . . . . . . . . . . . B ADDR 00A9H PREDEFINED
011 PAGE 16

EX0. . . . . . . . . . . . . . . B ADDR 00A8H PREDEFINED
EX1. . . . . . . . . . . . . . . B ADDR 00AAH PREDEFINED
EXIT . . . . . . . . . . . . . . C ADDR 013EH
FORWARD. . . . . . . . . . . . . C ADDR 02D8H
GET_KEY. . . . . . . . . . . . . C ADDR 0114H
GET_NUMBER . . . . . . . . . . . C ADDR 0216H
HAI. . . . . . . . . . . . . . . NUMB 00A8H
INDEX. . . . . . . . . . . . . . B ADDR 0031H
INIT_BAUD. . . . . . . . . . . . C ADDR 0040H
INIT_REG . . . . . . . . . . . . C ADDR 0052H
IN_HEX . . . . . . . . . . . . . C ADDR 00F8H
IT0. . . . . . . . . . . . . . . B ADDR 0088H PREDEFINED
IT1. . . . . . . . . . . . . . . B ADDR 008AH PREDEFINED
KEY_HIT. . . . . . . . . . . . . C ADDR 0129H
KEY_PORT . . . . . . . . . . . . NUMB 0090H
LED_OUT. . . . . . . . . . . . . NUMB 0080H
LOOPA. . . . . . . . . . . . . . C ADDR 02B7H
LOOPB. . . . . . . . . . . . . . C ADDR 02BFH
LOST . . . . . . . . . . . . . . C ADDR 02B4H
MDIR . . . . . . . . . . . . . . B ADDR 00B5H
MOT. . . . . . . . . . . . . . . NUMB 00DEH
MRUN . . . . . . . . . . . . . . B ADDR 00B4H
NAM. . . . . . . . . . . . . . . NUMB 00C1H
NEXTR. . . . . . . . . . . . . . C ADDR 01D8H
NEXTW. . . . . . . . . . . . . . C ADDR 01E6H
NEXT_SET . . . . . . . . . . . . B ADDR 00B0H
NO_MOVE. . . . . . . . . . . . . C ADDR 02E2H
OK_DO. . . . . . . . . . . . . . C ADDR 02D7H
ON1. . . . . . . . . . . . . . . B ADDR 00A3H
ON2. . . . . . . . . . . . . . . B ADDR 00A4H
ON3. . . . . . . . . . . . . . . B ADDR 00A5H
ON4. . . . . . . . . . . . . . . B ADDR 00A6H
ON5. . . . . . . . . . . . . . . B ADDR 00A7H
OPERATE. . . . . . . . . . . . . C ADDR 03BAH
OPERATE1 . . . . . . . . . . . . C ADDR 03C3H
OVER . . . . . . . . . . . . . . C ADDR 03AAH
OVER1. . . . . . . . . . . . . . C ADDR 03B1H NOT USED
P0 . . . . . . . . . . . . . . . D ADDR 0080H PREDEFINED
P1 . . . . . . . . . . . . . . . D ADDR 0090H PREDEFINED
P2 . . . . . . . . . . . . . . . D ADDR 00A0H PREDEFINED
P3 . . . . . . . . . . . . . . . D ADDR 00B0H PREDEFINED
PAUSE. . . . . . . . . . . . . . B ADDR 00A0H
POLL . . . . . . . . . . . . . . C ADDR 0161H
PSW. . . . . . . . . . . . . . . D ADDR 00D0H PREDEFINED
READ . . . . . . . . . . . . . . C ADDR 0172H
READB. . . . . . . . . . . . . . C ADDR 01E2H
RELAY1 . . . . . . . . . . . . . B ADDR 00B7H
RELAY2 . . . . . . . . . . . . . B ADDR 00B6H
REPROM . . . . . . . . . . . . . NUMB 002EH
REVERSE. . . . . . . . . . . . . C ADDR 02DDH
ROM_COUNT. . . . . . . . . . . . NUMB 0030H
RUN. . . . . . . . . . . . . . . C ADDR 039AH
RWDATA . . . . . . . . . . . . . NUMB 0023H
SAU. . . . . . . . . . . . . . . NUMB 0081H
SAVE . . . . . . . . . . . . . . B ADDR 00B1H
SCL. . . . . . . . . . . . . . . B ADDR 00A1H
SDA. . . . . . . . . . . . . . . B ADDR 00A2H
SENDB. . . . . . . . . . . . . . C ADDR 01D0H
011 PAGE 17

SET1 . . . . . . . . . . . . . . NUMB 002CH
SET2 . . . . . . . . . . . . . . NUMB 002DH
SET_PROG . . . . . . . . . . . . C ADDR 0351H
SET_PROG0. . . . . . . . . . . . C ADDR 0339H
SHOW_PROG. . . . . . . . . . . . C ADDR 02C5H
SO1. . . . . . . . . . . . . . . C ADDR 021CH
SO2. . . . . . . . . . . . . . . C ADDR 0222H
SO3. . . . . . . . . . . . . . . C ADDR 0228H
SO4. . . . . . . . . . . . . . . C ADDR 022EH
SO5. . . . . . . . . . . . . . . C ADDR 0234H
SO6. . . . . . . . . . . . . . . C ADDR 023AH
SO7. . . . . . . . . . . . . . . C ADDR 0240H
SO8. . . . . . . . . . . . . . . C ADDR 0246H
SO9. . . . . . . . . . . . . . . C ADDR 024CH
SP . . . . . . . . . . . . . . . D ADDR 0081H PREDEFINED
START. . . . . . . . . . . . . . C ADDR 01A4H
STD_BY . . . . . . . . . . . . . C ADDR 02EDH
STOP . . . . . . . . . . . . . . C ADDR 01B2H
TAM. . . . . . . . . . . . . . . NUMB 0080H
TDATA. . . . . . . . . . . . . . NUMB 0022H
TEST . . . . . . . . . . . . . . C ADDR 0118H
TH0. . . . . . . . . . . . . . . D ADDR 008CH PREDEFINED
TL0. . . . . . . . . . . . . . . D ADDR 008AH PREDEFINED
TMOD . . . . . . . . . . . . . . D ADDR 0089H PREDEFINED
TR0. . . . . . . . . . . . . . . B ADDR 008CH PREDEFINED
UPDATE . . . . . . . . . . . . . C ADDR 0081H
WAITUP . . . . . . . . . . . . . C ADDR 0390H
WRITE. . . . . . . . . . . . . . C ADDR 013FH
XONG_ISR . . . . . . . . . . . . C ADDR 00D7H
ZERO . . . . . . . . . . . . . . NUMB 0082H


List of 8 messages in thread
TopicAuthorDate
incremental read or write to seeprom            01/01/70 00:00      
   Some points            01/01/70 00:00      
   Good post!            01/01/70 00:00      
      I second that. Neither we nor you ...            01/01/70 00:00      
         Often a bug can be found            01/01/70 00:00      
            elaborating            01/01/70 00:00      
         Some delay could help            01/01/70 00:00      
      Thanks you all            01/01/70 00:00      

Back to Subject List