• Non ci sono risultati.

Appendice A : Codice completo del firmware

N/A
N/A
Protected

Academic year: 2021

Condividi "Appendice A : Codice completo del firmware"

Copied!
32
0
0

Testo completo

(1)

Appendice A : Codice completo del firmware

File programmazione.h

// //

// Questo file gestisce la scrittura in EEPROM in caso // di prima istallazione del sistema o di cambio // di un dispositivo comandato

// //

#ifndef PROGRAMMAZIONE_H #define PROGRAMMAZIONE_H

unsigned char progr (unsigned char *radio); #endif

(2)

File programmazione.c

// //

// Questo file gestisce la scrittura in eeprom in caso // di prima istallazione del sistema o di cambio // di un dispositivo comandato // // #include <avr/eeprom.h> #include "invia.h" #include "programmazione.h"

#define EEPROM __attribute__((section(".eeprom"))) //questa variabile indica al gateway in quale stanza è posto

unsigned char stanza EEPROM;

remote LUCE1 EEPROM, LUCE2 EEPROM, TV1 EEPROM, TV2 EEPROM, VCR EEPROM, DVD EEPROM;

remote HIFI EEPROM, RISC EEPROM, FINESTRA1 EEPROM; remote FINESTRA2 EEPROM, PTA1 EEPROM, PTA2 EEPROM; unsigned char progr (unsigned char *radio)

{

unsigned char ncamp, unb; remote *rem;

int i,dueb,j,k; unsigned long quattrob; unb = *radio;

if (unb == 1) unb = *(radio+1); else return 'E';

(3)

switch (unb) {

case '0': rem = &LUCE1; break; case '1': rem = &LUCE2; break; case '2': rem = &TV1; break; case '3': rem = &TV2; break; case '4': rem = &VCR; break; case '5': rem = &DVD; break; case '6': rem = &HIFI; break; case '7': rem = &RISC; break; case '8': rem = &FINESTRA1; break; case '9': rem = &FINESTRA2; break; case 'a': rem = &PTA1; break; case 'b': rem = &PTA2; break; default: return 'E'; break; }

// inizio ad acquisire e scrivere i vari campi i=0; do { ncamp = *(radio+i); switch (ncamp) { case 1: //nome { unb = *(radio+1+i);

eeprom_write_byte (&(rem->nome), unb); i+=2;

} break;

case 2: //bits {

dueb = (*(radio+1+i)<<8) | (*(radio+2+i)); eeprom_write_word (&rem->bits, dueb); i+=3;

(4)

case 3: //flags {

dueb = (*(radio+1+i)<<8) | (*(radio+2+i)); eeprom_write_word (&rem->flags, dueb); i+=3;

} break;

case 4: //pheader {

dueb = (*(radio+1+i)<<8) | (*(radio+2+i)); eeprom_write_word (&rem->pheader, dueb); i+=3;

} break;

case 5: //sheader {

dueb = (*(radio+1+i)<<8) | (*(radio+2+i)); eeprom_write_word (&rem->sheader, dueb); i+=3;

} break;

case 6: //pone {

dueb = (*(radio+1+i)<<8) | (*(radio+2+i)); eeprom_write_word (&rem->pone, dueb); i+=3;

} break;

case 7: //sone {

dueb = (*(radio+1+i)<<8) | (*(radio+2+i)); eeprom_write_word (&rem->sone, dueb); i+=3;

} break;

case 8: //pzero {

dueb = (*(radio+1+i)<<8) | (*(radio+2+i)); eeprom_write_word (&rem->pzero, dueb); i+=3;

} break;

(5)

{

dueb = (*(radio+1+i)<<8) | (*(radio+2+i)); eeprom_write_word (&rem->szero, dueb); i+=3;

} break;

case 10: //plead {

dueb = (*(radio+1+i)<<8) | (*(radio+2+i)); eeprom_write_word (&rem->plead, dueb); i+=3;

} break;

case 11: //ptrail {

dueb = (*(radio+1+i)<<8) | (*(radio+2+i)); eeprom_write_word (&rem->ptrail, dueb); i+=3;

} break;

case 12: //pfoot {

dueb = (*(radio+1+i)<<8) | (*(radio+2+i)); eeprom_write_word (&rem->pfoot, dueb); i+=3;

} break;

case 13: //sfoot {

dueb = (*(radio+1+i)<<8) | (*(radio+2+i)); eeprom_write_word (&rem->sfoot, dueb); i+=3;

} break;

case 14: //pre_data_bits {

dueb = (*(radio+1+i)<<8) | (*(radio+2+i));

eeprom_write_word (&rem->pre_data_bits, dueb); i+=3;

} break;

case 15: //pre_data {

(6)

k=24; for(j=0;j<4;j++) { quattrob |= (*(radio+1+i+j)<< k); k-=8; }

eeprom_write_block (&quattrob, &rem->pre_data, 4);

i+=5;

} break;

case 16: //post_data_bits {

dueb = (*(radio+1+i)<<8) | (*(radio+2+i));

eeprom_write_word (&rem->post_data_bits, dueb); i+=3; } break; case 17: //post_data { k=24; for(j=0;j<4;j++) { quattrob |= (*(radio+1+i+j)<< k); k-=8; }

eeprom_write_block (&quattrob, &rem->post_data, 4);

i+=5;

} break;

case 18: //toggle_bits {

dueb = (*(radio+1+i)<<8) | (*(radio+2+i));

eeprom_write_word (&rem->toggle_bits, dueb); i+=3;

} break;

case 19: //freq {

(7)

eeprom_write_word (&rem->freq, dueb); i+=3; } break; case 20: //nome_cmd1 { unb = *(radio+1+i);

eeprom_write_byte (&rem->nome_cmd1, unb); i+=2; } break; case 21: //cmd1 { k=24; for(j=0;j<4;j++) { quattrob |= (*(radio+1+i+j)<< k); k-=8; }

eeprom_write_block (&quattrob, &rem->cmd1, 4); i+=5;

} break;

case 22: //nome_cmd2 {

unb = *(radio+1+i);

eeprom_write_byte (&rem->nome_cmd2, unb); i+=2; } break; case 23: //cmd2 { k=24; for(j=0;j<4;j++) { quattrob |= (*(radio+1+i+j)<< k); k-=8; }

eeprom_write_block (&quattrob, &rem->cmd2, 4); i+=5;

(8)

case 24: //nome_cmd3 {

unb = *(radio+1+i);

eeprom_write_byte (&rem->nome_cmd3, unb); i+=2; } break; case 25: //cmd3 { k=24; for(j=0;j<4;j++) { quattrob |= (*(radio+1+i+j)<< k); k-=8; }

eeprom_write_block (&quattrob, &rem->cmd3, 4); i+=5;

} break;

case 26: //nome_cmd4 {

unb = *(radio+1+i);

eeprom_write_byte (&rem->nome_cmd4, unb); i+=2; } break; case 27: //cmd4 { k=24; for(j=0;j<4;j++) { quattrob |= (*(radio+1+i+j)<< k); k-=8; }

eeprom_write_block (&quattrob, &rem->cmd4, 4); i+=5;

} break;

case 28: //nome_cmd5 {

(9)

eeprom_write_byte (&rem->nome_cmd5, unb); i+=2; } break; case 29: //cmd5 { k=24; for(j=0;j<4;j++) { quattrob |= (*(radio+1+i+j)<< k); k-=8; }

eeprom_write_block (&quattrob, &rem->cmd5, 4); i+=5;

} break;

case 30: //nome_cmd6 {

unb = *(radio+1+i);

eeprom_write_byte (&rem->nome_cmd6, unb); i+=2; } break; case 31: //cmd6 { k=24; for(j=0;j<4;j++) { quattrob |= (*(radio+1+i+j)<< k); k-=8; }

eeprom_write_block (&quattrob, &rem->cmd6, 4); i+=5;

} break;

case 'F': break; //la struttura é finita, esci default: return 'E'; break; }

}

while ( (ncamp !='F') && (i < 76) ); return 'O';

(10)

}

File invia.h

// //

// Questo file contiene le funzioni per inviare

// i vari codici indipendentemente dal tipo di protocollo // utilizzato.

// Si suppone di avere in e2prom la struttura REMOTE con // tutti i suoi campi.

// //

#ifndef INVIA_H #define INVIA_H

#define RC5 0x0001 /* IR data follows RC5 protocol */ #define SHIFT_ENC RC5 /* IR data is shift encoded */

#define REVERSE 0x0010

#define SPACE_FIRST 0x2000 /* bits are encoded as space+pulse */ #define SPACE_ENC 0x0008 /* PWM */

// Definisco la struttura REMOTE (che poi andrà sul main) typedef struct { char nome; int bits; int flags; int pheader,sheader; int pone,sone;

int pzero, szero; int plead;

(11)

int ptrail; int pfoot, sfoot;

int pre_data_bits; unsigned long pre_data; int post_data_bits; unsigned long post_data; int toggle_bits;

unsigned int freq;

// inserisco i campi relativi alla codifica dei comandi char nome_cmd1; unsigned long cmd1; char nome_cmd2; unsigned long cmd2; char nome_cmd3; unsigned long cmd3; char nome_cmd4; unsigned long cmd4; char nome_cmd5; unsigned long cmd5; char nome_cmd6; unsigned long cmd6; struct remote *prossimo;

} remote;

// Essendo la struttura piuttosto ampia, devo aumentare le dimensioni // Del buffer di ricezione in uart

// Funzioni:

// Funzione per l'invio di un uno logico void uno (void);

// Funzione per l'invio di un uno logico spedendo prima lo spazio e poi l'impulso void unos (void);

// Funzione per l'invio di un uno logico con codifica bifase void unob (void);

(12)

// Funzione per l'invio di uno zero logico void zero(void);

// Funzione per l'invio di uno zero logico spedendo prima lo spazio e poi l'impulso void zeros (void);

// Funzione per l'invio del messaggio

unsigned char invia (remote *rem, unsigned char comando); #endif

File invia.c

// //

// Questo file contiene le funzioni per inviare

// i vari codici indipendentemente dal tipo di protocollo // utilizzato.

// Si suppone di avere in e2prom la struttura REMOTE con // tutti i suoi campi.

// // #include "global.h" #include <avr/signal.h> #include <avr/eeprom.h> #include <avr/delay.h> #include <inttypes.h> #include "avrlibdefs.h" #include "invia.h" #include "programmazione.h"

(13)

#ifndef TIMER_INTERRUPT_HANDLER

#define TIMER_INTERRUPT_HANDLER SIGNAL #endif

unsigned char finito;

unsigned int UNOP, UNOS, ZEROP, ZEROS, FREQUE;

unsigned int HEADERP, HEADERS, LEADP, TRAILP, FOOTP, FOOTS; float diviso,campo;

remote questo; void uno (void) { TCNT2 = 0; TCCR2 = 25; _delay_loop_2(UNOP); TCCR2 = 0; PORTD = (0<<PD7); _delay_loop_2(UNOS); }

void unos (void) { TCCR2 = 0; PORTD = (0<<PD7); _delay_loop_2(UNOS); TCNT2 = 0; TCCR2 = 25; _delay_loop_2(UNOP); }

void unob (void) {

TCCR2 = 0;

(14)

_delay_loop_2(UNOS); TCNT2 = 0; TCCR2 = 25; _delay_loop_2(UNOP); } void zero () { TCNT2 = 0; outb (TCCR2, 25); _delay_loop_2(ZEROP); TCCR2=0; PORTD =(0<<PD7); _delay_loop_2(ZEROS); } void zeros () { TCCR2 = 0; PORTD = (0<<PD7); _delay_loop_2(ZEROS); TCNT2 = 0; TCCR2 = 25; _delay_loop_2(ZEROP); }

unsigned char invia (remote *rem, unsigned char comando) {

short int send[50], send_inv[50]; int i,k,j=0,o;

unsigned long com, pot ; remote *block=&questo; static char *a;

(15)

// Copio la struttura in ram

questo.nome = eeprom_read_byte ( &rem->nome); questo.bits = eeprom_read_word (&rem->bits); questo.flags = eeprom_read_word (&rem->flags); questo.pheader = eeprom_read_word (&rem->pheader); questo.sheader = eeprom_read_word (&rem->sheader); questo.pone = eeprom_read_word (&rem->pone);

questo.sone = eeprom_read_word (&rem->sone); questo.pzero = eeprom_read_word (&rem->pzero); questo.szero = eeprom_read_word (&rem->szero); questo.plead = eeprom_read_word (&rem->plead); questo.ptrail = eeprom_read_word (&rem->ptrail); questo.pfoot = eeprom_read_word (&rem->pfoot); questo.sfoot = eeprom_read_word (&rem->sfoot);

questo.pre_data_bits = eeprom_read_word (&rem->pre_data_bits); eeprom_read_block (&block->pre_data, &rem->pre_data, 4);

questo.post_data_bits = eeprom_read_word (&rem->post_data_bits); eeprom_read_block (&block->post_data, &rem->post_data, 4);

questo.toggle_bits = eeprom_read_word (&rem->toggle_bits); questo.freq = eeprom_read_word (&rem->freq);

questo.nome_cmd1 = eeprom_read_byte(&rem->nome_cmd1); eeprom_read_block (&block->cmd1, &rem->cmd1, 4); questo.nome_cmd2 = eeprom_read_byte(&rem->nome_cmd2); eeprom_read_block (&block->cmd2, &rem->cmd2, 4); questo.nome_cmd3 = eeprom_read_byte(&rem->nome_cmd3); eeprom_read_block (&block->cmd3, &rem->cmd3, 4); questo.nome_cmd4 = eeprom_read_byte(&rem->nome_cmd4); eeprom_read_block (&block->cmd4, &rem->cmd4, 4); questo.nome_cmd5 = eeprom_read_byte(&rem->nome_cmd5); eeprom_read_block (&block->cmd5, &rem->cmd5, 4); questo.nome_cmd6 = eeprom_read_byte(&rem->nome_cmd6); eeprom_read_block (&block->cmd6, &rem->cmd6, 4); //

// Mi creo la stringa di bit da mandare che metto in SEND //

(16)

// se ho un pre_data lo metto in send if (questo.pre_data_bits !=0) {

pot=1;

for (i=0; i<(questo.pre_data_bits - 1); i++) pot*=2; for (i=0; i<(questo.pre_data_bits); i++)

{

send[i]= ((questo.pre_data) / pot); (questo.pre_data) %= pot;

pot/=2; }

j=questo.pre_data_bits; }

// guardo quale comando e richiesto a=&questo.nome_cmd1;

for (i=0; i<21; i+=5) {

if (comando == *(a+i)) {

com = *(unsigned int*)(a+i+1); o=1;

} }

if (o!=1) return 'E'; // metto il cod in send pot=1;

for (i=0; i<(questo.bits - 1); i++) pot *=2; for (i=0; i<(questo.bits); i++)

{

k=j+i; // mi metto al punto giusto di send send[k]= (com / pot);

com %= pot; pot/=2;

(17)

}

j+=questo.bits;

// guardo se c'e un post data e lo metto in send if (questo.post_data_bits !=0) {

pot=1;

for (i=0; i<((questo.post_data_bits) - 1); i++) pot*=2; for (i=0; i<(questo.post_data_bits); i++)

{

k=j+i; // mi metto al punto giusto di send send[k]= (questo.post_data / pot); questo.post_data %= pot; pot/=2;

}

j+=questo.post_data_bits; }

//se il campo flag contiene reverse inverto la stringa send if (questo.flags & REVERSE)

{

for (i=0; i<j; i++) send_inv[i] = send[j-i]; for (i=0; i<=j; i++) send[i]=send_inv[i]; }

// infine calcolo la durata di pulse e space di uno e zero x questo dispositivo campo = (questo.pone );

diviso = (F_CPU/1000000);

UNOP = ((campo * diviso) /4 ) ; campo = (questo.sone );

UNOS = ( (campo * diviso)/4 ) ; campo = (questo.pzero );

ZEROP = ( (campo * diviso)/4 ) ; campo = (questo.szero);

ZEROS = ( (campo * diviso)/4 ) ; campo = (questo.pheader );

(18)

campo = (questo.sheader );

HEADERS = ( (campo * diviso)/4 ); campo = (questo.plead );

LEADP = ( (campo * diviso)/4 ); campo = (questo.ptrail );

TRAILP = ( (campo * diviso)/4 ) ; campo = (questo.pfoot);

FOOTP = ( (campo * diviso)/4 ); campo = (questo.sfoot );

FOOTS = ( (campo * diviso)/4 ); //

// passo ora all'invio vero e proprio //

sbi (SFIOR, PUD); // disabilito tutti i pull-up sbi (DDRD, DDD7); // setto il pin PD7 come out

if ( (questo.freq ==0) || (questo.freq == 0xFF) ) {

FREQUE = 104; // creo la portante default a 38kHz }

else {

// creo la portante alla freq che serve

FREQUE = ( (F_CPU/questo.freq)/(2) ); }

// disabilito l'interrupt di timer2 cbi (TIMSK,TOIE2); cbi (TIMSK,OCIE2);

/*

Con il TIMER2 genero la portante. Setto il valore di TCCR2 a 25 per funzionare da CTC e con OC2 toggle

*/

// carico il valore relativo alla freq della portante OCR2 = FREQUE;

(19)

// se c'e l'header lo mando

if ( (questo.pheader !=0) && (questo.pheader != 0xFF) ) { TCCR2 = 25; _delay_loop_2(HEADERP); TCCR2 = 0; PORTD = (0<<PD7); _delay_loop_2(HEADERS); }

// se c'e il plead lo mando if (questo.plead !=0) {

TCCR2 = 25;

_delay_loop_2(LEADP); }

// invio la stringa di bit

if (questo.flags & SPACE_FIRST) {

finito = 0;

for (i=0; i<=j; i++) {

if (send[i] == 0) zeros(); else unos();

} }

else if ( (questo.flags & RC5) || (questo.flags & SHIFT_ENC) )

{

for (i=0; i<j; i++) {

if (send[i] == 0) zero(); else unob();

(20)

}

else if ( questo.flags & SPACE_ENC ) {

for (i=0; i<=j; i++) {

if (send[i] == 0) zero(); else uno();

} }

else return 'E'; // se c'e il ptrail lo mando if (questo.ptrail !=0) { TCNT2 = 0; TCCR2 = 25; _delay_loop_2(TRAILP); }

// se c'e il pfoot lo mando if (questo.pfoot !=0) { TCNT2 = 0; TCCR2 = 25; _delay_loop_2(FOOTP); TCCR2 = 0; PORTD = (1<<PD7); _delay_loop_2(FOOTS); }

// ho finito di mandare il codice // fermo i contatori e azzero le porte TCCR2=0;

PORTD=0; return 'O';

(21)

}

File main.c

//Funzione principale del progetto #include "global.h" #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #include <string.h> #include <avr/eeprom.h> #include <stdio.h> #include "buffer.h" #include "uart.h" #include "invia.h" #include "programmazione.h"

#define EEPROM __attribute__((section(".eeprom"))) extern cBuffer uartRxBuffer;

extern cBuffer uartTxBuffer; unsigned char RadioString[90]; unsigned char fine;

int count;

//questa variabile indica al gateway in quale stanza e` posto extern unsigned char stanza EEPROM;

unsigned char room;

extern remote LUCE1 EEPROM, LUCE2 EEPROM, TV1 EEPROM, TV2 EEPROM, VCR EEPROM, DVD EEPROM;

(22)

extern remote FINESTRA2 EEPROM, PTA1 EEPROM, PTA2 EEPROM; int i;

// Funzione che prende il dato da uartrxbuffer e lo mette in un array per l'analisi void prendidato(void) { i=0; while (i < count) { RadioString[i]=uartGetByte(); i++; } }

// Funzione che invia la risposta alla UI:

// - in caso di messaggio ricevuto corretam spedisce il char 'O' // - in caso di errore di ricezione spedisce il char 'E'

void rispondi (unsigned char a) { uartAddToTxBuffer(a); uartSendTxBuffer(); } int main(void) {

void iniz_debug (void); int prendi(void);

int numcar;

// indirizzo della stanza messo per dire al prototipo a quale stanza appartiene eeprom_write_byte (&stanza, 0x70);

// ogni dispositivo ha all'indirizzo 0x00 dell'eeprom la variabile // identificativa della stanza in cui si trova

unsigned char oe; // Variabile trasmessa all'UI x indicare errori unsigned char name;

(23)

DDRA = ((1<<PA0) || (1<< PA7)); //debug

// attraverso la variabile stanza, indico al dispositivo in quale stanza e` posto // il dato e' posto in eeprom

room = eeprom_read_byte ( &stanza );

// chiamo questa funzione per inizializzare la stanza x il debug iniz_debug ();

//inizializzo la porta uart0 //creo il buffer della porta uart0 //abilito l'interrupt in tx/rx //setto il baudrate //sei

uartInit(); // aziono la modalita IDLE

MCUCR = ((0<<SM2)|(0<<SM1)|(0<<SM0)); // Abilito lo sleep

aspetta: MCUCR|= (1<<SE); //faccio un ciclo in attesa del dato do { asm volatile ( "SLEEP\n\t" "LDS R24, 0x02E3\n\t" ); } while(fine !='F'); // Disabilito lo sleep mode MCUCR = (0<<SE);

(24)

//il messaggio e completo e lo trasferisco nel buffer RadioString[] prendidato();

//ANALIZZO IL MESSAGGIO

// Per prima cosa analizzo se il messaggio e' per la stanza in cui mi trovo if (RadioString[1] != room) { count=0; fine = 0; goto aspetta; }

// Una volta stabilito il messaggio e' riferito alla mia stanza, // guardo quale tipo di messaggio e' arrivato.

if (RadioString[0]=='P') {

oe = progr (&RadioString[2]); }

else if (RadioString[0]=='I') //siamo in modalità di comando {

// Disabilito l'interrupt da uart cbi (UCSRB,RXCIE);

// Controllo che il campo comando sia valido switch (RadioString[3]) { case 'A': case 'B': case 'C': case 'D': case 'E': case 'G': case 'H': case 'I':

(25)

case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': break;

default: oe= 'E'; break; }

if (oe == 'E') goto risp; //passo alla funzione di ricerca codici

//chiamando la funzione relativa all'oggetto da comandare //e passandogli i due bit di RadioString relativi alla

//stanza e all'oggetto piu il comando

switch (RadioString[2]) {

case '0':

name = eeprom_read_byte ( &LUCE1.nome ); if ( name == '0') oe = invia(&LUCE1, RadioString[3]);

else oe = 'E'; break;

case '1':

name = eeprom_read_byte ( &LUCE2.nome ); if ( name == '1') oe = invia(&LUCE2, RadioString[3]);

else oe = 'E'; break;

case '2':

name = eeprom_read_byte ( &TV1.nome ); if ( name == '2') oe = invia(&TV1, RadioString[3]);

(26)

break;

case '3':

name = eeprom_read_byte ( &TV2.nome ); if ( name == '3') oe = invia(&TV2, RadioString[3]);

else oe = 'E'; break;

case '4':

name = eeprom_read_byte ( &VCR.nome ); if ( name == '4') oe = invia(&VCR, RadioString[3]);

else oe = 'E'; break;

case '5':

name = eeprom_read_byte ( &DVD.nome ); if ( name == '5') oe = invia(&DVD, RadioString[3]);

else oe = 'E'; break;

case '6':

name = eeprom_read_byte ( &HIFI.nome ); if ( name == '6') oe = invia(&HIFI, RadioString[3]);

else oe = 'E'; break;

case '7':

name = eeprom_read_byte ( &RISC.nome ); if ( name == '7') oe = invia(&RISC, RadioString[3]);

else oe = 'E'; break;

case '8':

name = eeprom_read_byte ( &FINESTRA1.nome ); if ( name == '8') oe = invia(&FINESTRA1, RadioString[3]);

else oe = 'E'; break;

(27)

case '9':

name = eeprom_read_byte ( &FINESTRA2.nome ); if ( name == '9') oe = invia(&FINESTRA2, RadioString[3]);

else oe = 'E'; break;

case 'a':

name = eeprom_read_byte ( &PTA1.nome ); if ( name == 'a') oe = invia(&PTA1, RadioString[3]);

else oe = 'E'; break;

case 'b':

name = eeprom_read_byte ( &PTA2.nome ); if ( name == 'b') oe = invia(&PTA2, RadioString[3]); else oe = 'E'; break; default: oe='E'; } } else {

// Messaggio di errore: il dato ricevuto non e corretto oe='E';

}

eeprom_write_byte (0x80, oe); // Mando all'UI il messaggio "tutto ok" o "errore" risp: rispondi(oe);

// Riabilito la ricezione da UART sbi (UCSRB,RXCIE);

(28)

count = 0; fine = 0; i=0; oe = 0; goto aspetta; return 0; }

// Inserisco questa funzione per far imparare al prototipo i codici relativi ad // alcuni dispositivi

void iniz_debug (void) {

static unsigned long dato;

eeprom_write_byte (&TV1.nome, 0x32); eeprom_write_word (&TV1.bits, 6); eeprom_write_word (&TV1.flags, 1); eeprom_write_word (&TV1.pheader, 0); eeprom_write_word (&TV1.sheader, 0); eeprom_write_word (&TV1.pone, 948); eeprom_write_word (&TV1.sone, 829); eeprom_write_word (&TV1.pzero, 948); eeprom_write_word (&TV1.szero, 829); eeprom_write_word (&TV1.plead, 991); eeprom_write_word (&TV1.ptrail, 0); eeprom_write_word (&TV1.pfoot, 0); eeprom_write_word (&TV1.sfoot, 0); eeprom_write_word (&TV1.pre_data_bits, 7); dato = 0x40; eeprom_write_block (&dato,&TV1.pre_data, 4); eeprom_write_word (&TV1.freq, 0); eeprom_write_byte (&TV1.nome_cmd1, 0x44); dato = 0x0c; eeprom_write_block (&dato,&TV1.cmd1, 4); eeprom_write_byte (&TV1.nome_cmd2, 0x45);

(29)

dato = 0x01; eeprom_write_block (&dato,&TV1.cmd2, 4); eeprom_write_byte (&TV1.nome_cmd4, 0x48); dato = 0x10; eeprom_write_block (&dato,&TV1.cmd4, 4); eeprom_write_byte (&TV1.nome_cmd5, 0x49); dato = 0x11; eeprom_write_block (&dato,&TV1.cmd5, 4); eeprom_write_byte (&TV2.nome, 0x33); eeprom_write_word (&TV2.bits, 12); eeprom_write_word (&TV2.flags, 0x0018); eeprom_write_word (&TV2.pheader, 2400); eeprom_write_word (&TV2.sheader, 600); eeprom_write_word (&TV2.pone, 1200); eeprom_write_word (&TV2.sone, 600); eeprom_write_word (&TV2.pzero, 600); eeprom_write_word (&TV2.szero, 600); eeprom_write_word (&TV2.plead, 0); eeprom_write_word (&TV2.ptrail, 0); eeprom_write_word (&TV2.pfoot, 0); eeprom_write_word (&TV2.sfoot, 0); eeprom_write_word (&TV2.pre_data_bits, 0); dato = 0; eeprom_write_block (&dato,&TV2.pre_data, 4); eeprom_write_word (&TV2.freq, 40000); eeprom_write_byte (&TV2.nome_cmd1, 0x44); dato = 0x95; eeprom_write_block (&dato,&TV2.cmd1, 4); eeprom_write_byte (&TV2.nome_cmd2, 0x45); dato = 0x90; eeprom_write_block (&dato,&TV2.cmd2, 4); eeprom_write_byte (&VCR.nome, 0x34); eeprom_write_word (&VCR.bits, 24); eeprom_write_word (&VCR.flags, 0x0008); eeprom_write_word (&VCR.pheader, 4000);

(30)

eeprom_write_word (&VCR.sheader, 1600); eeprom_write_word (&VCR.pone, 400); eeprom_write_word (&VCR.sone, 1200); eeprom_write_word (&VCR.pzero, 400); eeprom_write_word (&VCR.szero, 400); eeprom_write_word (&VCR.plead, 0); eeprom_write_word (&VCR.ptrail, 400); eeprom_write_word (&VCR.pfoot, 0); eeprom_write_word (&VCR.sfoot, 0); eeprom_write_word (&VCR.pre_data_bits, 24); dato = 0x400409; eeprom_write_block (&dato,&VCR.pre_data, 4); eeprom_write_word (&VCR.freq, 36000); eeprom_write_byte (&VCR.nome_cmd1, 0x44); dato = 0xBCB5; eeprom_write_block (&dato,&VCR.cmd1, 4); eeprom_write_byte (&VCR.nome_cmd2, 0x4E); dato = 0x5059; eeprom_write_block (&dato,&VCR.cmd2, 4); eeprom_write_byte (&VCR.nome_cmd3, 0x4F); dato = 0x09; eeprom_write_block (&dato,&VCR.cmd3, 4); eeprom_write_byte (&DVD.nome, 0x35); eeprom_write_word (&DVD.bits, 16); eeprom_write_word (&DVD.flags, 0x0008); eeprom_write_word (&DVD.pheader, 9075); eeprom_write_word (&DVD.sheader, 4412); eeprom_write_word (&DVD.pone, 645); eeprom_write_word (&DVD.sone, 474); eeprom_write_word (&DVD.pzero, 645); eeprom_write_word (&DVD.szero, 1601); eeprom_write_word (&DVD.plead, 0); eeprom_write_word (&DVD.ptrail, 645); eeprom_write_word (&DVD.pfoot, 0); eeprom_write_word (&DVD.sfoot, 0); eeprom_write_word (&DVD.pre_data_bits, 0);

(31)

dato = 0x0; eeprom_write_block (&dato,&DVD.pre_data, 4); eeprom_write_word (&DVD.freq, 0); eeprom_write_byte (&DVD.nome_cmd1, 0x44); dato = 0x9768; eeprom_write_block (&dato,&DVD.cmd1, 4); eeprom_write_byte (&DVD.nome_cmd2, 0x4D); dato = 0x5059; eeprom_write_block (&dato,&DVD.cmd2, 4); eeprom_write_byte (&DVD.nome_cmd3, 0x4E); dato = 0x09; eeprom_write_block (&dato,&DVD.cmd3, 4); eeprom_write_byte (&HIFI.nome, 0x36); eeprom_write_word (&HIFI.bits, 16); eeprom_write_word (&HIFI.flags, 0x0008); eeprom_write_word (&HIFI.pheader, 8497); eeprom_write_word (&HIFI.sheader, 4302); eeprom_write_word (&HIFI.pone, 512); eeprom_write_word (&HIFI.sone, 1620); eeprom_write_word (&HIFI.pzero, 512); eeprom_write_word (&HIFI.szero, 554); eeprom_write_word (&HIFI.plead, 0); eeprom_write_word (&HIFI.ptrail, 513); eeprom_write_word (&HIFI.pfoot, 0); eeprom_write_word (&HIFI.sfoot, 0); eeprom_write_word (&HIFI.pre_data_bits, 16); dato = 0x45BA; eeprom_write_block (&dato,&HIFI.pre_data, 4); eeprom_write_word (&HIFI.freq, 0); eeprom_write_byte (&HIFI.nome_cmd1, 0x44); dato = 0x38C7; eeprom_write_block (&dato,&HIFI.cmd1, 4);

eeprom_write_byte (&HIFI.nome_cmd2, 0x4E); dato = 0xE817;

eeprom_write_block (&dato,&HIFI.cmd2, 4);

(32)

dato = 0x6897;

eeprom_write_block (&dato,&HIFI.cmd3, 4); }

//Funzione di interrupt per la ricezione da uart

UART_INTERRUPT_HANDLER(SIG_UART_RECV) {

u08 z;

//incremento il contatore di caratteri count++;

//acquisisco il byte ricevuto da uart0 z = inb(UDR);

// controllo l'arrivo del fine messaggio if (z == 'F') fine = 'F'; //metto il byte ricevuto nel buffer_uart_rx

bufferAddToEnd(&uartRxBuffer, z); }

Riferimenti

Documenti correlati

APPENDICE B : Ricerca della funzione di trasferimento della

[r]

Ogni quadrato può essere rappresentato dalle coordinate della cella in alto a sinistra (la più vicina a quella con coordinate 0, 0) e dalla lunghezza del lato. La seguente

Il servizio Invio Telematico consente l’invio della dichiarazione delle retribuzioni in formato elettronico sulla base dei tracciati pubblicati dall’Istituto.. Per

Marta, Flavio, Rocco, Gianluca, Giorgio e Paola sono in piscina e si stanno allenando per disputare una gara

Member(E, lista): verifica se l’elemento E è presente nella lista Append(E, lista): inserisce l’elemento dato E in coda alla lista (due. versioni: nella prima versione uso di

Si scriva la funzione void normalize (WAVE w, double percentage) che riceva come parametri un file audio, già caricato in memoria, e il valore percentuale di normalizzazione,

Si implementi la funzione ricorsiva void moltiplica (int Q[]) che, utilizzando una libreria di funzioni di accesso alla coda (da implementare) prendendo in input Q, restituisce la