Отговори на тема  [ 8 мнения ] 
Преобразуване на данни 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение Преобразуване на данни
Проблема е следния: 32 битово число трябва да се предаде по сериен канал.Написах следната програма на PICC на HiTech за PIC16F874 ама нещо неще да става:

#ifndef _16F874
#define _16F874
#endif
#include <pic.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>

#include "delay.h"

__CONFIG( HS & PWRTEN & BORDIS & WDTDIS & LVPDIS & DEBUGDIS & UNPROTECT);

static bit EN @ ((unsigned)&PORTE*8+0);
static bit DATA @ ((unsigned)&PORTE*8+1);
static bit CLOCK @ ((unsigned)&PORTE*8+2);

unsigned long x,y,z,data1;

void init_2 (void){
GIE=0;
// enable A2D converter
ADIE = 0; // not interrupt driven
ADCON0= 0b00000001; //DISABLE ADC
ADCON1= 0b00000110; //ALL DIGITAL
PORTA = 0;
TRISA = 0b0000000; // ALL OUTPUT
PORTA = 0;
PORTB = 0;
TRISB = 0b00000000;
PORTB = 0;
PORTC = 0;
TRISC = 0b00000000;
PORTC = 0;
PORTD = 0;
TRISD = 0b00000000;
PORTD = 0;
PORTE = 0;
TRISE = 0b00000000;
PORTE = 0;
}


SendByte(unsigned long z )
{
int i;
i=0;

EN=0;
DATA=0;
CLOCK=0;

for(i=0;i<32;i++)
{
y=0x800000; //маска
x=((z)&(y));

if(x>0)
{ DATA=1; }
else
{ DATA=0; }

z=(z<<1);
CLOCK=1;
asm("nop");
CLOCK=0;
asm("nop");
DATA=0;
}
EN=1;
}

void main()
{

init_2();

for(;;)
{
data1=0x3F3F3F3F;
SendByte(data1);
DelayMs(500);
DelayMs(500);
}
}

И не работи пущината 8O След леко колебание и почивка си написах на асемблер програмката
и нещата се оправиха,но не ми е ясно къде греша в С-то.Някой да има някаква идея
след като е погледнал програмката ?


Пет Окт 19, 2007 10:20 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юли 31, 2007 2:55 pm
Мнения: 1792
Местоположение: София
Мнение 
За начало маската с която въртиш е 2^23 вместо 2^31 (0x80000 --> 0x80000000).


Съб Окт 20, 2007 2:23 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 2:01 pm
Мнения: 1952
Местоположение: Варна
Мнение 
Тя маската е по-малкия проблем.
Функцията SendByte е логично да изпраща само един байт. Добрите принципи изискват това което прави функцията да отговаря на името и. В този случай, трябва да подаваш като аргумент байт. И за да изпратиш 32 битова дума извикваш SendByte 4 пъти за всеки байт от думата. Реда в който ще подаваш байтовете зависи от това какво ти е договорено със отсрещната страна - Little или Big Endian.
Всъщност и сега функцията ти изпраща така. Започваш от маска 0x00800000 и шифтваш 32 пъти на ляво?!? Така както си го написал предаваш най-старшите 9 бита от z и след това 23 бита нули.
В някои случаи е по-удобно записването (1<<23) вместо 0x00800000.
Това е по С кода, не мога да кажа нищо по частта за конфигуриране щото не съм работил с PIC-ове.


Съб Окт 20, 2007 8:35 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение 
Маската я промених - 0х80000000 -> 1000 0000 0000 0000 0000 0000 0000 0000. Като се направи едно И със
0101 1100 0000 0000 0100 1100 0110 0110,резултата 0 и в зависимост от това дали е 0/1 си управлявам
пина.Това измислих за тестване на бит в long.Незнам как се тества по друг начин.Маската си е постоянна.
Шифтвам само z 32 пъти наляво.


Съб Окт 20, 2007 9:12 am
Профил
Ранг: Напреднал
Ранг: Напреднал

Регистриран на: Нед Авг 14, 2005 1:08 pm
Мнения: 433
Местоположение: Казанлък
Мнение 
Я пробвай така

SendByte(unsigned long z )
{
char i;
EN=0;
DATA=0;
CLOCK=0;

for(i=0;i<32;i++)
{
if(z & 0x80000000) DATA=1;
else DATA=0;
z <<= 1;
CLOCK=1;
asm("nop");
CLOCK=0;
asm("nop");
}
EN=1;
}


Последна промяна VSU на Съб Окт 20, 2007 12:54 pm, променена общо 1 път



Съб Окт 20, 2007 12:38 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 2:01 pm
Мнения: 1952
Местоположение: Варна
Мнение 
Мда така си е. Проблемът е само в маската.:oops: Още едно от добрите правила. Не използвай еднобуквени имена за променливите. Например вместо y->mask, вместо z->dword.


Съб Окт 20, 2007 12:46 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
Send4B(unsigned long inp) {
char *p;
char i;

p = (char*)(&inp);
for (i=0; i<4; i++) {
SendByte(*p);
p++;
}
}

Това ?


Съб Окт 20, 2007 1:12 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 
Не забравяйте Endian-a ;)


Нед Окт 21, 2007 12:53 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 8 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни