Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

Flash pic18f27j53



  1. #1
    MichelS62

    Unhappy Flash pic18f27j53


    ------

    Bonjour,

    J'utilise un pic pour enregistrer des info en provenance d'un GPS (communication série) et j'ai pas mal d'informations a stocker. C'est ce que m'a orienté vers ce micro (128 K).
    Je sais lire et écrire dans la flash que j'utilise comme une "data flash". Mon appareil lie le GPS et affiche les coordonnées sur un LCD. J'enregistre les positions latitude, longitude, vitesse, heure etc
    Bref pas mal de data. Mon problème c'est que je n'arrive pas a écrire dans le dernier bloc de 1024.
    Pour écrire une info, la page de 1024 doit être effacé et l’écriture est faite par bloc de 64 octets.
    Je commence a écrire en 0x3000 et tout se passe normalement jusque 0x1FC00. Ensuite aucune écriture !
    Je ne comprend pas ou se trouve mon pb (bug ?).
    Ci dessous un extrait de mon code.

    Code:
    #define WRITE_FLASH_BLOCKSIZE    64
    #define ERASE_FLASH_BLOCKSIZE    1024
    #define END_FLASH                          0x1FFFF
    
        /* stockage en mémoire par bloc de 32 octets et mise à jour de Cpt_Value */
        if (Cpt_Value > (ERASE_FLASH_BLOCKSIZE - 1)) { //appel ecriture si bloc rempli
            if (rul_FlashAddress <= END_FLASH) {
                FLASH_WriteBlock(rul_FlashAddress,rub_SaveToFlash);     //write 64 bytes * 16 block
                rul_FlashAddress = rul_FlashAddress + ERASE_FLASH_BLOCKSIZE;    /* prepare next flash address */
            }
            Cpt_Value = 0;
        }
    
    
    //function to write 
    T_UBYTE FLASH_WriteBlock(T_ULONG writeAddr, T_UBYTE *flashWrBufPtr) {
        T_ULONG blockStartAddr  = (T_ULONG )(writeAddr & ((END_FLASH) ^ (ERASE_FLASH_BLOCKSIZE-1)));
        T_UBYTE GIEBitValue = INTCONbits.GIE;     // Save interrupt enable
        T_UBYTE i;
        T_UBYTE Block;
        
        // Flash write must start at the beginning of a row
        if( writeAddr != blockStartAddr ) {
            return -1;
        }
        Block = 16;
        // Block erase sequence
    //    FLASH_EraseBlock(writeAddr);  Application will do it
    
        // Block write sequence
        TBLPTRU = (T_UBYTE)((writeAddr & 0x00FF0000) >> 16);    // Load Table point register
        TBLPTRH = (T_UBYTE)((writeAddr & 0x0000FF00)>> 8);
        TBLPTRL = (T_UBYTE)(writeAddr & 0x000000FF);
    
        do {
        // Write block of data
            for (i=0; i<WRITE_FLASH_BLOCKSIZE; i++) {
                TABLAT = flashWrBufPtr[i];  // Load data byte
    
                if (i == (WRITE_FLASH_BLOCKSIZE-1)) {
                    asm("TBLWT");
                    }
                else {
                    asm("TBLWTPOSTINC");
                }
            }
    
            EECON1bits.WREN = 1;
            INTCONbits.GIE = 0; // Disable interrupts
            EECON2 = 0x55;
            EECON2 = 0xAA;
            EECON1bits.WR = 1;  // Start program
    
            EECON1bits.WREN = 0;    // Disable writes to memory
            INTCONbits.GIE = GIEBitValue;   // Restore interrupt enable
            Block--;
            asm("TBLWTPOSTINC");                    /* start page */
            flashWrBufPtr = flashWrBufPtr + 0x40;   /* next 64 byte */
        } while (Block != 0);    // write 16 pages of 64 bytes
        return 0;
    }
    C'est une demande personnel, rien de pro dans cette demande. C'est une occupation pour les soirée et aussi le week end.
    Merci de vos retour.

    -----
    Dernière modification par JPL ; 29/09/2018 à 18h09. Motif: Ajout de la balise Code (#) pour garder l'indentation

  2. Publicité
  3. #2
    paulfjujo

    Re : Flash pic18f27j53

    boujour,

    Quid de des config bits ?
    Zone protégée ?
    Presence d'un Bootloader ?

  4. #3
    MichelS62

    Re : Flash pic18f27j53

    Bonjour Pauljjujo

    Merci pour ta réponse, pas de zone protégée a ma connaissance, Il y a un bootloader qui est situé entre 000 et FFF. Mon prog est entre 1000 et 2FFF, ci dessous les bits de config. Je commence a ecrire en 0x3000 et normalement jusque 1FFFF mais pas d'éciture réussie a partir de 1FC00

    Code:
    // CONFIG1L used for internal osc at 8 MHz#pragma config WDTEN = OFF      // Watchdog Timer (Disabled - Controlled by SWDTEN bit)
    #pragma config PLLDIV = 2       
    #pragma config CFGPLLEN = ON    // PLL Enable Configuration Bit (PLL Enabled)
    #pragma config STVREN = ON      // Stack Overflow/Underflow Reset (Enabled)
    #pragma config XINST = OFF      // Extended Instruction Set (Enabled)
    #pragma config CPUDIV = OSC1    // CPU System Clock Postscaler (No CPU system clock divide)
    #pragma config CP0 = OFF        // Code Protect (Program memory is not code-protected)
    #pragma config OSC = INTOSCPLL      // Oscillator (HS+PLL, USB-HS+PLL)
    #pragma config SOSCSEL = HIGH   // T1OSC/SOSC Power Selection Bits (High Power T1OSC/SOSC circuit selected)
    #pragma config CLKOEC = OFF     // EC Clock Out Enable Bit  (CLKO output disabled on the RA6 pin)
    #pragma config FCMEN = OFF      // Fail-Safe Clock Monitor (Disabled)
    #pragma config IESO = OFF       // Internal External Oscillator Switch Over Mode (Disabled)
    #pragma config WDTPS = 32768    // Watchdog Postscaler (1:32768)
    #pragma config DSWDTOSC = INTOSCREF// DSWDT Clock Select (DSWDT uses INTRC)
    #pragma config RTCOSC = T1OSCREF// RTCC Clock Select (RTCC uses T1OSC/T1CKI)
    #pragma config DSBOREN = OFF     // Deep Sleep BOR (Enabled)
    #pragma config DSWDTEN = OFF     // Deep Sleep Watchdog Timer (Enabled)
    #pragma config DSWDTPS = 8192     // Deep Sleep Watchdog Postscaler (1:2,147,483,648 (25.7 days))
    #pragma config IOL1WAY = OFF     // IOLOCK One-Way Set Enable bit (The IOLOCK bit (PPSCON<0>) can be set once)
    #pragma config ADCSEL = BIT10   // ADC 10 or 12 Bit Select (10 - Bit ADC Enabled)
    #pragma config MSSP7B_EN = MSK7 // MSSP address masking (7 Bit address masking mode)
    #pragma config WPFP = PAGE_0    // Write/Erase Protect Page Start/End Location (Write Protect Program Flash Page 0)
    #pragma config WPCFG = ON       // Write/Erase Protect Configuration Region  (Configuration Words page erase/write-protected)
    #pragma config WPDIS = OFF      // Write Protect Disable bit (WPFP<6:0>/WPEND region ignored)
    #pragma config WPEND = PAGE_0 
    #pragma config LS48MHZ = SYS48X8// Low Speed USB mode with 48 MHz system clock bit (System clock at 48 MHz USB CLKEN divide-by is set to 8)
    Ou j'ai raté un truc dans la config (possible, c'étais il y a plus d'un an !), ou j'ai un bug !
    Dernière modification par gienas ; 30/09/2018 à 07h18. Motif: Merci de penser à ajouter les balises de code pour faciliter la lecture!

  5. #4
    RISC

    Re : Flash pic18f27j53

    Salut,
    As-tu lu le document appelé Programming Specification pour le PIC18F47J53 ?
    Les derniers mots de l'espace FLASH sont réservés pour les mots de configuration
    a+
    Ma marotte ? les microcontrôleurs ;=)

  6. A voir en vidéo sur Futura
  7. Comparatifs

    Gagnez du temps et de l'argent grâce à nos comparatifs de produits. Parmi nos sujets :
  8. #5
    MichelS62

    Re : Flash pic18f27j53

    Bonjour RISC
    J'avais un doute de ce style, mais je pensais plutôt à un espace réservé par le programmateur pour l'utilisation ICSP (et/ou debug).
    Je n'ai pas ce document, mais je vais essayé de le trouver.
    Merci

  9. #6
    MichelS62

    Re : Flash pic18f27j53

    reBonjour

    Je confirme que les 8 derniers octets de la flash sont occupés !
    PIC18F27J53 Config word @ 1FFF8h:1FFFFh
    Il manquera donc les 64 derniers bytes dans mon appli.
    Merci encore pour votre réponse rapide.

  10. Publicité
  11. #7
    RISC

    Re : Flash pic18f27j53

    Salut,
    Un point important à considérer si tu stockes des données dans la flash (aussi appelé EEPROM Emulation).
    Le nombre de cycles min garanti pour les PIC18FxxJxx est de 10.000.
    Il existe des techniques pour maximiser et augmenter ce nombre de cycles en faisant "tourner les adresses" utilisées.
    La note d'application Data EEPROM emulation montre et explique comment appliquer cette techniques aux PIC18.
    a+
    Ma marotte ? les microcontrôleurs ;=)

Discussions similaires

  1. Flash Player ActiveX et/ou Flash Player NPAPI
    Par Fistos dans le forum Logiciel - Software - Open Source
    Réponses: 5
    Dernier message: 28/05/2016, 17h03
  2. [Divers] flash
    Par lion76 dans le forum Dépannage
    Réponses: 0
    Dernier message: 25/02/2011, 05h16
  3. Flash
    Par eqman dans le forum Électronique
    Réponses: 3
    Dernier message: 11/05/2008, 14h10
  4. Actu - Flash Player 9 : Adobe intègre la haute définition à son lecteur Flash
    Par RSSBot dans le forum Commentez les actus, dossiers et définitions
    Réponses: 0
    Dernier message: 22/08/2007, 12h15
  5. pop-up en flash
    Par ltaillan dans le forum Internet - Réseau - Sécurité générale
    Réponses: 4
    Dernier message: 28/11/2004, 08h46
Découvrez nos comparatifs produits sur l'informatique et les technologies.