сложно ли портировать код написанный на языке си для контроллеров pic
в код для контроллеров avr ???
есть какие либо сложности и подводные камни?
roboforum.ruТехнический форум по робототехнике. |
|
|
|
Реклама | ||||
|
|
|||
Myp писал(а):блин, там чото вааще ничо не понятно и комментарии на французском
Реклама | ||||
|
|
|||
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)
{
}
}
avr123.nm.ru писал(а):конечно можно - в этом и есть прелесть Си - он машинонезависимый. Сложность в том что управление ресурсами МК разное, значит нужно понимать что написано в проге.
// установка фьюзов PIC
__CONFIG (0x33D4);
// конфигурация передатчика 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
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9