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
picmicro675




una ogni 10 livelli


postato il:
08.09.2018, alle ore 17:29
Per il proton basic, qui l' indirizzo
http://www.protonbasic.co.uk/vbdownloads.php?do=file&fileid=…
Che dovrebbe reindirizzare al file da scaricare.
Però è la versione 3.6.0.2_1.0.4.4. Penso che hai installo un aggiornamento che manca della base da aggiornare.



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




una ogni 10 livelli


postato il:
08.09.2018, alle ore 19:35
Device 16F887

Declare Xtal 20

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

; l' assembler

F1_000006 equ $ ; IN [UNTITLED.BAS] HIGH PORTB.0
    bsf STATUS,5
ram_bank = 1
    bcf TRISB,0
    bcf STATUS,5
ram_bank = 0
    bsf PORTB,0
F1_000007 equ $ ; IN [UNTITLED.BAS] DELAYMS 3000
    movlw 11
    movwf PP1H
    movlw 184
    f@call __delay_ms_w_
F1_000008 equ $ ; IN [UNTITLED.BAS] LOW PORTB.0
    bsf STATUS,5
ram_bank = 1
    bcf TRISB,0
    bcf STATUS,5
ram_bank = 0
    bcf PORTB,0
F1_000009 equ $ ; IN [UNTITLED.BAS] GOTO INIZIO
    f@jump inizio
F1_000010 equ $ ; IN [UNTITLED.BAS] END

; Poi il suo HEX
:10000000000000308A002528A301A200FF30A207CB
:10001000031CA307031C21280330A100E630122093
:100020000628A101FC3EA000A109031C1D28FF30E9
:100030000000A00703181828A0070000A10F172828
:100040000800831383120313080083018316031728
:100050008801890183128701880103138316061022
:10006000831206140B30A300B8308A0105208316D2
:100070000610831206108A012D288A013D288A0164
:020080003F2817
:02400E00E2309E
:02401000FF3E71
:00000001FF

Vesione 3.6.2.1 Free
Non ho capito come hai fatto a non fare.
Scrivi il programma, salvi per la prima volta e quindi compili. Cerca nella cartella che hai salvato il basic che trovi l' assembler e l' HEX. Sebbene puoi usare anche il visualizzatore del proton per vedere l' assembler, che di solito inizia con un migliaio di righe di dichiarazioni e routines di uso nel programma.



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





postato il:
09.09.2018, alle ore 10:26
picmicro675:
Per il proton basic, qui l' indirizzo
http://www.protonbasic.co.uk/vbdownloads.php?do=file&fileid=…
Che dovrebbe reindirizzare al file da scaricare.
Però è la versione 3.6.0.2_1.0.4.4. Penso che hai installo un aggiornamento che manca della base da aggiornare.


Infatti manca qualcosa, stamattina ci metto mani
angelole





postato il:
09.09.2018, alle ore 10:27
Rimane il problema del codice in assembly che ho postato all'inizio. Se qualcuno ha la bontà nel frattempo di dare un'occhiata per capire quali siano i problemi ne sarei grato
picmicro675




una ogni 10 livelli


postato il:
09.09.2018, alle ore 16:22
Dunque..... Ho abbellito il programma (storpiature di grix) e provato al simulatore.
            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                  ; "              "
            ; contenitore temporaneo per calcoli routine display
            DispTemp
            DispCnt
            TabTemp
            Varie                   ; subroutine bip
            F20
            Temp
            ; indirizzo nel caso in cui il up legga i dati dall'orologio
            ADD_DS1307_PICRX
            ; indirizzo nel caso in cui il up scriva i dati sull'orologio
            ADD_DS1307_PICTX
ENDC

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

            clrf        SSPCON2
            ; ------------------
            banksel     SSPCON
            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
            banksel     PORTD
            movlw       0xFF
            movwf       PORTD
            ; ---------------------------
            btfsc       PORTB,3
            goto        Inizio_scrivo
            call        RITARDO_30ms
            banksel     PORTB
            btfss       PORTB,3
            goto        $-1
            clrf        PORTD
            ; ---------------------------
            call        ritardo_secondo
            ; ---------------------------
            banksel     SSPCON2
            clrf        SSPCON2
            bsf         SSPCON2,SEN ; INVIO START
            ; ---------------------------
            banksel     ADD_DS1307_PICRX
            movf        ADD_DS1307_PICTX,W; SCRIVO - 11010000
            banksel     SSPBUF
            movwf       SSPBUF
            banksel     SSPCON2
            btfsc       SSPCON2,ACKSTAT
            goto        $-1         ;
            ; ---------------------------
            banksel     SSPBUF
            clrf        SSPBUF
            banksel     SSPCON2
            btfsc       SSPCON2,ACKSTAT
            goto        $-1
            ; ---------------------------
            bsf         SSPCON2,2   ; STOP
            banksel     Inizio_scrivo
            ; ---------------------------
            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

Solo che mi da un errore
[PIC16 MSSP] PC=0x003D. Data written SSPBUF whilst MSSP (in I2C master mode) is active - data has been ignored. [U1]

Allora vedo cosa potrebbe essere con la AN735, consigliata. Sebbene, altro consiglio, potresti prendere le loro routines che sono utili per leggere i dati dell' RTC, visto che sono ben strutturate.
Ulteriormente, il 16F877A ha il debug in hardware che ti permette l 'ICD.



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




una ogni 10 livelli


postato il:
09.09.2018, alle ore 16:25
Ah! ci sono un paio di errori nel listato. Corretti con il compilatore. P.Es. l' etichetta Start e il CBLOCK che non dovrebbe stare in prima colonna.


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




una ogni 10 livelli


postato il:
09.09.2018, alle ore 17:37
Allora.....
Ho trovato delle macro
http://www.piclist.com/techref/microchip/i2c87xjs.htm
Che mi fa supporre che stai aspettando un ACK ds SPCON2.ACKSTAT, ma le macro dicono che dovresti aspettare da PIR1,SSPIF.



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





postato il:
10.09.2018, alle ore 17:46
picmicro675:
Allora.....
Ho trovato delle macro
http://www.piclist.com/techref/microchip/i2c87xjs.htm
Che mi fa supporre che stai aspettando un ACK ds SPCON2.ACKSTAT, ma le macro dicono che dovresti aspettare da PIR1,SSPIF.



C'è un interrupt... allora ricapitoliamo, guardando i grafici del protocollo I2C, dopo il bit start non dovrebbe esserci alcun ACK anche perchè lo slave non sa ancora se deve essere letto o scritto dal master. non capisco, in questa fase, perchè c'è da aspettare il PIR1,SSPIF posto che non dovrebbe esserci, appunto, alcun segnale ACK

mi è venuta in mente una cosa... faccio una prova e posto i risultati
angelole





postato il:
10.09.2018, alle ore 17:50
forse occorrerebbe fare polling per aspettare l'invio del bit start, dopodichè inviare la prima stringa (indirizzo dello slave + bit flag lettura/scrittura ed aspettare l'interrupt che segnali l'invio del primo byte? E' questo l'errore???
picmicro675




una ogni 10 livelli


postato il:
10.09.2018, alle ore 19:46
Penso che quello che hai mostrato all' inizio è solo un esplicativo. Non proprio quello che ti serve nel reale. Comunque a te non serve la gestione interrupt, basta solo che guardi il flag di SSPIF oppure SPCON2.ACKSTAT. Che mi pare sia citato anche nella AN735 (ripresi anche nella AN736)

Rispetto al link di cui sopra
     start_i2c
     movlf             01000011b,SSPBUF     ;send out io1 pcf8574 addr
     wait_for_ack_i2c
     enable_receive_i2c
     movff             SSPBUF,latest_switch_state
     stop_i2c
       endm

C'è da inviare lo start, che se vedi, sta ad aspettare che PIR1,SSPIF vada alto. Poi invia l' indirizzo e aspetta ancora che il PIR1,SSPIF vada alto. Poi abilita RCEN ed aspetta la risposta dallo slave.
Quindi manda uno stop.

Questo è quello che si fa di solito per inviare UN byte. C'è anche la procedura che invia una stringa di bytes, che mandano un restart per ogni byte senza il segnale di stop, che sarà l' ultimo.

Le macro potrebbero avere un difetto di aspettare incondizionatamente che lo slave risponda. Per me dovrebbe esserci un timeout e saltare un giro. Ma non ho ancora le informazioni corrette per dire se sia una cosa fatta bene.

Riferito al leggere i dati dall' RTC, presumo che la ricezione sia di una stringa di bytes, del quale si aspetterà quando arriva il segnale di stop.



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