Здравствуйте Уважаемые! Собственно в PicBasicPro пользовался WRITE, READ этими командами, проблем не возникало, при включении питания данные считывались при отключении сохранялись. Начал переходить на Протон и не могу найти адекватной замены этим простым командам, всякие Cdata, Cread, Cwrite сохраняют данные не в EPROM Memory а в Program Memory туда где храниться основная программа. Просто write read не работают, перелопатил всю ИнструкцияProton+IDE и ничего. Ткните носом! Вот такая конструкция в пик бейсике работает у меня без проблем: проц 16F628A, 16F877A X var WORD Y var WORD
WRITE 1 , 9 WRITE 2 , 8 READ 1, X READ 2, Y
MAIN:'____________________Начало_________________________________ LCDOUT $FE,2,"X=",DEC3 X, $FE,$14,"Y=",DEC3 Y PAUSE 100 GOTO MAIN
Напоролся на небольшую проблему. Надо забить данные в память, затем, в ходе программы их читать. Но не получается. Упрощенная рограмма ниже приведена - там лапкой помахать в симуляторе; я пользуюсь picsimulatoride. Протон версии 3.5.2.6 MPASM 5.47. Пишу hex в контроллер, затам считываю память - данные там сидят. Получается, что проблема в операторе READ. Не разбираюсь в ассемблере, но не увидел там команды EEADR. Переписал кусок программы в PICBASIC (2.47 если что), там всё работает. Можно, конечно, и всю программу написать на PICBASIC, но на Протоне она чуть короче. В чём может быть проблема?
Код
Device 12F683 Declare Reminders = OFF ' Xtal = 8 '----------------------------Предустановки---------------------------------------------------------- Config CP_OFF, CPD_OFF, PWRTE_OFF, MCLRE_OFF, WDT_OFF, INTRC_OSC_NOCLKOUT', BOREN_ON OSCCON = %01110000 ' 8 мгц 'ADCON0.7 = 1 ' выравнивание результата АЦП по правому краю CMCON0 = 7 ' откл TRISIO=%00011010 ' Dim a As Word ' Dim b As Byte ' Dim k As Word ' Dim PWM_value As Word ' Dim y As Byte 'Word k=0 y=0 b=0 EData 5, 5,2, 1, 3 , 127 '***************************** data_out: ' вывод a = ERead b GPIO.0 = 1 DelayUS 200 ' сброс GPIO.0 = 0 ' DelayUS 200 k = 0 Repeat If k > 0 Then ' GPIO.0 = 1 DelayUS 3 GPIO.0 = 0 EndIf Inc k Until k > a DelayMS 5 Inc b GoTo data_out '***************************** End
Этот кусок программы работает так: переменной k присваивается начальное значение 0, затем вход в цикл "repeat....until", затем внутри цикла проверяется условие k>0. В первом цикле оно не выполняется. В конце цикла к увеличивается на единицу и становится равным 1. Цикл повторяется со строчки "repeat". Условие k>0 в этом и последующих циклах выполняется, поэтому происходит помахивание лапкой. Так происходит до тех пор, пока переменная k не превысит значения другой переменной (или числа). Условие k>0 введено для того, чтобы число импульсов на выходе было равно значению этой самой другой переменной, а если убрать это условие, то на выходе будет на один импульс больше. Но вопрос в том, что число, которое Протон считывает из ячейки памяти по адресу 0 не равно тому, которое туда записано. А picbasic делает это всё правильно.
Да нет. Я пробовал и Edata as Byte, Edata as word и прочее. Кроме того, я пробовал просто забить нулями первый десяток адресов. Все равно читается не то, а, похоже 65535.
Да Ваш код в Протеусе. Только прописал, что бы в Еепром записывало двух байтовое значение, а не один байт. До того, по команде EREAD, считывало так же два байта, но так как у нас в первой ячейке 5 и во второй тоже 5, то мы получали 1285.
CMCON = 7 'отключаю компараторы (пока х/з зачем, но без этого не работает) INTCON.5 =1 'разрешить прерывания по таймеру OPTION_REG = %00000111 ' Установить в регистре OPTION_REG коэффициент деления равный 1:256 Symbol LED = PORTA.0 ' Присвоить RA0 псевдоним LED On Interrupt GoTo Preryvanie_po_timeru ' Инициализация (активация) программных прерываний Dim Pausa As Byte 'временная переменная Dim NomProg As Byte 'временная переменная
'DelayMS 1 ' Пауза 1 мсек GoTo Programma ' Выполнить переход к метке Fin==================================================================
Preryvanie_po_timeru: ' Метка начала выполнения подпрограммы вызванной программным прерыванием------------------ Disable ' Запретить программные прерывания (на всякий случай, что бы другие прерывания не сорвали план) Toggle LED ' Переключить светодиод в противоположное состояние If INTCON.5 = 1 Then DelayMS Pausa 'проверка какое прерываение (по таймеру ли) INTCON.2 = 0 ' Сбросить флаг прерываний от таймера (что бы не было переполнения) Resume ' Вновь разрешить обработку возникающих прерываний
1. При компиляции ругается на объявленную переменную. 2. Как прочитать 5 из памяти с вытекающими последствиями? Я новичок. За помощь стараюсь плюсовать репутацию (пока других способов сказать спасибо не знаю).
У Вас переменная Pausa определена как Byte, а в условии If NomProg = 5 Then Pausa = 1000 Вы присваивайте ей значение Word, вот компилятор и ругается. А по поводу Eread проблем не вижу, все вроде должно работать.