Show Posts
Pages: 1 ... 3 4 [5] 6
61  International / Français / Re: Codes pour deux DS18b20 arduino uno on: February 21, 2012, 04:29:00 pm
Bonjour, je me permet un petit up


la bibliothèque de X. HINAULT est très sympa, mais des que les températures négatives arrivent elle fonctionne bcp moins bien !

en fait le bug se cache dans ce coin la
Code:
data[1]=data[1] & B10000111; // met à 0 les bits de signes inutiles
tempet=data[1]; // bits de poids fort
tempet=tempet<<8;
tempet=tempet+data[0]; // bits de poids faible

En fait le bit de signe n'est pas si inutile que ça !!!
J'utilise une façon plus bourrine pour récupérer la dite température, en une seule ligne.

Code:
tempet=(data[1]<<8)|data[0];

Sachant que je fait des courbes sur mon mac a partir des données de mon arduino, j'ai cherché le pourquoi de mes tracés bizarre un certain temps !

En espérant que ce patch aidera d'autres.
62  International / Français / Re: Voir le code assembleur on: February 21, 2012, 03:36:24 am
Merci a tous, c'est tout a fait le genre de choses que je voulais voir/savoir.

Dans la majeure partie des cas les fonctions "toutes faites" d'arduino font parfaitement l'affaire, mais c'est toujours intéressant et parfois utile de pouvoir aller plus loin.


Bonne idée ce topic sur les optimisations !
(C'est un sujet sans fin, la chose risque d’être assez compliquée en fait.)
63  International / Français / Re: Voir le code assembleur on: February 20, 2012, 01:47:39 pm
C'est pas tellement le .hex qui m'intéresse, c'est plutot le .asm mais avec les "label" et les noms de variables qui correspondent a mon .pde du départ.

Parce que désassembler le .hex pour voir ce qui change quand je modifie une ligne de programme, ca va me compliquer plus a vie que me a simplifier.


Ceci dit, mon arduino a 20 mhz est tellement plus rapide que mon ex pic a 16 mhz/4, que finalement savoir dans que ordre imbriquer mes if c'est moins important finalement. (mais bon, c'est pas une raison pour gaspiller des cycles ^^)



Pour l'example, voila le genre de trucs que j'avais "avant"

Ca c'est un morceau de C que je compile avec SDCC

Code:
#define PIC_CLK 2000000
#include <pic16f886.h>
//unsigned int at 0x2007 __CONFIG = (_CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC & _WRT_ENABLE_ON & _LVP_OFF & _DEBUG_OFF & _CPD_OFF);
unsigned int at 0x2007 __CONFIG = 0x3732;
// super boucle d'attente
void wait(unsigned int j){
unsigned int a;
unsigned int i;
for (i=0; i<j; i++);
{for (a=0;a<65000;a++);{;}
}
}


// K2000 version beta
void main()
{
unsigned int delay=65000;
TRISB=0; //Port B en sortie (leds rouges)
PORTB=1;

while (1){
while(PORTB<128){
PORTB=PORTB<<1;
//wait(delay);
}
while(PORTB>1){
PORTB=PORTB>>1;
//wait (delay);
}
}
}


Et ca c'est e bazard intermediaire que ca donne en assembleur, avant de rentrer dans GPASM

Code:

;--------------------------------------------------------
; File Created by SDCC : free open source ANSI-C Compiler
; Version 2.8.5 #5278 (Dec 12 2008) (Mac OS X i386)
; This file was generated Sat Jun  6 17:27:16 2009
;--------------------------------------------------------
; PIC port for the 14-bit core
;--------------------------------------------------------
; .file "k2000.c"
list p=16f876
radix dec
include "p16f876.inc"
;--------------------------------------------------------
; config word
;--------------------------------------------------------
__config 0x3732
;--------------------------------------------------------
; external declarations
;--------------------------------------------------------
extern _ADCON0_bits
extern _ADCON1_bits
extern _CCP1CON_bits
extern _CCP2CON_bits
extern _EECON1_bits
extern _INTCON_bits
extern _OPTION_REG_bits
extern _PCON_bits
extern _PIE1_bits
extern _PIE2_bits
extern _PIR1_bits
extern _PIR2_bits
extern _PORTA_bits
extern _PORTB_bits
extern _PORTC_bits
extern _RCSTA_bits
extern _SSPCON_bits
extern _SSPCON2_bits
extern _SSPSTAT_bits
extern _STATUS_bits
extern _T1CON_bits
extern _T2CON_bits
extern _TRISA_bits
extern _TRISB_bits
extern _TRISC_bits
extern _TXSTA_bits
extern _INDF
extern _TMR0
extern _PCL
extern _STATUS
extern _FSR
extern _PORTA
extern _PORTB
extern _PORTC
extern _PCLATH
extern _INTCON
extern _PIR1
extern _PIR2
extern _TMR1L
extern _TMR1H
extern _T1CON
extern _TMR2
extern _T2CON
extern _SSPBUF
extern _SSPCON
extern _CCPR1L
extern _CCPR1H
extern _CCP1CON
extern _RCSTA
extern _TXREG
extern _RCREG
extern _CCPR2L
extern _CCPR2H
extern _CCP2CON
extern _ADRESH
extern _ADCON0
extern _OPTION_REG
extern _TRISA
extern _TRISB
extern _TRISC
extern _PIE1
extern _PIE2
extern _PCON
extern _SSPCON2
extern _PR2
extern _SSPADD
extern _SSPSTAT
extern _TXSTA
extern _SPBRG
extern _ADRESL
extern _ADCON1
extern _EEDATA
extern _EEADR
extern _EEDATH
extern _EEADRH
extern _EECON1
extern _EECON2
extern __sdcc_gsinit_startup
;--------------------------------------------------------
; global declarations
;--------------------------------------------------------
global _wait
global _main

global PSAVE
global SSAVE
global WSAVE
global STK12
global STK11
global STK10
global STK09
global STK08
global STK07
global STK06
global STK05
global STK04
global STK03
global STK02
global STK01
global STK00

sharebank udata_ovr 0x0070
PSAVE res 1
SSAVE res 1
WSAVE res 1
STK12 res 1
STK11 res 1
STK10 res 1
STK09 res 1
STK08 res 1
STK07 res 1
STK06 res 1
STK05 res 1
STK04 res 1
STK03 res 1
STK02 res 1
STK01 res 1
STK00 res 1

;--------------------------------------------------------
; global definitions
;--------------------------------------------------------
;--------------------------------------------------------
; absolute symbol definitions
;--------------------------------------------------------
;--------------------------------------------------------
; compiler-defined variables
;--------------------------------------------------------
UDL_k2000_0 udata
r0x1001 res 1
r0x1000 res 1
r0x1002 res 1
r0x1003 res 1
;--------------------------------------------------------
; initialized data
;--------------------------------------------------------
;--------------------------------------------------------
; overlayable items in internal ram
;--------------------------------------------------------
; udata_ovr
;--------------------------------------------------------
; reset vector
;--------------------------------------------------------
STARTUP code
nop
pagesel __sdcc_gsinit_startup
goto __sdcc_gsinit_startup
;--------------------------------------------------------
; code
;--------------------------------------------------------
code_k2000 code
;***
;  pBlock Stats: dbName = M
;***
;entry:  _main ;Function start
; 2 exit points
;has an exit
;; Starting pCode block
_main ;Function start
; 2 exit points
; .line 19; "k2000.c" TRISB=0; //Port B en sortie (leds rouges)
BANKSEL _TRISB
CLRF _TRISB
; .line 20; "k2000.c" PORTB=1;
MOVLW 0x01
BANKSEL _PORTB
MOVWF _PORTB
;unsigned compare: left < lit(0x80=128), size=1
_00125_DS_
; .line 23; "k2000.c" while(PORTB<128){
MOVLW 0x80
BANKSEL _PORTB
SUBWF _PORTB,W
BTFSC STATUS,0
GOTO _00128_DS_
;genSkipc:3083: created from rifx:0xbfff58c4
; .line 24; "k2000.c" PORTB=PORTB<<1;
BCF STATUS,0
RLF _PORTB,F
GOTO _00125_DS_
;swapping arguments (AOP_TYPEs 1/3)
;unsigned compare: left >= lit(0x2=2), size=1
_00128_DS_
; .line 27; "k2000.c" while(PORTB>1){
MOVLW 0x02
BANKSEL _PORTB
SUBWF _PORTB,W
BTFSS STATUS,0
GOTO _00125_DS_
;genSkipc:3083: created from rifx:0xbfff58c4
;shiftRight_Left2ResultLit:4862: shCount=1, size=1, sign=0, same=1, offr=0
; .line 28; "k2000.c" PORTB=PORTB>>1;
BCF STATUS,0
RRF _PORTB,F
GOTO _00128_DS_
RETURN
; exit point of _main

;***
;  pBlock Stats: dbName = C
;***
;entry:  _wait ;Function start
; 2 exit points
;has an exit
;5 compiler assigned registers:
;   r0x1000
;   STK00
;   r0x1001
;   r0x1002
;   r0x1003
;; Starting pCode block
_wait ;Function start
; 2 exit points
; .line 6; "k2000.c" void wait(unsigned int j){
BANKSEL r0x1000
MOVWF r0x1000
MOVF STK00,W
MOVWF r0x1001
; .line 9; "k2000.c" for (i=0; i<j; i++);
CLRF r0x1002
CLRF r0x1003
_00105_DS_
BANKSEL r0x1000
MOVF r0x1000,W
SUBWF r0x1003,W
BTFSS STATUS,2
GOTO _00120_DS_
MOVF r0x1001,W
SUBWF r0x1002,W
_00120_DS_
BTFSC STATUS,0
GOTO _00108_DS_
;genSkipc:3083: created from rifx:0xbfff58c4
BANKSEL r0x1002
INCF r0x1002,F
BTFSC STATUS,2
INCF r0x1003,F
GOTO _00105_DS_
_00108_DS_
; .line 10; "k2000.c" {for (a=0;a<65000;a++);{;}
MOVLW 0xe8
BANKSEL r0x1001
MOVWF r0x1001
MOVLW 0xfd
MOVWF r0x1000
_00111_DS_
MOVLW 0xff
BANKSEL r0x1001
ADDWF r0x1001,F
BTFSS STATUS,0
DECF r0x1000,F
MOVF r0x1001,W
IORWF r0x1000,W
BTFSS STATUS,2
GOTO _00111_DS_
RETURN
; exit point of _wait


; code size estimation:
;   48+    9 =    57 instructions (  132 byte)

end




Ca c'etait un exemple "simple", jute pour voir s'il fallait mieux faire un machin=machin>>1  ou machin=machin/2 ou je ne sait pus quelle autre formule qui reviens au meme.


L'idée c'est de faire le meme genre d'essais mais sur arduino
64  International / Français / Re: Voir le code assembleur on: February 20, 2012, 12:26:14 pm
En effet le shift+verify me permet de trouver pleins de fichiers temporaires dans /var/machin/truc  (oui, je suis sur mac moi aussi smiley )

mais pas la moindre ligne d'assembleur la dedans, que mon fichier .cpp de départ tel quel et le reste c'est des fichiers binaires directement :'(


Au moins j'ai compris quelques rouages de l'IDE et du compilateur, mais ca ne m'aide pas beaucoup pour optimiser mon code.

Peut etre qu'en bidouillant les fichiers de config de l'IDE y'a moyen de creuser d'avantage ?

En utilisant avrgcc "a la main" sinon ?
65  International / Français / Re: Arduino Uno envoyer les données de 2 capteurs en série on: February 20, 2012, 12:19:05 pm
Oula, en effet c'est vachement raccourci comme programme smiley-grin


deja lire tes trames série dans le draw() ça ne me semble pas la meilleure façon de procéder, surtout que tu peut avoir une fonction toute faite qui se lance automagiquement quand tu reçoit des données.

Ensuite a aucun moment tu découpe le message que l'arduino t'as envoyé, donc forcement pour séparer tes valeurs ça va pas le faire.


Sur www.mon-club-elec.fr ( en plus c'est un site fait par un des membres de ce forum) y'a des exemples de codes en processing, notamment un oscilloscope multi courbes.
Je te conseille de t'en inspirer. (je suis moi même en train de faire des trucs sur cette base. (mais en plus des bugs du software, j'ai aussi mon hardware qui n'en fait qu'a sa tete smiley-grin ))

66  International / Français / Re: Arduino Uno envoyer les données de 2 capteurs en série on: February 20, 2012, 10:08:02 am
@fdufnews : en effet je t'ai grillé, mais a aller trop vite j'avais ecrit un "bug" ;=)

@Taahl : montre nous ton bout de code processing qui patine.
A mon avis la clef du probleme est coté PC, pas coté arduino.
67  International / Français / Re: Arduino Uno envoyer les données de 2 capteurs en série on: February 20, 2012, 09:47:43 am
Bonjour,

je te conseille d'envoyer coté arduino un "marqueur" avec chaque valeur, de façon a pouvoir les différencier plus facilement coté processing.

par exemple tu fait un Serial.write("A"); Serial.write(potardReading); suivi d'un Serial.write("B");Serial.write(piezoReading);

Et ensuite coté processing tu identifie ton A et ton B pour savoir qui fait quoi, et tu isole la valeur qui va avec.
68  International / Français / Voir le code assembleur on: February 20, 2012, 09:29:04 am
Bonjour,

par curiosité avant tout, mais avec un souci d'optimisation en arrière pensée je cherche a comprendre comment "marchent" les programmes arduino.

De ce que j'ai compris entre le code arduino qu'on écrit dans l'IDE et le .hex qui fini dans le micro contrôleur il y'a au moins 3/4 étapes intermédiaires quand le clic sur le bouton pour transférer le code dans mon arduino.

D'abord une première moulinette qui rajout plein d'includes divers pour les fonctions de base de l'arduino et qui ponds un code en C plus complet
Ensuite une 2eme moulinette qui converti le C en question en assembleur
puis un machin qui fait un .hex a partir du code en assembleur
et enfin un autre machin qui transfert le .hex dans la puce.

- Ai je bien compris ? il y'a t'il d'autres étapes ?
- Comment "voir" les fichiers intermédiaires ?

Je serais curieux de voir comment en modifiant quelques lignes de mon programme arduino ce qui change dans le code assembleur.

En fait j'ai une fonction que j’appelle a intervalles réguliers (via la librairie timer2ms), et je voudrais que mon arduino passe le moins de temps possible dedans.
Je voudrais optimiser l'ordre et l'imbrication des conditions qu'il y'a dedans au mieux.
(même si au départ mon truc tournait sur un pic beaucoup plus lent que mon arduino, et que les perfs n'etait pas si mal que ca. Tant que je peut faire mieux, c'est mieux.)
69  International / Français / Variable qui resiste au reset ? on: October 21, 2011, 10:38:17 am
Bonjour,


lorsque j'établis la liaison USB avec mon arduino (Arduino uno CMS), apparemment il effectue un reset au passage.

j'aurais besoin que quelques variables que je stock pendant que la com' n'est pas forcement établie ne soient pas perdues au moment ou je vais écouter ce que mon arduino raconte. (en fait il "cause" tout le temps, mais coté PC je ne l'écoute que lorsque j'ai besoin).

je voudrais éviter d'utiliser l'eeprom pour les stocker, parce que le fait qu'elles disparaissent lorsque je coupe/remet l'alim de l'arduino (et du PC en fait)

En fait l'arduino gère la vitesse des ventillos de mon (vieux) PC, et les valeurs en question sont les maxi et mini de mes sondes de température.

Y'a t'il une astuce pour eviter le reset de l'arduino lorsqu'on ouvre la com' sur l'usb ?
70  International / Français / Re: Domotique - Pilotage ventilation on: September 30, 2011, 02:03:46 am
Bonjour,

niveau sondes, je te conseille plutot des DS18B20 que de l'analogique.
C'est limite plus simple a mettre en oeuvre, et moins sensible au cablage.
71  International / Français / Re: adresse DS18B20 on: September 04, 2011, 04:50:37 am
Les DS18b20 sont également sensibles a la "qualité" de leur alimentation, et au temps entre 2 lectures de température.
Ton +5v est il bien stable ? fait il vraiment 5v ?
Est tu en mode 2 fils ou 3 fils ?
quelle est la longueur de tes câbles ? - passé 2 ou 3 metres; le mode 3 fils est a priviligier.
combien de temps attends tu entre 2 lectures ? - en mode 2 fils attendre au moins 1 seconde entre chaque lecture.Sur 3 fils ont peut aller plus vite.

72  International / Français / Re: Ambilight arduino on: August 18, 2011, 04:47:58 pm
Depuis la freebox oui, il doit y'avoir moyen de recuperer le flux video avec un PC.

Depuis la TV, ca m'étonnerais.
73  International / Français / Re: Synchro secteur et PWM on: August 18, 2011, 01:35:24 pm
OMG, je suis vraiment pas doué avec les moteurs de recherche !
En fait y'a pile poil ce que je cherche dans ce topic !
merci smiley
74  International / Français / Re: Codeur, controle de position on: August 18, 2011, 01:12:05 pm
C'est quoi comme type de codeur ?
Un incremental avec 2 sorties en quadrature ?
Tu fait comment pour compter les tops ?
75  International / Français / Synchro secteur et PWM on: August 18, 2011, 11:55:23 am
Bonjour,


je cherche un moyen le plus simple possible possible de synchroniser le module pwm et le secteur pour faire un gradateur de lumière.
J'ai bien trouvé un schéma assez simple qui rajoute une diode, un transistor et 2 résistances au niveau de l'alim secteur de l'arduino,
mais jai pas trouvé le programme qui va avec, et ca oblige a avoir l'arduino alimenté sur la meme phase que le "truc commandé".
Or etant en triphasé chez moi, c'est une chance sur 3 seulement smiley vu que l'arduino est susceptible a terme d'etre relativement loin des lampes qu'il commande (*), et puis pdt le développement du soft j'aime bien alimenter mon arduino par l'usb plutot que par un bloc secteur modifié, je trouve ça plus confortable.

Bref je préférais un truc a base de photocoupleur, mais parmi toutes les réponses que me donne google j'ai bien du mal a faire le tri.
De meme un bout de programme, ou au moins une méthode ou des astuces pour le faire m'aiderais également beaucoup.

Je pense qu'il faut une interruption hardware pour intercepter le changement d'état de l'opto, qu'il faut choisir pertinemment les paramètres des timers, et vu que les diviseur sont des puissances de deux, 50 hz x 256, c'est pas gagné pour que ça tombe pile poil avec 16 000 000 :/


Mais je doit pas etre le premier a rencontrer le probleme, z'avez surement de tuyaux ?



Pages: 1 ... 3 4 [5] 6