[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
I2C EEPROM
kioloДата: Суббота, 09.11.2013, 22:09 | Сообщение # 1
Группа: Пользователи
Сообщений: 2

Статус: Offline
Суть задачи в чтении EEPROM 24L02 нахождение Checksum первых 127 байт и сравнение ее со 128 байтом, где храниться уже полученное значение Checksum
С чтением и записью проблем нет способов масса, проблема как раз с Checksum, ее можно рассчитать только для строки, вроде это тоже не проблема но она появилась!

$regfile = "m16def.dat"
$crystal = 1000000

Dim Number(256) As Byte
Dim S As String * 127 At Number(1) Overlay
Dim Count As Word
Dim Nam As Byte
Dim Nam1 As Byte

Config Sda = Portb.1
Config Scl = Portb.0
I2cinit

Count = 0

Do

I2cstart
I2cwbyte &B10100000
I2cwbyte Count

Count = Count + 1 'наращиваем элемент массива

I2cstart
I2cwbyte &B10100001
I2crbyte Number(count) , Nack 'пишим в массив элемент +1 (т.к. массив с 1, а ячейка 0)
I2cstop

If Len(s) <> 127 Then 'следим за тем что происходит со строкой
Nam1 = Len(s) 'следим за тем что происходит со строкой
Else '
Nam1 = Len(s) 'следим за тем что происходит со строкой
Nam = Checksum(s) 'считаем Checksum(s)
End If

If Count = 256 Then 'повторяем с нуля
Count = 0
Waitms 1000
End If

Loop

Проблема в том что длинна строки не ограничивается 127 байтами, а разрастается на весь массив, а потом и вовсе падает в 0, с данной конструкцией четко считается Checksum при первом проходе, но вот дальше он просто прекращает считаться! длинна строки всегда 0 или 1

Где я ошибаюсь?


 
topДата: Суббота, 09.11.2013, 22:45 | Сообщение # 2
Группа: Друзья
Сообщений: 146

Статус: Offline
Переменная Count. Задана как Word, но судя по листингу ей суждено быть Byte. И если так то, у Вас инкремент от Count=0 до Count=256 - итого 257 значений, это overflow так сказать)
Это первое что бросилось в глаза, может ошибка и не в этом wink




Сообщение отредактировал top - Суббота, 09.11.2013, 22:46
 
kioloДата: Суббота, 09.11.2013, 23:38 | Сообщение # 3
Группа: Пользователи
Сообщений: 2

Статус: Offline
Читаем внимательно, ячейки памяти начинаются с 0, а вот массив с 1 так что все правильно массив от 1 до 256 и после считывания 256 значения мы переходим к 0 адресу, значение 256 заданно для массива!!!!!
Вопрос стоит не в массиве, он формируется всегда правильно и вся EEPROM четко ложиться в память, а вот строка отказывается быть строкой!!!!! Len(s) упорно наращивается даже достигнув Len(s) = 127.
Я пробовал и копировать весь массив создавая новую строку, но там все еще хуже строка становиться бесконечной и заполнив всю память контроллер уходит в себя.
Я так понимаю проблема именно в том как BASCOM формирует строку, а точнее просто ее не формирует вообще, при выполнении команды PRINT он закрывает длину строки равную длине сообщения, но если формировать саму строку контроллером ограничения не действуют.
Т.е. мы сделали ошибку и задали строку меньшей чем нужно длинны например
Dim S As String * 3
и хотим записать в нее 1234, если это делать до компиляции BASCOM ругается, но если тоже сделать вот так

Dim S As String * 3
Dim Count As Word
Dim L As Byte

Do

Count = 1234
S = Chr(count)
L = Len(s)
Print S

Loop

Компилятор все скушает, и контроллер все выполнит в точности при этом вернет значение L равное 4

Суть вопроса в том как заставить контроллер сформировать строку конечной длинны?


 
  • Страница 1 из 1
  • 1
Поиск: