roboforum.ru

Технический форум по робототехнике.

портирование кода для pic на avr

портирование кода для pic на avr

Myp » 06 ноя 2006, 20:34

сложно ли портировать код написанный на языке си для контроллеров pic
в код для контроллеров avr ???

есть какие либо сложности и подводные камни?

avr123.nm.ru » 06 ноя 2006, 20:47

конечно можно - в этом и есть прелесть Си - он машинонезависимый.  Сложность в том что управление ресурсами МК разное, значит нужно понимать что написано в проге.

Re: портирование кода для pic на avr

Myp » 12 дек 2008, 19:18

блин

вот и клюнуло

есть простенький код для пика
надо его под авр переписать

а там чото вааще ничо не понятно и комментарии на французском

Re: портирование кода для pic на avr

avr123.nm.ru » 12 дек 2008, 19:57

Myp писал(а):блин, там чото вааще ничо не понятно и комментарии на французском

блин, он еще и НЕ ВИДИМ ! похоже и не прицепляем ! УЖАСыыыыыыыыыыы.

Re: портирование кода для pic на avr

Duhas » 12 дек 2008, 20:17

авр, жжоте )
Мур, цепляй поглядим..

Re: портирование кода для pic на avr

Myp » 12 дек 2008, 22:28

Код: Выделить всёРазвернуть
Marc Gazal
/*-----------------------------------------------------*/
/*           Simulateur de chip AF-Nikon
/*              par un PIC 16F690
/*
/* Fonctionnement :
/*  - Le boitier passe un signal RW1 de 1 vers 0
/*  - Il attend puis le repasse а 1
/*  - Il regarde ensuite l'йtat de ce signal.
/*     - Si RW1 = 1, Rien il retente l'opйration plus tard
/*     - Si RW1 = 0, C'est que l'objectif est Ok pour recevoir
/*        - Il envoie le caractere 0x44
/*        - L'objectif, lorsqu'il a reзu le 0x44 fait remonter le RW1
/*        - L'objectif envoie ensuite un а un les 26 caracteres comme suit
/*           Passage du RW1 а 0,
/*            envoie du caractere,
/*             Passage du RW1 а 1.
/*
/* C'est le boitier qui genere le signal d'horloge.
/*
/* Cablage :

          ----------
                     VDD !1     20! VSS
    RA5/T1CKI/OSC1/CLKIN !2     19! RA0/AN0/C1IN+/ICSPDAT/ULPWU
RA4/AN3/T1G/OSC2/CLKOUT !3     18! RA1/AN1/C12IN0-/VREF/ICSPCLK
            RA3/MCLR/VPP !4     17! RA2/AN2/T0CKI/INT/C1OUT
            RC5/CCP1/P1A !5     16! RC0/AN4/C2IN+
           RC4/C2OUT/P1B !6     15! RC1/AN5/C12IN1-
     RC3/AN7/C12IN3-/P1C !7     14! RC2/AN6/C12IN2-/P1D
              RC6/AN8/SS !8     13! RB4/AN10/SDI/SDA
             RC7/AN9/SDO !9     12! RB5/AN11/RX/DT
               RB7/TX/CK !10    11! RB6/SCK/SCL
                         ----------

RW1 : Sur PIN 17 en lecture pour intercepter le front bas en interuption
      Sur PIN 16 en ecriture pour generer le signal

CLK : Sur PIN 11

SD  : Sur PIN 13 Pour recevoir
       Sur PIN  9 Pour Transmettre

*/

#include <pic.h>
#include <htc.h>

// Le premier proto utilisait un transistor NPN en colecteur ouvert pour generer RW1
// d'ou necessitйe d'inverser le signal.
// le proto actuel ne l'utilise plus
//#define avecnpn

// definition de quelques LED cablйes sur le proto pour tests.
#define LED1  RC5
#define LED2  RA4
#define LED3  RA5

// constantes utilisйe par le soft pour allumer ou eteindre
// les leds
#define LEDON  0
#define LEDOFF 1

// Un jour, le soft sera capable de simuler un type d'objo
// de faзon dynamique en lisant les entrйes libres.
#define  SW1   RC4
#define  SW2   RC1
#define  SW3   RC3
#define  SW4   RC2
#define  SW5   RC6
#define  SW6   RB5
#define  SW7   RB7

// Le signal RW1 du boitier
#define  RWIN   RA2
#define  RWOUT   RC0

// constantes que l'on enverra au boitier pour lui indiquer
// l'ouverture de l'objo que l'on simule.
#define lensaperture_f10 1
#define lensaperture_f11 2
#define lensaperture_f12 8
#define lensaperture_f13 10
#define lensaperture_f16 16
#define lensaperture_f17 18
#define lensaperture_f18 20
#define lensaperture_f20 25
#define lensaperture_f24 30
#define lensaperture_f25 32
#define lensaperture_f27 34
#define lensaperture_f28 36
#define lensaperture_f30 38
#define lensaperture_f32 40
#define lensaperture_f33 42
#define lensaperture_f35 44
#define lensaperture_f38 46
#define lensaperture_f40 48
#define lensaperture_f45 52
#define lensaperture_f48 54
#define lensaperture_f50 56
#define lensaperture_f53 58
#define lensaperture_f56 60

// Constante а modifier en fonction de l'ouverture max de l'objo а simuler
// pour l'instant, la focale simulйe est fixe а 50 mm
#define lensaperture lensaperture_f18


// quelques variables
bit enattente;
bit waitforstart;
unsigned char i;
unsigned char inbyte;
unsigned char numbytetosend,bytetosend;

// definition de la tramme а envoyer
// 26 caracteres
#define nbbytetosend 26
// La table en ROM
unsigned char tblref[nbbytetosend] = {37,20,80,0,96,248,17,12,6,0,26,20,0,32,0,0,80,20,15,88,80,80,20,20,5,20 };

// copie de la table en ROM vers RAM. C'est celle ci qui sera envoyйe
// apres avoir йtй modifiйe en focntion des caracteristique de l'objo
unsigned char tblout[nbbytetosend];

// les "Fuses" du PIC

__CONFIG (0x33D4);

// Recopie de la table ROM vers la RAM et insertion des valeurs de l'objectif а simuler.
// Ouverture courante en : 1 ; 17 ; 25
// ouverture mini en 22
// ouverture maxi en 23
void filltblout (void)
{
unsigned char i;
for (i=0 ; i< nbbytetosend ; i++ )  {
  tblout[i]  = tblref[i];
}
  tblout[1]  = lensaperture;
  tblout[17] = lensaperture;
  tblout[25] = lensaperture;
}


// Bon, la, une fonction qui renverse un octet.
// Histoire de MSB qui part premier.
// je sais : Y'avait juste а reverser les octets de la table
// pour eviter cette heresie.
unsigned char inverseoctet ( unsigned char valeur )
{
unsigned char result;
result = 0;
if ( valeur & 128 ) result = result | 1;
if ( valeur & 64  ) result = result | 2;
if ( valeur & 32  ) result = result | 4;
if ( valeur & 16  ) result = result | 8;
if ( valeur & 8   ) result = result | 16;
if ( valeur & 4   ) result = result | 32;
if ( valeur & 2   ) result = result | 64;
if ( valeur & 1   ) result = result | 128;
return (result);
}


// Configuer la transmission SPI
void initreception (void)
{
  CKP = 1;    // Evenements sur front montant de CLK
  CKE = 0;    //
  SSPEN  = 0;
  SSPCON = 0b00010101;  // Transmission en SPI,
  SSPEN  = 1;
  #ifdef avecnpn
    TRISC  = 0b11011110; // SDO en entree
  #else
    TRISC  = 0b11011111; // SDO en entree, RWout en entrйe
  #endif
}

// quelques fonction gйnйrales
void enable_INT(void)
{
INTE = 1;
INTF = 0;
}

void disable_INT(void)
{
INTE = 0;
INTF = 0;
}

void enable_T0 (void)
{
T0IE = 1;
T0IF = 0;
TMR0 = 0;
}

void disable_T0 (void)
{
T0IE = 0;
T0IF = 0;
TMR0 = 0;
}

void enable_interrupts(void)
{
GIE = 1;
}

void disable_interrupts(void)
{
GIE = 0;
}


// Se mettre en etat d'attente du front descenfdant du RW1
void do_idle(void)
{
enattente = 1;
waitforstart = 0;
initreception();
disable_T0();     // Pas besoin de timer;
#ifdef avecnpn
   RWOUT = 0;      // Ligne RW = 1
#else
   TRISC = TRISC | 0b00000001; // RWout en entrйe
   RWOUT = 1;      // Ligne RW = 1
#endif
SSPIE = 0;     // pas d'irq en reception
enable_INT();  // Irq sur descente du RW
}


void interrupt tc_int(void)
{
// recu int du timer0 : c'est grave (timeout)
// On se remet en attente
  if (T0IE && T0IF) {
   T0IF=0;
   LED1 = LEDOFF;
   LED2 = LEDOFF;
   LED3 = LEDOFF;
   if ((enattente==0) && (waitforstart)) {
     #ifdef avecnpn
       RWOUT = 1; // pour indiquer au boitier que l'on a un truc a lui dire
     #else
       TRISC = TRISC & 0b11111110;
       RWOUT = 0; // pour indiquer au boitier que l'on a un truc a lui dire
     #endif
     waitforstart = 0;
   }
   else do_idle();
  }

// recu front descendant sur RW : le boitier veut
// savoir а qui il a а faire
if ( INTE && INTF  ) {
  INTF  = 0;
  #ifdef avecnpn
    RWOUT = 1 ;   // on met la ligne rw а 0
  #else
    TRISC = TRISC & 0b11111110;
    RWOUT = 0 ;   // on met la ligne rw а 0

  #endif

  inbyte = SSPBUF;

  INTE  = 0;    //
  SSPIF = 0;    // on autorise les irqs sur port sйrie;
  SSPIE = 1;

  LED2 = LEDON;
  enable_T0();
}

// nous venons de recevoir un caractere sur le port sйrie
if (SSPIF && SSPIE )
{
  SSPIF = 0;
  TMR0  = 0;
  inbyte = SSPBUF;
  if ( enattente==1 ) {
    if (inbyte == 0x44) {  //caractere d'initialisation venant du boitier

      numbytetosend = 0;
      bytetosend = inverseoctet(tblout[numbytetosend]); // preparation du premier caractere а envoyer
      SSPBUF = bytetosend; // on envoie le caractere

      // passer en transmission
      enattente = 0;
      INTE = 0;  // Pas d'irq sur front du RW
      INTF = 0;  // par sйcuritй

      TRISC = TRISC & 0b01111111;

      LED1 = LEDON;
      #ifdef avecnpn
       RWOUT = 0; // Liberation du RW
      #else
       RWOUT = 1; // Liberation du RW
       TRISC = TRISC | 0b00000001;
      #endif
      enable_T0(); // initialisation du timeout
      TMR0 = 252;
      waitforstart = 1;
    }
    else do_idle();
  }
  else {
   // Recu interruption alors que l'on est en emision
   LED3 = LEDON;
   #ifdef avecnpn
     RWOUT=0; // RW au niveau 1
   #else
     TRISC = TRISC | 0b00000001;
     RWOUT=1; // RW au niveau 1
    #endif
   numbytetosend++;
   if (numbytetosend<nbbytetosend)
   {
     bytetosend = inverseoctet(tblout[numbytetosend]); // caractere а envoyer
     SSPBUF = bytetosend; // on envoie le caractere
     waitforstart = 1;
     enable_T0(); // initialisation du timeout
     TMR0 = 252;
   }
   else do_idle(); // on a plus rien а transmettre;
  }
}
}





void main (void)
{
filltblout();
// Pas d'entrйe analogique
ANSEL = 0;
ANSELH = 0;

// Configuration des Entrйes/Sorties
TRISA = 0x0C;
TRISB = 0b11111111;  // 0xFF;
#ifdef avecnpn
   TRISC = 0b11011110;  // 5E
#else
   TRISC = 0b11011111;  // 5E
#endif

// Initialisation du Timer0 qui servira de timeout
// OPTION_REG :
// Bit 7 = 1 -- Pull-up disabled
// Bit 6 = 0 -- Interruption sur front descendant de Int
// Bit 5 = 0 -- Timer sur clock Interne
// Bit 4 = 0 -- N/A
// Bit 3 = 0 -- Prescaler sur timer 0
// Bits 2-0 = 011 -- Prescaler а 16
// Soit un timer egal а 16*255us = 4ms
OPTION = 0b00000011;  //Bit7 = 1 pull-ups disabled

WPUA  = 0;  // Pas de pull-ups sur port A
WPUB  = 0;  // Pas de pull-ups sur port B
WPUA2 = 1;  // Pull-up sur RA2 ( RWIN )

enable_interrupts();
PEIE  = 1;  // autoriser l'autorisation du SPI;

LED1 = LEDOFF;
LED2 = LEDOFF;
LED3 = LEDOFF;

do_idle();   // se mettre en position d'attente du boitier
while (1)
{


}
}


надеюсь автор не будет против что я его код сдал )
короче автор этого дела Marc Gazal из франции

Re: портирование кода для pic на avr

avr123.nm.ru » 12 дек 2008, 23:02

А теперь в переводчик - http://www.translate.ru/ - на корявый русский, порциями до 3000 символов.

Re: портирование кода для pic на avr

Myp » 12 дек 2008, 23:09

// Se mettre en etat d'attente du front descenfdant du RW1
// Помещаться в etat ожидания фронта descenfdant RW1

RWout en entre'e
RWout там между e

нихрена не понятно....
из переводчика

Добавлено спустя 5 минут 10 секунд:
чорт
может проще на пике сделать чем эти все геристры переводить

Re: портирование кода для pic на avr

avr123.nm.ru » 13 дек 2008, 00:00

PIC микроконтроллеры - хорошая штука ! и "первые шаги" и программаторы вот - http://avr123.nm.ru/09.htm
и вот несколько - http://avr123.nm.ru/ - там и самодельный отладчик клон фирменного - ICD2
А я вот таким JDM программил PIC - http://avr123.nm.ru/06.htm

и PROTEUS с PIC дружит сильней чем с AVR.

Правильные цены там - http://trt.ru

Re: портирование кода для pic на avr

Vooon » 13 дек 2008, 00:17

Сделай в пике :)
А что это?

ПС: сначала думал что это форум съел форматирование, ан нет, спагетти?

Re: портирование кода для pic на avr

Myp » 13 дек 2008, 12:54

нет это форум съел
тоесть в процессе копипаста

а сам сишный файл номаный

Re: портирование кода для pic на avr

mmu » 04 янв 2009, 12:47

avr123.nm.ru писал(а):конечно можно - в этом и есть прелесть Си - он машинонезависимый.  Сложность в том что управление ресурсами МК разное, значит нужно понимать что написано в проге.


А в чем же прелесть Си, если надо по новой перелопатить всю программу?

Re: портирование кода для pic на avr

Vooon » 04 янв 2009, 13:48

Это ж как писать надо, чтобы пришлось всю программу перелопачивать?

Re: портирование кода для pic на avr

Myp » 03 фев 2009, 22:07

короче опять ломаю голову


два вопроса

1.
Код: Выделить всёРазвернуть
// установка фьюзов PIC
__CONFIG (0x33D4);

чо это за хрень??
что эти биты означают и как мне также сделать в меге?


2.
Код: Выделить всёРазвернуть
// конфигурация передатчика SPI
void initreception (void)
{
CKP = 1; // событие по восходящему фронту CLK
CKE = 0; //
SSPEN = 0;
SSPCON = 0b00010101; // Передача в SPI,
SSPEN = 1;
#ifdef avecnpn
TRISC = 0b11011110; // SDO en entree
#else
TRISC = 0b11011111; // SDO en entree, RWout en entre'e
#endif

чтото я не соображу, это типа аппаратный spi чтоле в пике используется??
а в тини13 он есть?
а как мне сделать?

тини13 ибо только она мне доступна в соике 8ногом

Добавлено спустя 10 минут 49 секунд:
чорт, хоть ктонить, помогите мне код с пика портировать в тиньку
я вам пива куплю если вы мне объясните как это обделать :cry: :cry:

код в общем то простой

тушка дёргает ногой RW, МК ей отвечает дерганием ногой
если подёргали правильно, то тушка отправляет 0x44
МК принимает 0x44 и опять дёргает ногой
и дальше отправляем 26 байт в тушку запрашивая разрешение на передачу след байта дёргая ногу RW

хитрые комбинации 26 байт хранятся во флеше

немогу блин придумать как мне эти 26 байт пересылать в тушку
в оригинале используется аппаратный spi

Re: портирование кода для pic на avr

zubr » 03 фев 2009, 22:13

1. __config устанавливает фьюзы - написано отвратно (одним числом) - поэтому расшифровать можно только читая даташит на конкретный чип
2. SPI родимый

эта поделка непеводится на арм за один вечер с пивом, но совет: не парься - делай на пичке или забей
ps: http://translate.google.com переводит все целиком.


Rambler\'s Top100 Mail.ru counter