home | area personale         schemi | tutorial | robotica | pic micro | recensioni         forum | chat irc         faq | contatti         store | Ordina PCB
username
password
cerca

 
FORUM: Pic Micro
Tutto quanto riguarda questi microprocessori... progetti, suggerimenti, aiuti, discussioni...ecc


I2C - PIC16f877 - assembly
     
Autore Messaggio opzioni
angelole





postato il:
08.09.2018, alle ore 12:16
I2C - PIC16f877 - assembly 

Salve,
sto cercando di implementare un codice assembly, che faccia funzionare una periferica RTC tramite protocollo I2C.

Essendo, per me, la prima esperienza con tale protocollo, sto riscontrando, già nelle fasi iniziali, una serie diproblemi.

Allego uno stralcio del codice e chiedo, a chi più esperto, un aiuto affinchè possa correggere eventuali errori. Preciso che il problema riscontrato tramite un analizzatore di stati logici, è il mancato invio della prima stringa successiva al bit start! Quindi potrebe trattarsi o un errore nel settaggio dei registri oppure un problema successivo.

Spero possiate aiutarmi, grazie.

               PROCESSOR      16F877A
          RADIX          DEC
              INCLUDE        \"P16F877A.INC\" 
              ERRORLEVEL     -302
              __CONFIG       0x3D39     ;_CP_OFF   _DEBUG_OFF   _WRT_ENABLE_OFF
              ; _CPD_OFF   _LVP_OFF   _BODEN_OFF   _PWRTE_OFF   _WDT_OFF   _XT_OSC
      
CBLOCK 30H      
              Dly0
              Dly1
              Timer1                  ; contatore    per DelayP
              Timer2                  ;    \"              \"
              Timer3                  ;    \"              \"
              DispTemp                   ; contenitore temporaneo per calcoli routine display
              DispCnt           
              TabTemp           
              Varie                      ; subroutine bip
              F20    
              Temp
              ADD_DS1307_PICRX           ; indirizzo nel caso in cui il up legga i dati dall\'orologio
              ADD_DS1307_PICTX           ; indirizzo nel caso in cui il up scriva i dati sull\'orologio
ENDC   

;***************************************************************
;      PROGRAMMA PRINCIPALE
;***************************************************************
Start
          org       0x00
;***************************************************************
;        Inizializzazione sistema e variabili   
;***************************************************************  
Inizializzazione     
              BCF       STATUS,RP0      ; BANK0
              BCF       STATUS,RP1
          clrf      PORTA           ; port A = 0
          clrf      PORTB         ; port B = 0
          clrf      PORTC        ; port C = 0
              ;-------------------c
              movlw     00000000b
              movwf     ADCON0
              BSF       STATUS,RP0      ; BANK1
              movlw     00000111b
              movwf     ADCON1
;--------------------------------------------------------------------------------------------------
;             0=uscita 1=ingresso
;--------------------------------------------------------------------------------------------------
              movlw     00000000b      ;                                    
              movwf     TRISA
              movlw     00001111b
              movwf     TRISB  
              movlw     00011000b         
              movwf     TRISC
              movlw     00011000b
              movwf     TRISD
              movlw     00000000b          
              movwf     TRISE
          ;------------------
              movlw     0x09
      movwf     SSPADD        ; (SSPADD) = (FOSC / (4*f SCL)) - 1 = 0x09               
              ;------------------
              bcf       SSPSTAT,SMP   ; 
      bcf       SSPSTAT,CKE   ; 

              CLRF      SSPCON2
              ;------------------                                                                                                                                                                                                               
              BCF       STATUS,RP0    ; BANK0
      movlw     B\'00101000\'   ; 0x28
      movwf     SSPCON
          ; bit 5 (SSPEN) = 1       Abilito il modulo I2C - MSSP
          ; bit 3 (SSPM3) = 1
          ; bit 2 (SSPM2) = 0
          ; bit 1 (SSPM1) = 0
          ; bit 0 (SSPM0) = 0
          ; SSPM3:SSPM0   = 1000  : MSSP configuro il modo I2C          
;-------------------------------------------------------------------------------
              movlw     B\'11010001\'
              movwf     ADD_DS1307_PICRX
              movlw     B\'11010000\'
              movwf     ADD_DS1307_PICTX
;-------------------------------------------------------------------------------
Inizio_scrivo                                 
                                              ; per poter settare il dispositivo 
              movlw     0xFF
              movwf     PORTD
              ;---------------------------
              Btfsc     PORTB,3
              GOTO      Inizio_scrivo
              CALL      RITARDO_30ms
              BTFSS     PORTB,3
              GOTO      $-1 
              clrf      PORTD
              ;---------------------------                 
              CALL      ritardo_secondo           
              ;---------------------------
              BSF       STATUS,RP0            ; BANK1
              CLRF      SSPCON2
              BSF       SSPCON2,SEN           ; INVIO START    
              ;--------------------------- 
              BCF       STATUS,RP0            ; BANK0
              movf      ADD_DS1307_PICTX,W    ; SCRIVO - 11010000
              movwf     SSPBUF  
              BSF       STATUS,RP0            ; BANK1
              BTFSC     SSPCON2,ACKSTAT
              GOTO      $-1                   ;  
              ;---------------------------    ;  
              BCF       STATUS,RP0            ; BANK0
              MOVLW     00000000B
              MOVWF     SSPBUF
              BSF       STATUS,RP0            ; BANK1
              BTFSC     SSPCON2,ACKSTAT
              GOTO      $-1
              ;---------------------------
              BSF       SSPCON2,2             ; STOP
              BCF       STATUS,RP0            ; BANK0
              ;---------------------------
              GOTO      Inizio_scrivo

;-------------------- SUBROUTINE RITARDO (30 millisecondi)--------------
RITARDO_30ms                               
              movlw     1
              movwf     Timer1
loopp1        movlw     39
              movwf     Timer2
loopp2        movlw     255
              movwf     Timer3
loopp3        
              decfsz    Timer3
              goto      loopp3     
              decfsz    Timer2
              goto      loopp2
              decfsz    Timer1
              goto      loopp1
              return
;-------------------- SUBROUTINE UN SECONDO --------------------------
ritardo_secondo
              movlw     5
              movwf     Timer1
laap1         movlw     199
              movwf     Timer2
laap2         movlw     143
              movwf     Timer3
laap3         nop
              nop
              nop
              nop
              decfsz    Timer3
              goto      laap3     
              decfsz    Timer2
              goto      laap2
              decfsz    Timer1
              goto      laap1
              return    
;---------------------------------------------------------------------             
              end 
agric





postato il:
08.09.2018, alle ore 13:23
L'aiuto più veloce è di leggere le AN 736 mostrano codice sia in c che in asm



meglio essere un granello di pepe che una cacca d'asino
picmicro675




una ogni 10 livelli


postato il:
08.09.2018, alle ore 13:55
Cerca l' AN736 della microchip. C'è del codice in assembly per dialogare con l' I2C.
Visto come è scritto mi sembra che manchi ancora altre impostazioni.

Hai notato che la finestra del codice non permette larghezza oltre i canonici 80 caratteri ?

Ora riscrivo le routine del PDF. Poi le pubblico....



Anno nuovo, forum nuovo.
Mi sa che lascio.
picmicro675




una ogni 10 livelli


postato il:
08.09.2018, alle ore 13:58
Se poi ti dedicassi al proton basic, magari ti trovi a maggior agio. Facendo come faccio io, scrivi in basic e quindi vai a studiare l' assembly.
Per il 16F877, c'è la versione free



Anno nuovo, forum nuovo.
Mi sa che lascio.
angelole





postato il:
08.09.2018, alle ore 14:21
agric:
L'aiuto più veloce è di leggere le AN 736 mostrano codice sia in c che in asm


ho scaricato il documento, nel pomeriggio cercherò di decifrarlo... Grazie
angelole





postato il:
08.09.2018, alle ore 14:22

Hai notato che la finestra del codice non permette larghezza oltre i canonici 80 caratteri ?



Non capisco... spiegami per favore
angelole





postato il:
08.09.2018, alle ore 14:23
picmicro675:
Se poi ti dedicassi al proton basic, magari ti trovi a maggior agio. Facendo come faccio io, scrivi in basic e quindi vai a studiare l' assembly.
Per il 16F877, c'è la versione free


Ottima idea per casi del genere, quasi quasi... è gratuito, dove lo trovo? quale versione?
picmicro675




una ogni 10 livelli


postato il:
08.09.2018, alle ore 14:43
angelole:
Non capisco... spiegami per favore

Che alla finestra appare la barra di scorrimento perché sborda. Diventa scomodo da leggere dovendo muovere la finestra diverse volte.
Secondo me, esiste ancora la regola di stare nelle 80 colonne, usata anche da sviluppatore come quelli di github e Kernel.org.

Per il proton basuc vai a http://www.protonbasic.co.uk/vbdownloads.php?categoryid=5
Vedi a destra nella pagina

Ho ancora qualche pagina da redarre, poi vi pubblico anche la versione asm, dell' AN736.



Anno nuovo, forum nuovo.
Mi sa che lascio.
angelole





postato il:
08.09.2018, alle ore 16:29

Per il proton basuc vai a http://www.protonbasic.co.uk/vbdownloads.php?categoryid=5
Vedi a destra nella pagina


Ho nel frattempo installato la versione 3.6.1.6 ho scritto due righe di codice:

Device = 16F877A
Xtal 20

inizio:
High PORTB.0
DelayMS 3000
Low PORTB.0
End

ma non riesco a compilare, riesco solo a salvare in formato .bas

Che relazione c'è tra il Proton basic e il PICbasic?
picmicro675




una ogni 10 livelli


postato il:
08.09.2018, alle ore 17:18
Simili, ma non ho tanta esperienza per il PICbasic. Eventualmente c'è GCbasic
http://gcbasic.sourceforge.net/Typesetter/index.php/Home
Che è fatto bene. Ma per certi casi non lo vedo ottimizzato.

La conversione l' ho fatto, forse con qualche errore.
http://www.grix.it/UserFiles/picmicro675/File/TransitFiles/i…

Adesso vedo di fare una prova, col proton basic.



Anno nuovo, forum nuovo.
Mi sa che lascio.
segui questo thread con grixFC, per questa funzione devi aver installato il software grixFC

torna su
     

Come utente anonimo puoi leggere il contenuto di questo forum ma per aprire una discussione
o per partecipare ad una discussione esistente devi essere registrato ed accedere al sito




 







 
 
indietro | homepage | torna su copyright © 2004/2024 GRIX.IT - La community dell'elettronica Amatoriale