Re: [Avr-list] noob help ;-)
plop plop Olivier MATZ a écrit : >> j'ai fait un printf comme ça (dans le main ): >> >> printf("%lu %u\n",(unsigned long)sec,(unsigned int)nbre_tours); >> >> en déclarant sec comme "seconds" et j'ai quand même un débordement sur >> 16bits. >> > > ça devrait marcher pourtant. Par défaut je mets "%ld" mais je pense que > c'est pareil. Sinon rebalance le code ;) > Ci-joint. > >> ps : Sinon comment on fait pour arrêter "tip" ? parce que pour >> l'instant je suis obliger de le killer via une autre console ! pour info >> mon tip vient du projet uLinux là : >> http://svn.digium.com/view/aadk/uClinux/trunk/uClinux-dist/user/tip/tip.c?view=markup&sortby=log&pathrev=13 >> > > je sais plus si c'est ^. ou ~. sur la version de base. > c'est ~. Sinon, j'ai du mal à comprendre comment marche tout le bousin. Je voudrai utiliser le timer0 pour avoir un rapport cyclique variable sur OC0, est-ce que c'est possible de le faire tout en ayant le scheduler sur le même timer ? Merci. FabM, on finira tous à vélo ps : saloperie de BS170 qui qui a un pinout différent en fonction de sa version (Dmos ou mosfet). /*activation des ports. LED : ready !*/ //cbi (port, bit) = clear port //sbi (port, bit) = set port #include #include #include #include #include #include //#include //#include //#include #define VENT1 2 #define VENT2 3 #define LED_BLEUE (1<<4) #define LED_JAUNE (1<<5) volatile static uint16_t nbre_tours; void transmettre(seconds date){ volatile unsigned long secondes; if(nbre_tours != 0){ secondes = date; printf("%lu %u\n",secondes,(unsigned int)nbre_tours); } nbre_tours = 0; } void commute(void * pouet){ static char etat=0; if(etat==0){ etat = 1; PORTB |= (1<<3); }else{ etat=0; PORTB &= ~(1<<3); } } int main(void) { volatile seconds date; volatile char etat_prec,etat; volatile char transmis; /**/ /* initialisations*/ /**/ uart_init(); scheduler_init(); time_init(200); sei(); // truc bizarre pour faire marcher printf fdevopen((int(*)(char))uart0_send,(int(*)(void))uart0_recv,0); // initialisation du logger scheduler_add_periodical_event(commute,NULL,1); /* les flags sont sur le GIFR bit 6 et 7 */ DDRD = LED_BLEUE | LED_JAUNE; //pind 4 et 5 en sortie (led) DDRA = 0; //adc en entrée DDRB |= 1<<3; //portb 3 en sortie (PWM) printf("StationMeteo a bootee\n"); PORTD = LED_BLEUE | LED_JAUNE; // extinction des leds etat=0;etat_prec=0;nbre_tours=0; while(1){ /* clignotement de la led bleue a chaque tour de * l'anÃmomÃtre */ if(PIND & 0x0C) PORTD &= ~LED_BLEUE; else PORTD |= LED_BLEUE; /* detection des fronts montants sur les pin 2 et 3 */ etat = ((PIND&0x0C)==0)?1:0; if(etat != etat_prec)nbre_tours++; etat_prec = etat; /* envoi des donnees toutes les 10 secondes */ date = time_get_s(); if(date%10 == 0){ if(transmis==FALSE){ transmis = TRUE; transmettre(date); } }else{ transmis = FALSE; } } return 0; } ___ Avr-list mailing list Avr-list@droids-corp.org CVSWEB : http://cvsweb.droids-corp.org/cgi-bin/viewcvs.cgi/aversive WIKI : http://wiki.droids-corp.org/index.php/Aversive DOXYGEN : http://zer0.droids-corp.org/doxygen_aversive/html/ BUGZILLA : http://bugzilla.droids-corp.org COMMIT LOGS : http://zer0.droids-corp.org/aversive_commitlog
Re: [Avr-list] noob help ;-)
yop, >>> printf("%lu %u\n",(unsigned long)sec,(unsigned int)nbre_tours); >>> >>> en déclarant sec comme "seconds" et j'ai quand même un débordement sur >>> 16bits. >>> >> ça devrait marcher pourtant. Par défaut je mets "%ld" mais je pense que >> c'est pareil. Sinon rebalance le code ;) >> > Ci-joint. Je vois pas l'erreur là. J'essayerai sur sur notre robot la semaine prochaine parce que ça m'intrigue ;) Essaye de regarder si un truc comme ça fonctionne : long i=153548L; printf("%ld\n", i); Sinon, je pense pas que ce soit ça, mais dans le menuconfig, tu peux choisir différents types de printf (dans generation options). > Sinon, j'ai du mal à comprendre comment marche tout le bousin. Je > voudrai utiliser le timer0 pour avoir un rapport cyclique variable sur > OC0, est-ce que c'est possible de le faire tout en ayant le scheduler > sur le même timer ? Je pense que c'est possible... même si le module est pas vraiment prévu pour. Dans le cas où tu utilises le scheduler avec le timer0 (sans utiliser le module hardware/timer), il va initialiser les registres de la manière suivante : sbi(TIMSK, TOIE0); TCNT0 = 0; TCCR0 = SCHEDULER_CK; En gros, tu dois pouvoir changer la valeur de TCCR0 après l'initialisation du scheduler pour utiliser le mode PWM du timer 0, tout en gardant l'interruption overflow, utilisée par le scheduler. a+ Olivier ___ Avr-list mailing list Avr-list@droids-corp.org CVSWEB : http://cvsweb.droids-corp.org/cgi-bin/viewcvs.cgi/aversive WIKI : http://wiki.droids-corp.org/index.php/Aversive DOXYGEN : http://zer0.droids-corp.org/doxygen_aversive/html/ BUGZILLA : http://bugzilla.droids-corp.org COMMIT LOGS : http://zer0.droids-corp.org/aversive_commitlog
[Avr-list] aversive CVS_LOG 2007-07-01
Commit from zer0 on branch b_zer0 (2007-06-30 15:27 CEST) - Factorisation of code for callback events. aversive modules/comm/i2c/i2c.h 1.1.2.5 aversive modules/comm/i2c/i2c.c 1.1.2.4 --- aversive/modules/comm/i2c/i2c.h (1.1.2.4 -> 1.1.2.5) --- *** *** 15,21 * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * ! * Revision : $Id: i2c.h,v 1.1.2.4 2007-06-24 19:55:54 zer0 Exp $ * */ --- 15,21 * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * ! * Revision : $Id: i2c.h,v 1.1.2.5 2007-06-30 13:27:57 zer0 Exp $ * */ *** *** 79,84 --- 79,86 #define I2C_STATUS_SLAVE_XMIT 0x08 #define I2C_STATUS_SLAVE_RECV 0x10 #define I2C_STATUS_OP_FINISHED 0x20 + #define I2C_STATUS_NEED_XMIT_EVT 0x40 + #define I2C_STATUS_NEED_RECV_EVT 0x80 /** * mode is I2C_MODE_UNINIT, I2C_MODE_MASTER, I2C_MODE_MULTIMASTER or --- aversive/modules/comm/i2c/i2c.c (1.1.2.3 -> 1.1.2.4) --- *** *** 1,5 /* ! * Copyright Droids Corporation, Microb Technology, Eirbot (2007) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by --- 1,5 /* ! * Copyright Droids Corporation (2007) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by *** *** 15,25 * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * ! * Revision : $Id: i2c.c,v 1.1.2.3 2007-06-24 19:55:54 zer0 Exp $ * */ ! /* Author: Zer0, based on Tof old i2c module */ #include #include --- 15,30 * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * ! * Revision : $Id: i2c.c,v 1.1.2.4 2007-06-30 13:27:57 zer0 Exp $ * */ ! /* ! * Author : Olivier MATZ [EMAIL PROTECTED] ! * ! * Thanks to Tof for the old i2c module and to Serpilliere for ! * testing. ! */ #include #include *** *** 554,573 case TW_MT_SLA_NACK: /* the slave does not answer, send a stop condition */ ! if(g_send_event) ! g_send_event(-1); ! command |= (1<= g_send_size) { ! if(g_send_event) ! g_send_event(g_send_nbytes); ! command |= (1<= g_send_size) { ! g_status |= (I2C_STATUS_OP_FINISHED | I2C_STATUS_NEED_XMIT_EVT); } else { TWDR = g_send_buf[g_send_nbytes++]; *** *** 578,587 /* we transmitted data but slave sent us a NACK. * Notify the number of bytes sent, including the one * that were not acked, and send a stop condition */ ! if(g_send_event) ! g_send_event(g_send_nbytes); ! command |= (1<> send stop */ ! command |= (1<> send stop ?? XXX */ ! g_status |= I2C_STATUS_OP_FINISHED; break; default : ! /* default ... what can we do ? */ break; } *** *** 774,782 /* if it is not a synchronous op, we should be aware * of next SLA+RW if we are a slave or multimaster */ #ifdef CONFIG_MODULE_I2C_MASTER ! if (g_mode != I2C_MODE_MASTER) command |= (1