Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » побайтовое чтение 24c256


побайтовое чтение 24c256

Сообщений 1 страница 28 из 28

1

Добрый день, прошу помощи в поиске косяка в следующем коде.
Я записал в eeprom 24c256 текстовый файл и пытаюсь читать данные из неё и выводить на дисплей 8х2.
Проблема в том, что Hibyte не увеличивается, на дисплее вижу только первые 256 байтов из начала файла.
Пожалуйста, покажите пальцем на косяк :)

Код:
$regfile = "m8515.dat"                                      ' specify the used micro
$crystal = 4000000                                          ' used crystal frequency
$baud = 9600                                                ' use baud rate
$hwstack = 32                                               ' default use 32 for the hardware stack
$swstack = 10                                               ' default use 10 for the SW stack
$framesize = 40                                             ' default use 40 for the frame space
Config Lcdbus = 4
Config Lcd = 16 * 2	'у меня 8х2, но в библиотеке такого нет
Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Portc.0 , Rs = Portc.1


Dim D_r As Byte , I As Integer , S As Byte , P As Byte , Hibyte As Byte , Lobyte As Byte

Config Scl = Portc.3
Config Sda = Portc.4
	'для моей платы: A0 -> +5В
	'A1 и A2 ->Ground, адрес: 1010_001x
Loop:
	'для 24с256: 128*256=32768 байтов
For Hibyte = 0 To 127                                       'высший адрес eeprom
   For Lobyte = 0 To 255                                    'низший адрес eeprom
   
	'позиционирование курсора вручную,
	'для каждого символа:
S=1	'первая строка
P = P + 1	'позиция в строке - с 1 по 8
If P > 8 Then'если позиция больше 8
	P = 1	'переходим в поз. 1
	S = S + 1'следующей строки
	If S > 2 Then
S = 1
	End If
End If
        Locate S , P'установим курсор на дисплее

        '********** read byte from EEPROM **************************************************
        I2cstart                                        	'generate start
        I2cwbyte &B1010_0010                            	'send device adsress
        I2cwbyte Hibyte                                	 	'H address of EEPROM
        I2cwbyte Lobyte                                 	'L address of EEPROM
        I2cstart                                        	'repeated start
        I2cwbyte &B1010_0011                            	'slave address (read)
        I2crbyte D_r , Nack                             	'read byte from EEPROM
        I2cstop                                        	 	'generate stop

        Lcd Chr(D_r)'выведем символ по коду
        Waitms 100
   Next Lobyte
Next Hibyte

Goto Loop

только-что заметил:

Код:
$regfile = "m8515.dat"                                      ' specify the used micro

а у меня не мега, а at90s8515 (с 2005 года валялась в закромах родины :) ), но для данного случая это ведь несущественно?

0

2

да, ещё вчера поправил :)

вот так работает:

Код:
$regfile = "8515def.dat"                                    ' specify the used micro
$crystal = 4000000                                          ' used crystal frequency
$baud = 9600                                                ' use baud rate
$hwstack = 32                                               ' default use 32 for the hardware stack
$swstack = 10                                               ' default use 10 for the SW stack
$framesize = 40                                             ' default use 40 for the frame space
Config Lcdbus = 4
Config Lcd = 16 * 2                                         'у меня 8х2, но в библиотеке такого нет
Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Portc.0 , Rs = Portc.1


Dim D_r As Byte , I As Integer , S As Byte , P As Byte , Hibyte As Byte , Lobyte As Byte

Config Scl = Portc.3
Config Sda = Portc.4

Led Alias Portc.2                                           'индикатор работы
Config Pinc.2 = Output
Portc.2 = 1                                                 'вкл. подтягивающий резистор для светодиода

                                                            'для моей платы: A0 -> +5В
                                                            'A1 и A2 ->Ground, адрес: 1010_001x

 Hibyte = 0
 Lobyte = 0
 S = 0
 P = 0

 Cls
 Cursor Off

'Loop:
                                                            'для 24с256: 128*256=32768 байтов
   For Hibyte = 0 To 127                                    'высший адрес eeprom
      For Lobyte = 0 To 255                                 'низший адрес eeprom
      Incr I                                                'обший счётчик байтов
                                                            'позиционирование курсора вручную,
                                                            'для каждого символа:
      P = P + 1                                             'позиция в строке - с 1 по 8
      If P > 8 Then                                         'если позиция больше 8
         P = 1                                              'переходим в поз. 1
         S = S + 1                                          'следующей строки
         If S > 2 Then                                      'если дошли до конца экрана
            Waitms 500
            Cls                                             'заполняем экран заново
            S = 1
         End If
      End If
      Locate S , P                                          'установим курсор на дисплее

      '********** read byte from EEPROM **************************************************
      I2cstart                                              'generate start
      I2cwbyte &B1010_0010                                  'send device adsress
      I2cwbyte Hibyte                                       'H address of EEPROM
      I2cwbyte Lobyte                                       'L address of EEPROM
      I2cstart                                              'repeated start
      I2cwbyte &B1010_0011                                  'slave address (read)
      I2crbyte D_r , Nack                                   'read byte from EEPROM
      I2cstop                                               'generate stop

      Lcd Chr(d_r)                                          'выведем символ по коду
      Toggle Led
      Waitms 100                                            'индикация работы
      Toggle Led
   Next Lobyte
Next Hibyte

Cls
Locate 1 , 1
Lcd "The end:"
Locate 2 , 1
Lcd I
'Goto Loop                                                   'end program

End

0

3

Скажите правильно ли я делаю запись чтение 24С256 ?

'**********************************************************
'               чтение 24Ñ256
'**********************************************************
      Waitms 50
      I2cstart                                              'äàåì ñèãíàë ñòàðò i2c øèíå
      I2cwbyte &B1010_0000                                  'îòïðàâëÿåì àäðåñ ìèêðîñõåìû è àäðåñ áëîêà
      I2cwbyte &B1010                                       'H address of EEPROM
      I2cwbyte &B0000                                       'L address of EEPROM
      I2cwbyte &H00                                         'îòïðàâëÿåì àäðåñ ÿ÷åéêè
      I2cstart                                              'ñíîâà îòïðàâëÿåì ñòàðò
      I2cwbyte &B1010_0001                                  ' ñíîâà îòïðàâëÿåì àäðåñ ìèêðîñõåìû è àäðåñ áëîêà  íà êîíöå ïîñûëêè òåïåðü áóäåò 1 - áèò ÷òåíèÿ
      I2crbyte Ðàñòîÿíèå , Ack                              '0 êëàäåì â ïåðåìåííóþ  ïðî÷èòàííûé áàéò
      I2crbyte Îõðàíà , Ack                                 '1 êëàäåì â ïåðåìåííóþ  ïðî÷èòàííûé áàéò
      I2crbyte Ñðàáàòûâàíèå_ðàç , Nack                      '2 êëàäåì â ïåðåìåííóþ  ïðî÷èòàííûé áàéò
      I2cstop                                               'generate stop

'**********************************************************
'                   запись 24Ñ256
'**********************************************************

      Waitms 50
      I2cstart                                              'äàåì ñèãíàë ñòàðò i2c øèíå
      I2cwbyte &B1010_0000                                  'îòïðàâëÿåì àäðåñ ìèêðîñõåìû è àäðåñ áëîêà
      I2cwbyte &B1010                                       'H address of EEPROM
      I2cwbyte &B0000                                       'L address of EEPROM
      I2cwbyte &H00                                         'îòïðàâëÿåì àäðåñ ÿ÷åéêè
      I2cwbyte Ðàñòîÿíèå                                    '0 îòïðàâëÿåì áàéò, êîòîðûé íóæíî çàïèñàòü
      I2cwbyte Îõðàíà                                       '1 îòïðàâëÿåì áàéò, êîòîðûé íóæíî çàïèñàòü
      I2cwbyte Ñðàáàòûâàíèå_ðàç                             '2 îòïðàâëÿåì áàéò, êîòîðûé íóæíî çàïèñàòü
      I2cstop                                               'generate stop

Отредактировано olegkaras (2018-05-07 12:18:56)

0

4

olegkaras написал(а):

Скажите правильно ли я делаю запись чтение

Для начала, если не трудно, в Bascom перед операцией "Копировать" - включить RU... ;)

0

5

О, многоуважаемый Nord, Вы, конечно, очень крутой программист (по сравнению со мной, шалберником  :crazyfun: ) но, таки я стисняюся спрасить, а скока в энтой EEPROM-ине байтов память и уместится ли число (к примеру 1024) в один байт ???

0

6

olegkaras написал(а):

I2cstart                                              'äàåì ñèãíàë ñòàðò i2c øèíå
      I2cwbyte &B1010_0000                                  'îòïðàâëÿåì àäðåñ ìèêðîñõåìû è àäðåñ áëîêà


Афигенные комменты, даже гугель-шмугель переводчик не переводит... пичалько  :D
Слушай, а ты вроде как стиралку делал на Атмелине,  чО? Получилось? Стирает?

0

7

Nord написал(а):

Для начала, если не трудно, в Bascom перед операцией "Копировать" - включить RU...

Где именно включить ?

0

8

на клавиатуре включите русский и после этого копируйте тексты с русскими комментариями - это такой баг

0

9

Вот в протеусе работает а в железе если не закомментировать чтение 24с256 то контроллер вообще не работает .

Код:
$regfile = "m8def.dat"                                      ' мега8
$crystal = 8000000
$baud = 4800
$hwstack = 32                                               ' default use 32 for the hardware stack
$swstack = 10                                               ' default use 10 for the SW stack
$framesize = 40                                             ' default use 40 for the frame space

'Config Timer0 = Timer , Prescale = 256                      'настройка прерывания 125 Гц Pulse по таймеру ' Делитель 32768 / 64 / 256
'On Timer0 Pulse:
'Enable Interrupts
'Enable Timer0


Config Portd.4 = Output , Portc.2 = Output , Portc.3 = Output       'LED синий,LED красный, LED сирена
'***************входы**************
Config Portd.0 = Input , Portd.5 = Input , Portd.6 = Input , Portc.5 = Input , Portc.4 = Input
Set Portd.0 : Set Portc.4
Минус_key Alias Pind.0 : Плюс_key Alias Pinc.5 : Датчик_инфрак_pir Alias Pinc.4 : Охрана_вкл_ду Alias Pind.6 : Охрана_отк_ду Alias Pind.5

'************************* 24Сxx************************
Const Realization_i2c = 2                                   ' 1 - аппаратный i2c, 2 - программный i2c
  #if Realization_i2c = 2
      Config Sda = Portb.2
      Config Scl = Portb.1
      Config I2cdelay = 1
  #endif

  I2cinit                                                   ' Инициализация шины I2c
  Waitms 50                                                 ' Ждём пока запустится i2c



Config Portd.3 = Output                                     'выход для подключения ноги Trigger
Trigger Alias Portd.3
Trigger = 0

Config Portd.2 = Input                                      'вход для импульса Echo



Dim A As Word                                               'сюда копируется значение длины сигнала
Dim S As Word                                               'переменная для хранения расстояния
Dim Z_str As String * 8
Dim Растояние As Byte , Срабатывание_раз As Byte , Охрана As Byte
Dim Плюс As Bit
Dim Минус As Bit
Dim Pod_1 As Bit , Pod_2 As Bit , Pod_3 As Bit , Pod_4 As Bit
Dim Охрана_вкл As Byte , Охрана_отк As Byte
Dim Пуск_таймера_охраны As Bit , Импульсы_таймера_1 As Integer , Импульсы_таймера_1_sec As Byte , Заданное_время_охраны As Byte
Dim Pir As Byte , Настройка As Byte , Родар As Byte , Инфра_датчик As Byte

Const K = 0.1725                                            'коэффициент для перевода длины импульса в расстояние

'Waitms 50





  '**********************************************************
'                       Чтение 24С256
'**********************************************************
  [color=red]Waitms 50
      I2cstart                                              'даем сигнал старт i2c шине
      I2cwbyte &B1010_0000                                  'отправляем адрес микросхемы и адрес блока
      I2cwbyte &B1010                                       'H address of EEPROM
      I2cwbyte &B0000                                       'L address of EEPROM
      I2cwbyte &H00                                         'отправляем адрес ячейки
      I2cstart                                              'снова отправляем старт
      I2cwbyte &B1010_0001                                  ' снова отправляем адрес микросхемы и адрес блока  на конце посылки теперь будет 1 - бит чтения
      I2crbyte Растояние , Ack                              '0 кладем в переменную  прочитанный байт
      I2crbyte Охрана , Ack                                 '1 кладем в переменную  прочитанный байт
      I2crbyte Срабатывание_раз , Nack                      '2 кладем в переменную  прочитанный байт
      I2cstop                                               'generate stop[/color]


Do


Pir = Датчик_инфрак_pir
If Охрана = 1 Then
Portc.2 = 1
Else
Portc.2 = 0
End If


'=========== Кнопка "Плюс уставка Растояние" =========
  Плюс = Плюс_key
 If Плюс = 0 And Pod_1 = 0 And Настройка = 1 Then
 Pod_1 = 1
 If Растояние > 39 Then
Растояние = 40
 Else
 Portc.2 = 1
 Растояние = Растояние + 1
 End If

 Else
 If Плюс = 1 And Pod_1 = 1 Then
 Portc.2 = 0
 Pod_1 = 0
 End If
 End If

'=========== Кнопка "Минус уставка Растояние" =========
    Минус = Минус_key
 If Минус = 0 And Pod_2 = 0 And Настройка = 1 Then
 Pod_2 = 1
 If Растояние < 2 Then
Растояние = 1
 Else
 Portd.4 = 1
 Растояние = Растояние - 1
 End If

 Else
 If Минус = 1 And Pod_2 = 1 Then
 Portd.4 = 0
 Pod_2 = 0
 End If
 End If


'=========== Кнопка "Установка на охрану" =========
  Охрана_вкл = Охрана_вкл_ду
 If Охрана_вкл = 1 And Pod_3 = 0 Then
 Pod_3 = 1

 If Настройка = 1 Then
 Portd.4 = 1
 Portc.2 = 1
 Waitms 500
 Portd.4 = 0
 Portc.2 = 0
 Настройка = 0
 Else
 Охрана = 1
 End If



 '**********************************************************
'                       запись 24С256
'**********************************************************

'     Waitms 50
'      I2cstart                                              'даем сигнал старт i2c шине
'      I2cwbyte &B1010_0000                                  'отправляем адрес микросхемы и адрес блока
'      I2cwbyte &B1010                                       'H address of EEPROM
'      I2cwbyte &B0000                                       'L address of EEPROM
'      'I2cwbyte &H00                                         'отправляем адрес ячейки
'      I2cwbyte Растояние                                    '0 отправляем байт, который нужно записать
'      I2cwbyte Охрана                                       '1 отправляем байт, который нужно записать
'      I2cwbyte Срабатывание_раз                             '2 отправляем байт, который нужно записать
'      I2cstop                                               'generate stop

 Else
 If Охрана_вкл = 0 And Pod_3 = 1 Then
 Pod_3 = 0
 End If
 End If

'=========== Кнопка "Снятие с охраны" =========
    Охрана_отк = Охрана_отк_ду
 If Охрана_отк = 1 And Pod_4 = 0 Then
 Pod_4 = 1

 If Охрана = 0 Then
 Portd.4 = 1
 Portc.2 = 1
 Waitms 500
 Portd.4 = 0
 Portc.2 = 0
 Waitms 500
 Portd.4 = 1
 Portc.2 = 1
 Waitms 500
 Portd.4 = 0
 Portc.2 = 0


 Настройка = 1

 End If

 Охрана = 0
 '**********************************************************
'                       запись 24С256
'**********************************************************

     ' Waitms 50
'      I2cstart                                              'даем сигнал старт i2c шине
'      I2cwbyte &B1010_0000                                  'отправляем адрес микросхемы и адрес блока
'      I2cwbyte &B1010                                       'H address of EEPROM
'      I2cwbyte &B0001                                       'L address of EEPROM отправляем адрес ячейки
'      'I2cwbyte &H01                                         'отправляем адрес ячейки
'      I2cwbyte Охрана                                       '1 отправляем байт, который нужно записать
'      I2cstop                                               'generate stop


 Else
 If Охрана_отк = 0 And Pod_4 = 1 Then
 Pod_4 = 0
 End If
 End If





Trigger = 1                                                 'даем импульс на ногу Portd.4 длительностью 15 мкс
Waitus 15
Trigger = 0

Waitus 10
Pulsein A , Pind , 2 , 1                                    'ловим импульс высокого уровня на PinD.5

S = A / 6                                                   'переводим значения



Waitms 100

If Растояние >= S And Охрана = 0 And Настройка = 0 Then     'световая Индикация родара когда  снято с охраны
Portd.4 = 1
Родар = 1
Else
Родар = 0
Portd.4 = 0
End If

If Pir = 1 And Охрана = 0 And Настройка = 0 Then            'световая Индикация инфракрасного датчика когда  снято с охраны
Portc.2 = 1
Инфра_датчик = 1
Else
Инфра_датчик = 0
Portc.2 = 0
End If

If Инфра_датчик = 1 And Родар = 1 And Охрана = 1 Then       'Тревога
Portc.3 = 1
Else
Portc.3 = 0
End If

'**********************************************************
'                       запись 24С256
'**********************************************************

     ' Waitms 50
'      I2cstart                                              'даем сигнал старт i2c шине
'      I2cwbyte &B1010_0000                                  'отправляем адрес микросхемы и адрес блока
'      I2cwbyte &B1010                                       'H address of EEPROM
'      I2cwbyte &B0002                                       'L address of EEPROM отправляем адрес ячейки
'      I2cwbyte Срабатывание_раз                             '1 отправляем байт, который нужно записать
'      I2cstop                                               'generate stop


Loop

End

0

10

Зачем вот это, если UART не используется ?
$baud = 4800

Это значение увеличить не пробовали ?
$swstack = 10

0

11

Работает, забыл про подтягивающие резисторы 24С256, остальсь впаять эту память и проверить в железе.

0

12

Это только у меня не хочет компилится ?

Код:
$regfile = "m8def.dat"                                      ' мега8
$crystal = 8000000
'$baud = 4800
$hwstack = 32                                               ' default use 32 for the hardware stack
$swstack = 50                                               ' default use 10 for the SW stack
$framesize = 40                                             ' default use 40 for the frame space




Config Portd.4 = Output , Portc.2 = Output , Portc.3 = Output       'LED синий,LED красный, LED сирена
'***************входы**************
Config Portd.0 = Input , Portd.5 = Input , Portd.6 = Input , Portc.5 = Input , Portc.4 = Input
Set Portd.0 : Set Portc.4
Минус_key Alias Pind.0 : Плюс_key Alias Pinc.5 : Датчик_инфрак_pir Alias Pinc.4 : Охрана_вкл_ду Alias Pind.6 : Охрана_отк_ду Alias Pind.5

'************************* 24Сxx************************
Const Realization_i2c = 2                                   ' 1 - аппаратный i2c, 2 - программный i2c
  #if Realization_i2c = 2
      Config Sda = Portb.2
      Config Scl = Portb.1
      Config I2cdelay = 1
  #endif

  I2cinit                                                   ' Инициализация шины I2c
  Waitms 50                                                 ' Ждём пока запустится i2c



Config Portd.3 = Output                                     'выход для подключения ноги Trigger
Trigger Alias Portd.3
Trigger = 0

Config Portd.2 = Input                                      'вход для импульса Echo



Dim A As Word                                               'сюда копируется значение длины сигнала
Dim S As Word , Сантиметры As Word                          'переменная для хранения расстояния
Dim Z_str As String * 8
Dim Растояние As Byte , Срабатывание_раз As Byte , Охрана As Byte
Dim Плюс As Bit
Dim Минус As Bit
Dim Pod_1 As Bit , Pod_2 As Bit , Pod_3 As Bit , Pod_4 As Bit , Pod_5 As Byte , Pod_6 As Byte
Dim Охрана_вкл As Byte , Охрана_отк As Byte
Dim Пуск_таймера_охраны As Bit , Импульсы_таймера_1 As Integer , Импульсы_таймера_1_sec As Byte , Заданное_время_охраны As Byte , Заданное_время_охраны_nov As Byte
Dim Пуск_таймера_2 As Byte , Импульсы_таймера_2 As Integer , Интервал As Byte
Dim Pir As Byte , Настройка As Byte , Родар As Byte , Инфра_датчик As Byte
Dim Д As Byte , В As Byte

Const K = 0.1725                                            'коэффициент для перевода длины импульса в расстояние

'Waitms 50





  '**********************************************************
'                       Чтение 24С256
'**********************************************************
  Waitms 50
      I2cstart                                              'даем сигнал старт i2c шине
      I2cwbyte &B1010_0000                                  'отправляем адрес микросхемы и адрес блока
      I2cwbyte &B1010                                       'H address of EEPROM
      I2cwbyte &B0000                                       'L address of EEPROM
      I2cwbyte &H00                                         'отправляем адрес ячейки
      I2cstart                                              'снова отправляем старт
      I2cwbyte &B1010_0001                                  ' снова отправляем адрес микросхемы и адрес блока  на конце посылки теперь будет 1 - бит чтения
      I2crbyte Растояние , Ack                              '0 кладем в переменную  прочитанный байт
      I2crbyte Охрана , Ack                                 '1 кладем в переменную  прочитанный байт
      I2crbyte Д , Ack                                      '2 кладем в переменную  прочитанный байт
      I2crbyte В , Nack                                     '3 кладем в переменную  прочитанный байт
      I2cstop                                               'generate stop

      'Заданное_время_охраны = 1                                   'время на то щто бы покинуть територию
      Заданное_время_охраны_nov = Заданное_время_охраны
'Растояние = 1
Do


Pir = Датчик_инфрак_pir









 '**********************************************************
'                       запись 24С256
'**********************************************************

      Waitms 50
      I2cstart                                              'даем сигнал старт i2c шине
      I2cwbyte &B1010_0000                                  'отправляем адрес микросхемы и адрес блока
      I2cwbyte &B1010                                       'H address of EEPROM
      I2cwbyte &B0000                                       'L address of EEPROM
      I2cwbyte &H00                                         'отправляем адрес ячейки
      I2cwbyte Растояние                                    '0 отправляем байт, который нужно записать
      I2cwbyte Охрана                                       '1 отправляем байт, который нужно записать
     I2crbyte Д                                             '2 кладем в переменную  прочитанный байт
    I2crbyte В                                              '3 кладем в переменную  прочитанный байт
      I2cstop                                               'generate stop







 '**********************************************************
'                       запись 24С256
'**********************************************************

      Waitms 50
      I2cstart                                              'даем сигнал старт i2c шине
      I2cwbyte &B1010_0000                                  'отправляем адрес микросхемы и адрес блока
      I2cwbyte &B1010                                       'H address of EEPROM
      I2cwbyte &B0001                                       'L address of EEPROM отправляем адрес ячейки
      'I2cwbyte &H01                                         'отправляем адрес ячейки
      I2cwbyte Охрана                                       '1 отправляем байт, который нужно записать
      I2cstop                                               'generate stop










'**********************************************************
'                       запись 24С256
'**********************************************************

      'Waitms 50
'      I2cstart                                              'даем сигнал старт i2c шине
'      I2cwbyte &B1010_0000                                  'отправляем адрес микросхемы и адрес блока
'      I2cwbyte &B1010                                       'H address of EEPROM
'      I2cwbyte &B0001                                       'L address of EEPROM отправляем адрес ячейки
'      I2cwbyte Срабатывание_раз                             '1 отправляем байт, который нужно записать
'      I2cstop                                               'generate stop




'**********************************************************
'                       запись 24С256
'**********************************************************

     'Waitms 50
'      I2cstart                                              'даем сигнал старт i2c шине
'      I2cwbyte &B1010_0000                                  'отправляем адрес микросхемы и адрес блока
'      I2cwbyte &B1010                                       'H address of EEPROM
'      I2cwbyte &B0001                                       'L address of EEPROM отправляем адрес ячейки
'      I2cwbyte &H03                                         'отправляем адрес ячейки
'      I2cwbyte Заданное_время_охраны                        '3 отправляем байт, который нужно записать
'      I2cstop                                               'generate stop





Loop

End

0

13

попробуйте так

$regfile = "m8def.dat"                                      ' мега8
$crystal = 8000000
'$baud = 4800
$hwstack = 32                                               ' default use 32 for the hardware stack
$swstack = 50                                               ' default use 10 for the SW stack
$framesize = 40                                             ' default use 40 for the frame space


Config Portd.4 = Output , Portc.2 = Output , Portc.3 = Output       'LED синий,LED красный, LED сирена
'***************входы**************
Config Portd.0 = Input , Portd.5 = Input , Portd.6 = Input , Portc.5 = Input , Portc.4 = Input
Set Portd.0 : Set Portc.4
Минус_key Alias Pind.0 : Плюс_key Alias Pinc.5 : Датчик_инфрак_pir Alias Pinc.4 : Охрана_вкл_ду Alias Pind.6 : Охрана_отк_ду Alias Pind.5

'************************* 24Сxx************************
Const Realization_i2c = 2                                   ' 1 - аппаратный i2c, 2 - программный i2c
  #if Realization_i2c = 2
      Config Sda = Portb.2
      Config Scl = Portb.1
      Config I2cdelay = 1
  #endif

  I2cinit                                                   ' Инициализация шины I2c
  Waitms 50                                                 ' Ждём пока запустится i2c

Config Portd.3 = Output                                     'выход для подключения ноги Trigger
Trigger Alias Portd.3
Trigger = 0

Config Portd.2 = Input                                      'вход для импульса Echo

Dim A As Word                                               'сюда копируется значение длины сигнала
Dim S As Word , Сантиметры As Word                          'переменная для хранения расстояния
Dim Z_str As String * 8
Dim Растояние As Byte , Срабатывание_раз As Byte , Охрана As Byte
Dim Плюс As Bit
Dim Минус As Bit
Dim Pod_1 As Bit , Pod_2 As Bit , Pod_3 As Bit , Pod_4 As Bit , Pod_5 As Byte , Pod_6 As Byte
Dim Охрана_вкл As Byte , Охрана_отк As Byte
Dim Пуск_таймера_охраны As Bit , Импульсы_таймера_1 As Integer , Импульсы_таймера_1_sec As Byte , Заданное_время_охраны As Byte , Заданное_время_охраны_nov As Byte
Dim Пуск_таймера_2 As Byte , Импульсы_таймера_2 As Integer , Интервал As Byte
Dim Pir As Byte , Настройка As Byte , Родар As Byte , Инфра_датчик As Byte
Dim Д As Byte , В As Byte

Const K = 0.1725                                            'коэффициент для перевода длины импульса в расстояние

'Waitms 50



  '**********************************************************
'                       Чтение 24С256
'**********************************************************
  Waitms 50
      I2cstart                                              'даем сигнал старт i2c шине
      I2cwbyte &B1010_0000                                  'отправляем адрес микросхемы и адрес блока
      I2cwbyte &B1010                                       'H address of EEPROM
      I2cwbyte &B0000                                       'L address of EEPROM
      I2cwbyte &H00                                         'отправляем адрес ячейки
      I2cstart                                              'снова отправляем старт
      I2cwbyte &B1010_0001                                  ' снова отправляем адрес микросхемы и адрес блока  на конце посылки теперь будет 1 - бит чтения
      I2crbyte Растояние , Ack                              '0 кладем в переменную  прочитанный байт
      I2crbyte Охрана , Ack                                 '1 кладем в переменную  прочитанный байт
      I2crbyte Д , Ack                                      '2 кладем в переменную  прочитанный байт
      I2crbyte В , Nack                                     '3 кладем в переменную  прочитанный байт
      I2cstop                                               'generate stop

      'Заданное_время_охраны = 1                                   'время на то щто бы покинуть територию
      Заданное_время_охраны_nov = Заданное_время_охраны
'Растояние = 1
Do

Pir = Датчик_инфрак_pir







'**********************************************************
'                       запись 24С256
'**********************************************************

      Waitms 50
      I2cstart                                              'даем сигнал старт i2c шине
      I2cwbyte &B1010_0000                                  'отправляем адрес микросхемы и адрес блока
      I2cwbyte &B1010                                       'H address of EEPROM
      I2cwbyte &B0000                                       'L address of EEPROM
      I2cwbyte &H00                                         'отправляем адрес ячейки
      I2cwbyte Растояние                                    '0 отправляем байт, который нужно записать
      I2cwbyte Охрана                                       '1 отправляем байт, который нужно записать
     I2crbyte Д   , Ack                                         '2 кладем в переменную  прочитанный байт
    I2crbyte В    , Nack                                            '3 кладем в переменную  прочитанный байт
      I2cstop                                               'generate stop





'**********************************************************
'                       запись 24С256
'**********************************************************

      Waitms 50
      I2cstart                                              'даем сигнал старт i2c шине
      I2cwbyte &B1010_0000                                  'отправляем адрес микросхемы и адрес блока
      I2cwbyte &B1010                                       'H address of EEPROM
      I2cwbyte &B0001                                       'L address of EEPROM отправляем адрес ячейки
      'I2cwbyte &H01                                         'отправляем адрес ячейки
      I2cwbyte Охрана                                       '1 отправляем байт, который нужно записать
      I2cstop                                               'generate stop








'**********************************************************
'                       запись 24С256
'**********************************************************

      'Waitms 50
'      I2cstart                                              'даем сигнал старт i2c шине
'      I2cwbyte &B1010_0000                                  'отправляем адрес микросхемы и адрес блока
'      I2cwbyte &B1010                                       'H address of EEPROM
'      I2cwbyte &B0001                                       'L address of EEPROM отправляем адрес ячейки
'      I2cwbyte Срабатывание_раз                             '1 отправляем байт, который нужно записать
'      I2cstop                                               'generate stop


'**********************************************************
'                       запись 24С256
'**********************************************************

     'Waitms 50
'      I2cstart                                              'даем сигнал старт i2c шине
'      I2cwbyte &B1010_0000                                  'отправляем адрес микросхемы и адрес блока
'      I2cwbyte &B1010                                       'H address of EEPROM
'      I2cwbyte &B0001                                       'L address of EEPROM отправляем адрес ячейки
'      I2cwbyte &H03                                         'отправляем адрес ячейки
'      I2cwbyte Заданное_время_охраны                        '3 отправляем байт, который нужно записать
'      I2cstop                                               'generate stop



Loop

End

0

14

Спасибо, так работает.

0

15

Как правильно записать только первую ячейку ? Вот так в протеусе пишет не в первую ячейку , почему в протеусе в таблице памяти 24с256  в ячейках при саписи значения не меняются ?

Код:
'**********************************************************
'                       запись 24С256
'**********************************************************

      Waitms 50
      I2cstart                                              'даем сигнал старт i2c шине
      I2cwbyte &B1010_0000                                  'отправляем адрес микросхемы и адрес блока
      I2cwbyte &B1010                                       'H address of EEPROM
      I2cwbyte &B0000                                       'L address of EEPROM отправляем адрес ячейки
      I2cwbyte &H01                                         'отправляем адрес ячейки
      I2cwbyte Охрана                                       '1 отправляем байт, который нужно записать
      I2cstop                                               'generate stop

0

16

Мне стыдно  :mad:, но я тоже наступил на грабли при использовании памяти М24С64.
Как мы видим, что данная память имеет объём 65535 бит или 8192 байта. Размер страницы 32 байта.
Размер страницы определяет максимальное количество байт, которое можно записать в неё в одном цикле.
По наивности я понял, что записать можно начиная с любого адреса, главное, чтобы общее количество байт было не более 32.
Оказывается фиг вам. Записать можно только постранично, как собственно и прочитать записанное.
Для примера. Если начать писать, например, с 25 адреса 15 байт, то запишется и естественно прочитаются только первые  8 байт. Остальные 7 канут в лету.
То есть при записи массива байт длиной более страницы, нужно разбивать этот массив на размер страницы и писать постранично, тоже и при чтении.
Минусом такой организации является не оптимальное расходование памяти. Если вы например записали в первую страницу 10 байт, то у вас там ещё остаётся 22 байта, но
в случае если вам необходимо записать следующий массив байт размером более 22 байта, то приходится записывать его не с 11 адреса, а с 33 и пустые 22 байта так и останутся пустыми.
Конечно это не очень крупный недостаток, память сейчас дешёвая, но жаба душит.
Вот такие грабли могут подстерегать и вас. Буду рад если кому то пригодится. :flag:

Отредактировано sva-don (2018-09-21 09:45:41)

0

17

Надо просто не использовать постраничную запись или юзать какой-то другой чип (без постраничной привязкой, с просто буфером). Нет принципиальной никакой разницы, как писать, т.к. для определенных задач этой скорости достаточно и так, а для остальных - она тормоз. :)
И ещё кстати надо думать о времени записи...

0

18

RDW написал(а):

Надо просто не использовать постраничную запись или юзать какой-то другой чип (без постраничной привязкой, с просто буфером). Нет принципиальной никакой разницы, как писать, т.к. для определенных задач этой скорости достаточно и так, а для остальных - она тормоз.
И ещё кстати надо думать о времени записи...

Я долго думал. Ничего не понял.  :glasses:
Какая память не является страничной?
Как можно записать например строку длинной 50 символов?

Отредактировано sva-don (2018-09-21 15:16:11)

0

19

4. BYTE and PAGE WRITE (up to 32 Bytes)

5. RANDOM and SEQUENTIAL READ Modes
Значит датащи врут  :rofl:

Ещё там есть кусок кода в графическом виде Fig.13 где рассмотрены способы Random чтения и записи одного байта.

0

20

-NMi- написал(а):

BYTE and PAGE WRITE (up to 32 Bytes)

Это всем понятно, я неправильно выразился. Я имел ввиду, что для записи данных длиной более 1 байта требуется постраничная запись.
При превышении данными длины страницы нужно предусмотреть разбитие этого массива на куски равные длине страницы.
А вот для операции чтения страничная организация скорее всего не мешает. Попробую, напишу.

0

21

sva-don написал(а):

Записать можно только постранично, как собственно и прочитать записанное.

Приношу свои извинения. Ограничение на длину страницы действует только для записи.
Читать можно от 0 и до конца. Только что проверил.

0

22

sva-don написал(а):

Я долго думал. Ничего не понял.  :glasses:

Этонадо ещё догадаться, что не понял,там много мыслей изложено.

sva-don написал(а):

Какая память не является страничной?

Например FM24V02A.

sva-don написал(а):

Как можно записать например строку длинной 50 символов?

Ну пишешь и всё. :) И так целых 32КБ, причем есть версии и на 512КБ...

0

23

RDW написал(а):

Например FM24V02A.

И какова же цена такой штучки? 32кб  самая дешёвая 378 р. :mad:
M24C64, которую я использую 30 руб за пару.
Ну нет, лучше уж я со страничками повоюю. :crazyfun:

0

24

sva-don написал(а):

M24C64, которую я использую 30 руб за пару

Ну, хозяин - барин.

sva-don написал(а):

Ну нет, лучше уж я со страничками повоюю.

Как бы в времена ZX-спектрума 128, я делал некую систему на подобия виндоуса, свап на дискету с менеджером памяти, там как раз была тема запихивания больших объёмов данных, в маленькую ОЗУ и с учетом постраничным переключением оперативки (по 16КБ)...в общем я это к чему, в еепромке всё проще, там только на запись надо обычную математику применить, делаешь просто подпрограмму обращения, а не на прямую пишешь и всё. Благо с чтением таких проблем нет. Впрочем как писал ранее, я не вижу никакого смысла заморачиваться с пакетной записью, можно тупо по адресу каждый раз фигачить. Явно данные не реалтайм, а как хранение настроек используется (единовременно и проблема из пальца).

+1

25

RDW написал(а):

Впрочем как писал ранее, я не вижу никакого смысла заморачиваться с пакетной записью, можно тупо по адресу каждый раз фигачить.

+100500

0

26

RDW написал(а):

Как бы в времена ZX-спектрума 128, я делал некую систему на подобия виндоуса

Уотт энто разворот ! Уиндовс на спекки?  :rofl:  Никогда не видел  :D
А поподробнее?

0

27

-NMi- написал(а):

А поподробнее?

Я имел ввиду про виртуализацию памяти (виртуальная память). Идея была рабочая, но чтобы её развивать/использовать нужно было: писать соответственно программы под это или хотя бы данными как-то ворочить. В любом случаю, этому не суждено было случится, т.к. на тот момент, в магазинах резко стали продаваться ПиСи и как мы знаем, там хар-ки были уже заоблачными по отношению к Спектруму и всё умерло (т.е. до 286 архитектуры как-то можно было дотянутся по идеологии и с извращениями, дальше всё).

Отредактировано RDW (2018-09-23 10:58:23)

0

28

А я уж спектрум вытащил, шоб винамп тудЫ поставить  :D

0

Похожие темы


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » побайтовое чтение 24c256