| 274 | |
| 275 | |
| 276 | = Le modèle de programme fourni = |
| 277 | |
| 278 | Nous donnons un programme qui fait une rampe sur le DAC. Il n'a pas les commentaires puisque vous devez les ajouter. Notez aussi l'usage des macros pour la réservation des adresses de la mémoire, et surtout l'usage des macros pour les différentes étapes du transfert I2C. Je vous demande (suggère) de creer 2 fichiers i2c_macro.inc et i2c_fun.asm, que vous pourrez inclure respectivement au début et à la fin de votre programme i2c (c'est comme pour le lcd). |
| 279 | |
| 280 | {{{ |
| 281 | list p=16f877 |
| 282 | errorlevel -302 |
| 283 | list n=0 |
| 284 | include "p16f877.inc" |
| 285 | ;----------------------------------- |
| 286 | VARIABLE bank0_break=0x20 |
| 287 | VARIABLE bank1_break=0xA0 |
| 288 | VARIABLE bank2_break=0x110 |
| 289 | VARIABLE bank3_break=0x190 |
| 290 | VARIABLE bank4_break=0x70 |
| 291 | bank0 macro |
| 292 | VARIABLE bank_current=bank0_break |
| 293 | endm |
| 294 | bank1 macro |
| 295 | VARIABLE bank_current=bank1_break |
| 296 | endm |
| 297 | bank2 macro |
| 298 | VARIABLE bank_current=bank2_break |
| 299 | endm |
| 300 | bank3 macro |
| 301 | VARIABLE bank_current=bank3_break |
| 302 | endm |
| 303 | bank4 macro |
| 304 | VARIABLE bank_current=bank4_break |
| 305 | endm |
| 306 | byte macro register_name, size |
| 307 | CBLOCK bank_current |
| 308 | register_name : size |
| 309 | ENDC |
| 310 | VARIABLE bank_current=bank_current+size |
| 311 | endm |
| 312 | ;----------------------------------- |
| 313 | CONSTANT DAC_ADDR = 0x40 |
| 314 | CONSTANT READ = 1 |
| 315 | CONSTANT WRITE = 0 |
| 316 | i2c_init macro |
| 317 | call i2c_init_fun |
| 318 | endm |
| 319 | i2c_start macro |
| 320 | call i2c_start_fun |
| 321 | endm |
| 322 | i2c_stop macro |
| 323 | call i2c_stop_fun |
| 324 | endm |
| 325 | i2c_lwrite macro val |
| 326 | movlw val |
| 327 | call i2c_wwrite_fun |
| 328 | endm |
| 329 | i2c_fwrite macro reg |
| 330 | movf reg,w |
| 331 | call i2c_wwrite_fun |
| 332 | endm |
| 333 | ;----------------------------------- |
| 334 | BANK0 |
| 335 | byte val, 1 |
| 336 | ;----------------------------------- |
| 337 | org 0 |
| 338 | PAGESEL reset |
| 339 | goto reset |
| 340 | org 4 |
| 341 | return |
| 342 | |
| 343 | reset |
| 344 | i2c_init |
| 345 | |
| 346 | main |
| 347 | LOOP |
| 348 | i2c_start |
| 349 | i2c_lwrite DAC_ADDR|WRITE |
| 350 | i2c_lwrite 0 |
| 351 | i2c_fwrite VAL |
| 352 | i2c_stop |
| 353 | decf VAL,f |
| 354 | goto LOOP |
| 355 | ;----------------------------------- |
| 356 | i2c_init_fun |
| 357 | BANKSEL TRISC |
| 358 | bsf TRISC,3 |
| 359 | bsf TRISC,4 |
| 360 | bcf PIE1,SSPIE |
| 361 | bsf SSPSTAT,SMP |
| 362 | bcf SSPSTAT,CKE |
| 363 | movlw D'49' |
| 364 | movwf SSPADD |
| 365 | clrf SSPCON2 |
| 366 | BANKSEL SSPCON |
| 367 | movlw 0x28 |
| 368 | movwf SSPCON |
| 369 | bcf PIR1,SSPIF |
| 370 | return |
| 371 | i2c_start_fun |
| 372 | BANKSEL SSPCON2 |
| 373 | bsf SSPCON2, SEN |
| 374 | clrf STATUS |
| 375 | btfss PIR1, SSPIF |
| 376 | goto $-1 |
| 377 | bcf PIR1, SSPIF |
| 378 | return |
| 379 | i2c_wwrite_fun |
| 380 | movwf SSPBUF |
| 381 | btfss PIR1, SSPIF |
| 382 | goto $-1 |
| 383 | bcf PIR1, SSPIF |
| 384 | return |
| 385 | i2c_stop_fun |
| 386 | BANKSEL SSPCON2 |
| 387 | bsf SSPCON2, PEN |
| 388 | clrf STATUS |
| 389 | btfss PIR1, SSPIF |
| 390 | goto $-1 |
| 391 | bcf PIR1, SSPIF |
| 392 | return |
| 393 | ;----------------------------------- |
| 394 | END |
| 395 | }}} |