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

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

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

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


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


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

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

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

Похожие темы


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