dimanche 21 septembre 2014

Manipulation de bits ou Bit banging

Ici, on va aborder quelque chose que vous devez absolument apprendre pour avancer en programmation embarquée: Le Bit Banging. Il s'agit d'une technique qui a largement été utilisée dans les communications série en l'absence d'un "hardware" dédié. Pour cet exemple, je vais utiliser la carte de développement PICDEM PIC18 EXPLORER Demo Board de chez Microchip, mais vous pouvez évidemment utiliser un simple microcontrôleur et y connecter quelques LEDs pour tester. On commence par les différents  #include et les #pragma :
// Header pour le microcontrôleur
#include <p18cxxx.h>
// Bibliothèque pour insérer un délai
#include <delays.h>
Et les #pragma pour le PIC18F8722
#pragma config OSC = HSPLL
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config PWRT = OFF
#pragma config BOREN = OFF
#pragma config WDT = OFF
#pragma config MCLRE = ON
#pragma config LVP = OFF
#pragma config XINST = OFF
Tout se passe dans le main() à travers une boucle globale qui en contient deux autres:
  • La première qui va de D0 à D7
  • Et la deuxième qui va de D7 à D0
Donc on aura une led qui s'allume à la fois et qui va d'un sens à un autre. On commence par faire nos déclarations:
char i = 0; // On en aura besoin pour compter
TRISD = 0; // PORTD en mode sortie digitale
PORTD = 1; // On met D0 à 1 == Led allumée
Il est important ici de noter que pour décaler un bit à droite ou à gauche, il faut qu'il y ait au moins un. Donc plus explicitement, à ce niveau, on a PORTD = 1; ou encore mieux en binaire: PORTD = 0b00000001; c'est là que ça devient intéressant. En effet, si on décale d'un bit vers là gauche on aura:
PORTD <<= 1; // équivaut PORTD = PORTD << 1;
PORTD vaudra 2 ou plus exactement 0b00000010. De même, on va dire que PORTD vaut 16 en décimale ( 0b00010000 en binaire); si on fait:
PORTD >>= 1;
PORTD vaudra alors 8 ( 0b00001000 en binaire). Je vous laisse avec le petit programme pour expérimenter.
/* 
 * File:   main.c
 * Author: Mohamed Chakroun
 *
 * Created on 17 septembre 2014, 20:29
 */

#include <p18cxxx.h>
#include <delays.h>
#pragma config  OSC = HSPLL
#pragma config 	FCMEN = OFF
#pragma config 	IESO = OFF
#pragma config 	PWRT = OFF
#pragma config 	BOREN = OFF
#pragma config 	WDT = OFF
#pragma config 	MCLRE = ON
#pragma config 	LVP = OFF
#pragma config 	XINST = OFF
/*
 * 
 */
void main(void) {

    char i = 0;
    TRISD = 0;
    PORTD = 1;
    while(1){
    while( i < 7 ){
        PORTD <<= 1;
        Delay10KTCYx(1000);
        i++;

    }
    while( i > 0 ){#include <p18cxxx.h>
        PORTD >>= 1;
        Delay10KTCYx(1000);
        i--;
    }
    }
}
Source:www.microkontrol.com

samedi 20 septembre 2014

Convertir fichier oscam.user en Fline

Une des taches les plus fastidieuse est celle de devoir convertir tous les utilisateur de son oscam pour pouvoir les utiliser sur CCcam ou multics. Il est cependant possible de le faire moyennant un script shell dont voici la source.
#!/bin/bash

user_file="/usr/local/etc/oscam.user"
tmp_file="oscam.user.tmp"

cat $user_file|awk -F " " '{print $1 " " $3}'| sed 's/\r//'|grep 'user\|pwd\|expdate\|account'> $tmp_file

awk '/account/{if (NR!=1)print "";next}{printf "%s ",$0}END{print "";}' $tmp_file|sed s/user/"F:"/g|sed s/pwd//g|sed s/expdate/"# expire "/g|grep -E "F: [A-Z]"

rm $tmp_file 
exit 0 
Source: www.microkontrol.com