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 так сказать) Это первое что бросилось в глаза, может ошибка и не в этом
Сообщение отредактировал 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
Суть вопроса в том как заставить контроллер сформировать строку конечной длинны?
|
|
| |