完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
我为PIC18F87做了一个程序,还行。然后我必须把相同的代码迁移到PIC18F4620。该代码具有LCD、UART和七段显示器的接口。最后,所有的问题都在运行…除了EEPROM写函数。这个函数有不稳定的行为。我用的代码和数据表是一样的:EEPROFBCFECONE1,EEPGD;EngDeloBcCfEnEn1,CFGS;1=CONFIG。寄存器,0=闪存O DAT0S.BSFEFEC1,WRE;HabiTeA ECRITURBABCIMCONTRON,GIE;DeHabistia中断;MOVLW0x5MOVL2WAXAMOVOVWEF2BSFEFECO1,WR;BSFIMTCON,GIE;Habista中断;用户代码执行;用户代码执行BCFEFECO1,WRN;DeHabista ESCRITURA AL完成(EEIF集)BCFPIR2,EEFEURTURNI AM写入10个连续的循环:CyeDefBANCO,0;BANCO 1MOVWMNCNDMOVLW0XAM0VFWMulPLRCALMYPYS;(BANCO-1)*10MOVFLYBY字节,WMOVWWDATAWAYAXADYDR;Valor表DFSMOVFWFFRSR0LANDERMOVEVFDF0,WMOVWFDATAYEEDATAL写的CurfDATAEE该程序具有用于EUSAT功能的高中断例程。每次接收到来自EUART的消息时,都有中断,称为InIT例程。这个特性运行正常!高科代码0x000 08GotoIndiTI真的混淆了这个PIC中的中断功能。我不知道EEPROM写的问题是由于中断…还是我的代码…或者…我会感谢你们在这个问题上的善意支持。
以上来自于百度翻译 以下为原文 I made a program for PIC18f887 and was OK. Then I have to migrate the same code to the PIC 18F4620. The code have interfaces to LCD, UART and 7 segments displays. Finally, all issues are running OK....except the EEPROM write function. This function has and erratic behavior. The code I am using to write is the same one of the data sheet: ; RUTINA ESCRIBIR EN EEPROM WRITE MOVF DATA_EE_ADDRH,W MOVWF EEADRH MOVF DATA_EE_ADDR,W MOVWF EEADR MOVF DATA_EE_DATA,W MOVWF EEDATA ; DATO A SER ESCRITO EN LA EEPROM BCF EECON1,EEPGD ; SERA EN LA MEMORIA DE DATOS BCF EECON1,CFGS ; 1=CONFIG. REGISTERS, 0=FLASH O DAT0S. BSF EECON1,WREN ; HABILITA ESCRITURA BCF INTCON,GIE ; DESHABILITA INTERRUPCIONES ; MOVLW 0X55 MOVWF EECON2 MOVLW 0XAA MOVWF EECON2 BSF EECON1,WR ; BSF INTCON,GIE ; HABILITA INTERRUPCIONES ; USER CODE EXECUTION ; USER CODE EXECUTION BCF EECON1,WREN ; DESHABILITA ESCRITURA AL COMPLETAR (EEIF SET) BCF PIR2,EEIF RETURN I am writing 10 consecutive adresses in a loop: CHEE DECF BANCO,0 ; BANCO-1 MOVWF MULCND MOVLW 0X0A MOVWF MULPLR CALL MPY_S ;(BANCO-1)*10 MOVF L_BYTE,W MOVWF DATA_EE_ADDR ; VALOR INICIAL DE DATA_EE_ADDR MOVLW 0X44 ; VALOR INICIAL DE FSR MOVWF FSR0L ANDERE MOVF INDF0,W MOVWF DATA_EE_DATA CALL WRITE INCF DATA_EE_ADDR,1 INCF FSR0L,1 MOVLW 0X4E SUBWF FSR0L,0 BTFSS STATUS,Z GOTO ANDERE RETURN The program has the High Interrupt routine for the functioning of the EUSART. Each time its a received message from EUART, there is the interruption and its called the INNIT routine. This feature is running OK! HIGH_INT CODE 0x0008 GOTO INNIT I am really confused about how the interruptions function in this PIC. I do not know if the problem with the EEPROM write is due to interruptions...or my code...or..... I will appreciate your kind support in this issue. |
|
相关推荐
19个回答
|
|
|
您的代码看起来足够好,除了一些细节(使用0和1作为目的地,而不是首选W和F)-什么是不正确的工作?* * *可能需要一些银行和/或,访问/存储的说明符…
以上来自于百度翻译 以下为原文 Your code looks good enough, apart from some details (using 0 and 1 as destination, instead of preferred W and F) - what is not working exactly? You *may* need some BANKSEL and/or ,ACCESS/BANKED specifier... |
|
|
|
|
|
没有这样的装置。你是说PIC16F87吗?您的代码没有等待写入完成。您已经跳过了描述中的几个句子,只看到了“EEIF必须用软件清除”。也就是说,如果使用中断来检测写入的完成,中断服务必须做什么。你会在中断服务中这样做,只是等待WR位变低,这是很容易的。
以上来自于百度翻译 以下为原文 There is no such device. Did you mean a PIC16F887 ? Your code is not waiting for the write to finish. You have skipped a couple of sentences in the description, and just seen the "EEIF must be cleared by software". That is saying what your interrupt service must do if you use interrupts to detect the completion of the write. You would do that in the interrupt service. It's much easier to just wait for the WR bit to go low, which you are not doing. |
|
|
|
|
|
您好,非常感谢您的及时答复。Cinzia,我将使用W或F代替1或0。PIC18F4620不需要银行的选择。所有的FSR和SFR都在银行0。我的程序中的第一个指令是CLRF BRS。Qhb,也许如果我在BSF ITCN、GIE指令循环BTFSC EECO1、WR BRA循环继续程序之后编写,您认为可以吗?我应该如何处理PIR2,EEIF位?非常感谢…再次
以上来自于百度翻译 以下为原文 Hello, Thank you very much for your prompt answers. Cinzia, I will use W or F instead 1 or 0. The PIC18F4620 do not need the bank selection. All the FSR and SFR are in bank 0. The first instruction in my program is CLRF BRS. Qhb, Maybe if I write after BSF INTCON,GIE instruction LOOP BTFSC EECON1,WR BRA LOOP continue program Do you think is OK? What should I do with the PIR2,EEIF bit? Thank you very much...again |
|
|
|
|
|
QHB,我按照上面提到的那样做了……在不稳定的行为中没有变化。在字符1, 5, 6、7, 8, 9和10中写的总是很好。字符2, 3和4总是错误的。我对子程序代码做了几次修改,即使我做了一些例程而没有间接寻址。结果和上面提到的一样,这个程序是在EEPROM中编写的,但是由于某种原因,A.M.CARCTELTES总是错误的。急需帮助!!!!!!!眨眼:
以上来自于百度翻译 以下为原文 QHB, I did it as I mentioned above.....no changes in the erratic behavor. The writting is always well done in the characters 1, 5, 6, 7, 8, 9 and 10. The characters 2, 3 and 4 ALWAYS are wrong. I made several changes to my subroutines codes, even I made some routines without indirect addressing. The result was the same as mentioned above. The program is writting in the EEPROM, but for some reason, the a.m. caracteres are always wrong. Help needed urgently!!!!! wink: |
|
|
|
|
|
好的,是的!QHB是正确的:我从来没有在汇编程序中使用PIC18 EEPROM,但是我在C中有这个代码:所以,是的,你必须等待WR位变低——自从你说“我遵循了数据表演示代码”之后,我没有注意到你的第一个帖子。
以上来自于百度翻译 以下为原文 Ok, yep! QHB is right: I never used PIC18 EEprom in assembler, but I have this code in C: void EEscrivi_(SHORTPTR addr,BYTE n) { // usare void * ? EEADR = (BYTE)addr; EEDATA=n; EECON1bits.EEPGD=0; // Point to Data Memory EECON1bits.CFGS=0; // Access EEPROM EECON1bits.WREN=1; INTCONbits.GIE = 0; // disattiva interrupt globali... e USB? EECON2=0x55; // Write 55h EECON2=0xAA; // Write AAh EECON1bits.WR=1; // abilita write. INTCONbits.GIE = 1; // attiva interrupt globali do { ClrWdt(); } while(EECON1bits.WR); // occupato ? EECON1bits.WREN=0; // disabilita write. } BYTE EEleggi(SHORTPTR addr) { // usare void * ? EEADR=(BYTE)addr; // Address to read EECON1bits.EEPGD=0; // Point to Data Memory EECON1bits.CFGS=0; // Access EEPROM EECON1bits.RD=1; // EE Read return EEDATA; // W = EEDATA } So yes, you must wait for WR bit to go low - I had not noticed this in your first post since you said "I followed the datasheet demo code" |
|
|
|
|
|
您好,我还没有解决这个问题。我改变了我的EEPROM写代码如下:WrimeVFDATA、EEADDRH、WMOVWADFRADVFDATA、EEADDR、WMOVWADFRADMOVDATA数据、WMOVWFEATATABC FEFECO1、WRRR、ReStReReBrcFEFECO1、EEPGD、Sera EnLa DeMa***cFEFECO1、CFGS;1=CONFIG。寄存器,0=闪存O DAT0S.BSFEFEC1,WREN;Habista ESCRITURABC FITCON,GIE;DeHabistIa中断;MOVLW0X55 MOVW2X0AAMVOWVFECO2BSFEFE1,WRES1WRBTFSFSEECO1,WRGOOTES1WRBFTFSCEECO1,ReReGOOWRITBECBFECON1,EEFBCFEFECO1,ReNbsFiTCon,GEE Re转更,结果不如原始代码。T看起来有书写错误,PIC在无限循环中,我不能相信这种情况正在发生。!!!在PIC16F87/87A/887中,一直是写EEPROM,没有任何问题。我花了很多时间来解决这个问题…没有结果。即使我改变了PIC的另一个……同样的结果。
以上来自于百度翻译 以下为原文 Hello, I have not solved the problema yet. I changed my EEPROM Write code as follows: WRITE MOVF DATA_EE_ADDRH,W MOVWF EEADRH MOVF DATA_EE_ADDR,W MOVWF EEADR MOVF DATA_EE_DATA,W MOVWF EEDATA BCF EECON1,WRERR ; reset WRERR BCF EECON1,EEPGD ; SERA EN LA MEMORIA DE DATOS BCF EECON1,CFGS ; 1=CONFIG. REGISTERS, 0=FLASH O DAT0S. BSF EECON1,WREN ; HABILITA ESCRITURA BCF INTCON,GIE ; DESHABILITA INTERRUPCIONES ; MOVLW 0X55 MOVWF EECON2 MOVLW 0XAA MOVWF EECON2 BSF EECON1,WR ES1WR BTFSS EECON1,WR GOTO ES1WR BTFSC EECON1,WRERR GOTO WRITE BCF EECON1,EEIF BCF EECON1,WREN BSF INTCON,GIE RETURN The result is worse as the original code. It looks as there were writting error (s) and the PIC is in an infinite loop. I can´t believe this situation is happening !!! In PIC16F877/877a/887 always was the write eeprom without any problem. I have spend lot of hours with this issue....no results. Even I changed the PIC fot other one ...with the same results. Desesperado sad: I will appreciate your kind suppoprt. |
|
|
|
|
|
你的WR测试在POST后4中是正确的,现在你已经颠倒了:应该是“BTFSC”,而不是“BTFSS”。这意味着你根本没有在等待。
以上来自于百度翻译 以下为原文 You had the WR test correct in post #4, now you have it reversed: ES1WR BTFSS EECON1,WR GOTO ES1WR That should be "BTFSC", not "BTFSS". That means you are not waiting at all. |
|
|
|
|
|
你如何确定2, 3和4是错误的?此外,DATAYEEEEADDRH的价值是什么?
以上来自于百度翻译 以下为原文 How are you determining that 2, 3, and 4 are wrong? Also, what is the value of DATA_EE_ADDRH? |
|
|
|
|
|
HI QHB,正如我所理解的,WR位在写入完成时是高的,是正确的吗?然后,我必须要求在这一点上的高水平走出循环,不是吗?我知道这些字符是错误的,因为这10个字符显示在一个LCD中。不管我做了什么变化……总是错误的……但是其他的总是正确的。初始数据AdDr取决于BANCO号。例如,对于BANCO=1,初始数据AdDeAdDR为0x000……BANCO=2,初始数据AdEDADDR为0x00 A,因此,我正在检查中断逻辑和PrimRITYS……可能是因为在连续接收中有EUSAT,所以有干扰……有没有办法在TH中发布视频?F是朗姆酒吗?我是舒尔,有视频和我发布的代码之前,情况很清楚。非常感谢你的支持。最好的问候。
以上来自于百度翻译 以下为原文 Hi qhb, As I understood, the WR bit is high when the write was completted, is correct? Then, I have to ask for a high level in that bit to go out of the loop, no? I know that these caracteres are wrong, because the 10 caracteres are displayed in a LCD. No matters what changes I do...always they are wrong....but the other ones always are OK. The initial DATA_EE_ADDR depends of the Banco Number. For example for Banco = 1, the initial DATA_EE_ADDR is 0x000...for Banco = 2, the initial DATA_EE_ADDR is 0x00A and so. I am reviewing the interruptions logic and prioritys.....maybe because I have the EUSART in continuos reception, there is a interference ....... Is there a way to post a video in this fórum? I am shure that with the video and the codes I posted before the situation could be very clear. Thank you very much for your support. Best regards. |
|
|
|
|
|
不,你为什么这么想?PIC数据表非常清晰
以上来自于百度翻译 以下为原文 No. What makes you think that? The PIC datasheet is pretty clear |
|
|
|
|
|
嗨,QHB,你在BTFSC指令中是正确的。我很困惑(现在这个问题是我正常的状态微笑:)抱歉!!!!再次感谢。
以上来自于百度翻译 以下为原文 Hi qhb, You are right in the BTFSC instruction. I was confused (now with this issue is my normal state Smile: Sorry !!! And thanks again. Best regards |
|
|
|
|
|
|
|
|
|
|
|
嗨,QHB,还是不行!结果与A.M.相同,现在我知道EEPROM写功能是可以的。我把EEPROM读到MPLAB IDE(我使用PACTIT3),LCD中显示的字符与EEPROM中的字符相同。我现在正在探索间接寻址。所有这些代码都是MIDI踏板开关的一部分,IIS是我的项目。然后我应该检查决定字符将被存储在相应的字符标志(1到10)中的程序;Rutina de EnICONE NoBre de BANCO(1E A 27 EN LCD)BANKNAMECALTETACH;TAMA CaseNIDOS DEEEPROM Y LOS PUN;EN LAS标志CH1 A CH10(我知道这个例程运行正常!)DelpLeGar“BN”EN 0X59 EN LCD(我知道这个子程序是OK)MOVLW0x01MOVWFPOS;POS=1(位置标志,给我字符1到10的数据)MOVLWB’000000 10’;Db1= Inc. La Currimon DEL游标,Db0=NO DISP。移位CALLCDEMoDEMOVLWB“00000 111”;DB2=显示,DB1=光标闪烁CaldLCDDMODMOVLW0X1D;第1列,LCDVMOWWFDRAMILADADR的字符29;RealNeDoMoVWfChar;LoopPon Enchar;LoalIDAD de NICIO EN显示PARA银行名称(30/1)OBENBTFFSCFPBS1;0;Push Button UpGOTOINCC;SI。一个PrimTaTor Por PB Abjo按钮向下移动?BTFSCFPBS1;我们有一个减灾计划吗?Push Button Right?BTFSCFPBS1,3Gotoin Calbink;PB1?Push Button Left?BTFSCFPBS1,2GotoDasasr;PB5?按钮ReBeTffscfPBS1,6Gotol,SkgtotoBoIncCBFFPBS1,0MOVLW0X1D;计算器dFrimaDADIONADWFPOS,0;DFRAMYADADDR = POS +29 MOVWFDFRALADADCALDL CDSDDA;Po1-La CurrCon LCDCALLDCDATALAD;Lee EL CARACTER ESA DICOCIN MOVFD FrAMDARDATA数据,WMOVWFCHAR;LO GuurdAn ChanInfcar,1;Inc;WCALLPUTCHAR:PoOne CARACTER,EL光标Se MeEVE A DeCHEA MOVFDRADIMAND ADDR,W;ReRESA EL光标La CurrasADACDLCDSDAMOVLW0x43;存储字符在FrScH1to CH10,ADDWFPOS,W;按要求。FSR= 0x43MOVFFSR0LVMOFCHAR,WMOVWDFFFF0G0TUNCBCCFFPBS1,1MOVLW0X1D;CaldiaDMAGRADADDR @ POSIICONADADWFPOS,0;DFRAMYADADDR=POS +29 MOVWFDFRALDADADCARLDL CDSDDA;Po1-La CurcIn EN LCDCALLDCDATALAD;Lee EL CARACTER ESA DICOCIONMOVMODFRADIORDATA数据,WMOVWFCHAR;LO Guorda EN Calde FcChar,1;DEC CARMOVFDRADIODADDR,WACALLDCDSDA;WCALLPUTCHAR,PoOne CARACTER,EL光标Se MeEVE A DeCHEA MOVFDRADEMAIL ADDR,W;ReRESA EL光标,LaCaseAdLCDCDMADVOWLW0x0000 MOVFFSR0HMOVLW0x43;存储字符在FLASCH1 ToC10,ADDWFPOS,0;按要求D.FSR= POS+0x43MOVFFSR0LVMOFCHAR,WMOVWFIDFF0GOOTHCHTCIABABCFFPBS1,3CurfPOS,1;增量PosiCiOnVoWL0x0BSUWFPOS,0BTFSSSSATE,Z;POS=11?GOTLIECHA;MOVLW0X01;SI。具有POS=1MOVWFEXEFECHAMOVLW0X1D;计算dPrAgEndo1+d(1D=30 DEC)AdWFPOS,0MOVWFDRAMDADADRCALDLCDCDDA;PON游标AHI.CaldCDATALAD;LEE EL CARACTERMOVWFCHAR;POLLO EN CHARMOVDFRADIMAL ADDR,WCALLDCDCDAGATOTO LIKSDEABABCFFPBS1,2DEFPOS,1;增量增量BPTFSSSTATE,Z;POS=0?GOTLIECHB;MOVLW0X0A;SI。具有POS=10MOVWEFLIKECHEVBYMOVLWXX1D;CaldiaDFrimeAdDe= PoS+1D(1D=30 DEC)AdWFPOS,0MOVWFDRADAMADADCALLDCDSDA;PON光标AHI.CalLCDDATALAD;LEE EL CARACTERMOVWFCHAR;POLLO EN CHARMOVDFRADIMAL ADDR,WCALLCDCDSDAGOTO to SurCalCyCeleCeldBNEGEOTO QCHYNENOW我正在检查间接寻址与MOVW FSR0L,W有关的指令,看起来我必须将它改为:LFRS FSR0,W(WREG的方向没有在数据表中的指令列表中指定),但是当我构建项目时,MPLAB IDE说是成功的…所以我认为这个指令是有效的。您知道这个仪器吗?可以吗?你能对这个子程序给出你的观点吗?可以改进吗?在PIC16F87中,这个子程序运行正常!非常感谢,并向您致以最良好的问候。
以上来自于百度翻译 以下为原文 Hi qhb, Still is not OK!! The result is the same as a.m. Now I know that the EEPROM write function is OK. I read the EEPROM to MPLAB IDE (I use PICKIT3) and the characteres displayed in LCD are the same as the ones in the EEPROM. I am exploring now about indirect addressing. All this code is part of a MIDI Pedalboard-Switcher that I is my Project. AS EEPROM Write is OK! then I should check the routine that decide wich character will be stored in the corresponding Character Flag (1 to 10). ; RUTINA DE EDICION DE NOMBRE DE BANCO (1E A 27 EN LCD) BANKNAME CALL EETOCH ; TOMA CONTENIDOS DE EEPROM Y LOS PONE ; EN LAS FLAGS CH1 A CH10 (I know this routine is running OK!) CALL LCDBNON ; DESPLEGAR "BN" EN 0X59 EN LCD (I know this subroutine is OK) MOVLW 0X01 MOVWF POS ; POS=1 (Position Flag, give me the data for Character 1 to 10) MOVLW B'00000010' ; DB1=INC. LA DIRECCION DEL CURSOR, DB0=NO DISP. SHIFT CALL LCDEMODE MOVLW B'00000111' ; DB2=DISPLAY ON, DB1=CURSOR ON, DB0=CURSOR BLINKING CALL LCDDMODE MOVLW 0X1D ; column 1, character 29 of LCD MOVWF DDRAM_ADDR ; DIRECCION DDRAM DE INICIO CALL LCDSDDA ; set DDRAM address in LCD CALL LCDDATAREAD ; ENTREGA EL CARACTER EN W Y EN DDRAM_DATA MOVF DDRAM_DATA,W ; AQUI REGRESA EL CONTENIDO MOVWF CHAR ; LO PONE EN CHAR ; LOCALIDAD DE INICIO EN DISPLAY PARA BANK NAME (30/1) OBEN BTFSC FPBS1,0 ; SE APRETO PB ARRIBA? Push Button Up GOTO INCC ; SI. VE A INCREMENTAR CARACTER UNTEN ; NO. PREGUNTA POR PB ABAJO Push Button Down? BTFSC FPBS1,1 ; GOTO DECC ; SI. VE A DECREMENTAR CARACTER RECHT ; PB2? Push Button Right? BTFSC FPBS1,3 GOTO INCA LINKS ; PB1? Push Button Left? BTFSC FPBS1,2 GOTO DECA SCHR ; PB5? Push Button WRITE BTFSC FPBS1,6 GOTO LÖSCH GOTO OBEN INCC BCF FPBS1,0 MOVLW 0X1D ; CALCULA DDRAM_ADDR @ POSICION ADDWF POS,0 ; DDRAM_ADDR=POS+29 MOVWF DDRAM_ADDR CALL LCDSDDA ; PONE LA DIRECCION EN EL LCD CALL LCDDATAREAD ; LEE EL CARACTER DE ESA DIRECCION MOVF DDRAM_DATA,W MOVWF CHAR ; LO GUARDA EN CHAR INCF CHAR,1 ; INC CHAR MOVF DDRAM_ADDR,W CALL LCDSDDA ; PONE LA DIRECCION EN EL LCD MOVF CHAR,W CALL PUTCHAR ; PONE CARACTER, EL CURSOR SE MUEVE A LA DERECHA MOVF DDRAM_ADDR,W ; REGRESA EL CURSOR A LA DIRECCION CALCULADA CALL LCDSDDA MOVLW 0X43 ; store Character in Flags CH1 to CH10, ADDWF POS,W ; as required . FSR=POS+0X43 MOVWF FSR0L MOVF CHAR,W MOVWF INDF0 GOTO UNTEN DECC BCF FPBS1,1 MOVLW 0X1D ; CALCULA DDRAM_ADDR @ POSICION ADDWF POS,0 ; DDRAM_ADDR=POS+29 MOVWF DDRAM_ADDR CALL LCDSDDA ; PONE LA DIRECCION EN EL LCD CALL LCDDATAREAD ; LEE EL CARACTER DE ESA DIRECCION MOVF DDRAM_DATA,W MOVWF CHAR ; LO GUARDA EN CHAR DECF CHAR,1 ; DEC CHAR MOVF DDRAM_ADDR,W CALL LCDSDDA ; PONE LA DIRECCION EN EL LCD MOVF CHAR,W CALL PUTCHAR ; PONE CARACTER, EL CURSOR SE MUEVE A LA DERECHA MOVF DDRAM_ADDR,W ; REGRESA EL CURSOR A LA DIRECCION CALCULADA CALL LCDSDDA MOVLW 0X000 MOVWF FSR0H MOVLW 0X43 ; store character in Flags CH1 to CH10, ADDWF POS,0 ; as required. FSR=POS+0X43 MOVWF FSR0L MOVF CHAR,W MOVWF INDF0 GOTO RECHT INCA BCF FPBS1,3 INCF POS,1 ; INCREMENTA POSICION MOVLW 0X0B SUBWF POS,0 BTFSS STATUS,Z ; POS = 11? GOTO LEECHA ; NO. MOVLW 0X01 ; SI. HAS POS=1 MOVWF POS LEECHA MOVLW 0X1D ; CALCULA DDRAM_ADDR = POS+1D (1D=30 DEC) ADDWF POS,0 MOVWF DDRAM_ADDR CALL LCDSDDA ; PON CURSOR AHI. CALL LCDDATAREAD ; LEE EL CARACTER MOVWF CHAR ; PONLO EN CHAR MOVF DDRAM_ADDR,W CALL LCDSDDA GOTO LINKS DECA BCF FPBS1,2 DECF POS,1 ; INCREMENTA POSICION BTFSS STATUS,Z ; POS = 0? GOTO LEECHB ; NO. MOVLW 0X0A ; SI. HAS POS=10 MOVWF POS LEECHB MOVLW 0X1D ; CALCULA DDRAM_ADDR = POS+1D (1D=30 DEC) ADDWF POS,0 MOVWF DDRAM_ADDR CALL LCDSDDA ; PON CURSOR AHI. CALL LCDDATAREAD ; LEE EL CARACTER MOVWF CHAR ; PONLO EN CHAR MOVF DDRAM_ADDR,W CALL LCDSDDA GOTO SCHR LÖSCH CALL CHEE CALL LCDBNAME GOTO QCHYE Now I am checking the indirect addressing instruction related to MOVW FSR0L,W. It looks as I have to change it to: LFRS fsr0,w (the direction of WREG is not specified in the Instruction List in Data Sheet, but when I build the Project, MPLAB IDE says is successfuly.....so I should think this instruction is valid. Do you know if this instruction is OK? Could you be so kind to give your point of view about this subroutine? Could be improved? In PIC16F877 this subroutine ran OK!! Thank you very much and best regards |
|
|
|
|
|
在PIC16F中,它应该是JavaMVWF FSR0L从W转移到FSR0LROVMOF FSR0L,WTO从FSR0L转移到PIC18F,如果向MOVWF指令添加后缀,则如果访问库被使用,它将控制。
以上来自于百度翻译 以下为原文 MOVW FSR0L,W isn't valid. IN PIC16F, it should have been just MOVWF FSR0L to move from W to FSR0L or MOVF FSR0L,w to move from FSR0L to W In PIC18F, if you add a suffix to the MOVWF instruction, it's controlling if the access bank is used. |
|
|
|
|
|
你好,QHB,我延迟了我的答案,因为我正在学习PIC18F4620的指令和中断。而且,我不得不休息一下……我厌倦了这个问题。我对代码进行了完整的修订。我检查了任何间接的指令……我在EEPROM RO中增加了读写的延迟。UTIN(在我的第一次运行中,这些延迟帮助了很多)…我做了所有的改变,我认为这可能是问题的原因…我检查了代码的所有中断……甚至我改变了PIC的一个新的(两次)…事实是…只有2到4个字符失败了……其他的都是正确的,我不明白。如果有同样的方式管理数据的循环例程,为什么只有在这些特性中存在问题。我不想退出这个问题……我应该解决它……但是我有更多的TAN 3个星期从16F87迁移到18F4620(全职)。改变图片的原因是增加。EEPROM的数量,并能有一个程序名而不是银行名。所有的例程都在PIC16F87中运行得很好。我必须告诉你,首先我从PIC16F877 A迁移到PIC16F87,因为方便不改变已经配置的PIN,并有机会使用和D。我想要一个新的模拟输入。迁移过程不是一个大问题,我学到了很多。PIC18F4620一直是噩梦……主要是为了这个问题。我将回到我的第一个想法,让PIC16F87具有一个外部EEPROM(24LC1025 EEPROM)并继续我的项目。我会告诉你我在这个问题上的进展。再次感谢你的支持。
以上来自于百度翻译 以下为原文 Hello qhb, I delayed my answer because I was learning about PIC18F4620 instructions and Interruptions. Also, I had to rest a little bit.....I was tired of this issue. I made a complete revisión of the code....I checked any Indirect Adrressing instruction....I added delays to READ and WRITE in EEPROM routines (in my first runs, these delays helped a lot)....I made all changes I though could be a cause of the problem....I checked all the interruptions the code have.....even I changed the PIC for a new one (two times).... The fact is.... only the Characteres 2 to 4 failed....the other ones were correct. I can not understand it. If there are loop routines managing the data in the same way for all, why only in these Characteres there is a problem. I do not want to quit to this issue......I should solve it......but I have more tan 3 weeks migrating from 16F887 to 18F4620 (full time). The reason to change the PICS was to increase the EEPROM amount and be able to have a Program Name instead of Bank Name only. All the routines worked well in PIC16F887. I have to tell you that first I migrated from PIC16F877a to the PIC16F887, because of the convenience not to change the already configurated pins and have the chance to use and define a new Analog Input where I want. The migration process was not a big problem and I learned a lot. PIC18F4620 has been a nightmare.....mainly for this issue. I will return to my first idea to have the PIC16F887 with an external EEPROM (24LC1025 EEPROM) and continue with my Project. In parallel I will try to solve this misterious and frustrating issue. I will inform you about my progress in this issue. Thank you again for all your kind support. Best regards Germán Vázquez |
|
|
|
|
|
你好,QHC,终于跑了!!!!!!!!!!微笑:在我的小侄子的建议下,我改变了RAM位置的地址(字符1到10),并在中间运行程序。我必须承认我认为这个改变不能起作用,因为我把PIC改变了2次,结果是一样的。原来RAM地址是从0x44到0x4d。我从0x7d变为0x86.现在,为了了解这个nMaMARE,我想知道你的观点。造成这种情况的原因是原始的RAM位置0x45到0x47在PIC中有缺陷吗?即使我改变了两次PIC?这是程序错误吗?将来我应该知道什么,以避免这个问题将在未来发生?我再次感谢你们在我的话题上给予的支持和帮助。
以上来自于百度翻译 以下为原文 Hello qhc, Finally its running !!!!!!!! Smile: After the advice of my young nephew, I changed the addresses of the RAM location (Character 1 to 10) and inmediately ran the program. I have to confese that I thought this change could not function, because I changed the PIC 2 times and the result was the same. Originally the RAM addresses were from 0x44 to 0x4d. I changed from 0x7d to 0x86. Now, in order to learn of this nighmare, I would like to know your point of view about the cause of this situation. Are the original RAM locations 0x45 to 0x47 defective in the PIC? Even I changed the PIC twice? It is a program bug? What should I be aware in the future to avoid this issue will in the future happen? I would like to thank you again for your kind support and interes in my topic. Best regards. Germán Vázquez |
|
|
|
|
|
几乎可以肯定,它是程序中的一个bug,还有一些东西正在写入这些位置。如果你找不到它,试着上传整个程序作为附件让其他人看。
以上来自于百度翻译 以下为原文 Almost certainly it is a bug in your program, and something else is writing to those locations. If you can't find it, try uploading the whole program as an attachment for other people to look at. |
|
|
|
|
|
你好,QHC,谢谢你的建议和支持。
以上来自于百度翻译 以下为原文 Hello qhc, Thanks for your advice and support. Best regards Germán Vázquez |
|
|
|
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
473 浏览 0 评论
5793 浏览 9 评论
2334 浏览 8 评论
2224 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3530 浏览 3 评论
1122浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1095浏览 1评论
我是Microchip 的代理商,有PIC16F1829T-I/SS 技术问题可以咨询我,微信:A-chip-Ti
873浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
475浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 23:43 , Processed in 0.972356 second(s), Total 78, Slave 71 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2231