Show Posts
Pages: 1 2 [3] 4 5 ... 7
31  International / Français / Re: Backup du SREG dans une interruption on: November 23, 2013, 01:51:01 pm
 smiley-red

je me coucherais beaucoup moins bête ce soir...

Merci Barbudor pour toutes ces informations !

Par contre tout le monde va oublier le fait que j'ai pris une fonction normale pour une routine d'interruption je vous prie  smiley-red
morale de cette histoire : la nuit sert à dormir et pas à coder  smiley-lol
32  International / Français / Re: Backup du SREG dans une interruption on: November 23, 2013, 12:36:02 pm
Arduino\hardware\arduino\cores\arduino\wiring.c
ligne 67

Code:
unsigned long millis()
{
unsigned long m;
uint8_t oldSREG = SREG;

// disable interrupts while we read timer0_millis or we might get an
// inconsistent value (e.g. in the middle of a write to timer0_millis)
cli();
m = timer0_millis;
SREG = oldSREG;

return m;
}

version : ARDUINO 1.0.5 - 2013.05.15
33  International / Français / Re: Backup du SREG dans une interruption on: November 23, 2013, 12:22:29 pm
Bonsoir à tous smiley

Qu'a tu lu qui te fait croire qu'il faut le faire ?

Quote from: datasheet ATmega32u4   |   4.4 Status Register
The status Register is not automatically stored when entering an interrupt routine and restored when returning form an interrupt. This must be handled by software

Désolé Super_Cinci mais moi et l'assembleur on est pas resté en bon terme ^^
Pour le moment je touche pas aux attributs, ils restent un mystère pour moi et je n'ai pas le temps de pencher là dessus pour le moment.
Donc je ne sais pas trop comment AVR Studio gèrent les ISR :/ est-ce qu'il compile avec le fameu naked ? ou il faut le préciser si on souhaite l'avoir comme ça ?

Mais je n'ai pas pensé que ce que le datasheet disait n'était valable que si on codait en assembleur, auquel cas il faut absolument prendre en main. Je pense que AVR Studio gère cette chose automatique non ?
Et puis en regardant de plus près les fonctions Arduino, j'a remarqué par exemple que le SREG est backup dans l'interruption gérant le timer0 pour les fonctions de delay. Du coup je ne sais plus quoi en penser maintenant... sachant que le compilateur dans le cas d'Arduino et dans le mien est gcc avr...
34  International / Français / Backup du SREG dans une interruption on: November 23, 2013, 10:58:39 am
Bonjour à tous

J'ai récemment appris en lisant le datasheet du atmega32u4 qu'il fallait manuellement restaurer le SREG après une interruption. Je l'ai mis en application sur ma première routine d'interruption qui joue aux petits suisses avec un signal PPM de récepteur RC. Sauf que je vois qu'il y a un gros problème quand je fais ça, j'ai une grosse latence qui apparaît, et ça perturbe à un tel point que je ne peux même plus contrôler correctement un seul servomoteur.
Pour info, j'utilise AVR Studio pour programmer une Leonardo. oldSREG est déclarée globale volatile en uint8_t.
Le code est tout ce qu'il y a de plus bête:

Code:
ISR(TIMER3_CAPT_vect)
{
oldSREG = SREG;

volatile static uint8_t  chan = 0;
volatile uint16_t temp = 0;

temp = ICR3 / 2;
TCNT3 = 0;

sei();

if (temp > 3000)
   chan = 0;

if (temp >= 800 && temp <= 2200)
   RC_Values[chan] = temp;

chan++;

SREG = oldSREG;
}

j'ai bien la solution de ne pas backup le SREG  smiley-mr-green Mais je ne peux pas me permettre de foirer un seul calcul après donc je préfère trouver une solution adaptée smiley

Quelqu'un saurait pourquoi cela fonctionne mal ?

Merci d'avance !
35  International / Français / Re: Interruption pendant une communication UART / I2C on: November 20, 2013, 11:25:10 am
Wahou merci pour toutes ces réponses smiley

Il semblerait que toutes mes lanternes soient éclairées !

encore merci !
36  International / Français / [RESOLU] Interruption pendant une communication UART / I2C on: November 20, 2013, 10:31:17 am
Bonjour à tous,

J'aimerais savoir ce qu'il se passe quand une interruption survient pendant qu'un byte est envoyé ou reçu, est-ce que ça change quelque chose ? ça fait planter la communication ? pour l'I2C c'est pareil ?
Et si on traite pas directement un byte reçu, est-ce qu'on le perd au bout d'un moment ? y a t-il une sorte de zone de stockage ou on pourrait mettre en attente quelques bytes reçu si on a pas le temps de les traiter instantanément ?

Voilà toutes les questions qui me chiffonne et qui m'empêche de continuer mon projet ^^

Merci !
37  International / Français / Re: [RESOLU] Input capture non fonctionnelle sur ATmega32u4 on: November 18, 2013, 02:00:45 am
C'est possible, mais c'est pas normal, d'après le datasheet ce registre a une valeur initiale de 0 ce qui veut dire que le port est configuré en entré au démarrage. Néanmoins il est possible que je me trompe sur ce point...
38  International / Français / Re: Input capture non fonctionnelle sur ATmega32u4 on: November 17, 2013, 10:44:10 am
Je me suis penché sur le côté électrique de la chose...
J'avais toujours mon ppm sur la broche ICP3, mais le calibre vertical de mon oscillo m'a mis la puce à l'oreille : Chute de tension !
Donc le µC ne voit plus de front montant, le seuil niveau haut n'est plus atteint.. Pourtant je pensais avoir la broche en entré, le registre DDRC est censé être initialisé à 0 d'après la doc. Ca ne devait pas être le cas, ou alors il y avait un autre probleme, je n'en sait à vrai dire strictement rien. Néanmoins j'ai forcé manuellement le bit à 0.
Code:
DDRC  &= ~0x80;
Depuis tout fonctionne  smiley Si quelqu'un avait éventuellement une explication je suis preneur  smiley-lol

39  International / Français / Re: Input capture non fonctionnelle sur ATmega32u4 on: November 17, 2013, 09:00:29 am
le code présent dans le premier message fonctionne parfaitement sur une Arduino Uno (µC = ATmega328p) mais refuse de lever les interruptions sur la leornardo (µC = ATmega32u4). J'ai essayé le mode 4 tout à l'heure et le 0 de suite et ça ne change rien.
40  International / Français / Re: Input capture non fonctionnelle sur ATmega32u4 on: November 17, 2013, 07:24:49 am
Je définie le top parce que sinon ça ne servirait pas à grand chose... Là il est définie de manière à repousser la zone de descente à un endroit temporellement inaccessible par le système en amont.

Effectivement le mode CTC pourrait marcher aussi. Mais pour le moment ça ne va strictement rien changer parce que là routine d'interruption ne s'exécute pas. Ce qui veut dire qu'aucune interruption n'est levée, alors qu'à l'oscilloscope j'ai bien tous mes fronts de visible.

Pour ma part je n'utilise pas du tout Arduino à part la carte sur laquelle le µC est câblé. Donc j'ai l'initialisation basique des registres comme précisé dans la doc. Le seul registre que je ne touche pas c'est le TCCR3B et sert uniquement à forcer des comparaisons.
41  International / Français / Re: Input capture non fonctionnelle sur ATmega32u4 on: November 17, 2013, 05:11:24 am
Bonjour

Pour les variables ça a toujours marché chez moi, mais je ferais la modification.
Le phase correct est le seul mode que je peux utiliser où j'ai le droit de définir le top que je veux et pour pallier au problème de monter et descente je remet le compteur à zéro à chaque capture. Avec le signal que j'ai, il est impossible que TCNT passe dans la phase de descente.

Le problème ici, c'est que l'interruption ne se lève jamais.
42  International / Français / [RESOLU] Input capture non fonctionnelle sur ATmega32u4 on: November 16, 2013, 07:50:48 pm
Bonsoir à tous et à toutes !

Pour mon projet sur arduino leonardo programmé sur avr Studio, j'ai besoin de récupérer le temps entre chaque front montant sur un signal ppm de ce genre:
http://www.pabr.org/pxarc/1.1/doc/opwm_ppm.gif
Pour une question d'encombrement, je suis contraint d'utiliser l'input capture sur la broche ICP3 de l'atmega32u4.
Jusque là pas de problème, je code un petit programme de test pour vérifier premièrement que tout fonctionne bien seul, avant d'intégrer le tout dans le programme final.
Code:
/*
 * GccApplication1.cpp
 *
 * Created: 14/11/2013 16:46:50
 *  Author: Procrastineur
 */
#define F_CPU 16000000UL
#define UBRRVAL1 8
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

volatile uint32_t Micros = 0;
volatile uint16_t RC_Values[6] = {0};

void transmit_data(uint8_t data)
{
/* Wait for empty transmit buffer */
while ( !( UCSR1A & (1<<UDRE1)) );

/* Put data into buffer, sends the data */
UDR1 = data;
}

ISR(TIMER3_CAPT_vect)
{
PORTD |= 0x10;
volatile static uint8_t chan  = 0;
volatile        uint16_t temp = 0;

temp  = ICR3;
temp /= 2;
TCNT3 = 0;

sei();

if (temp > 3000)
chan = 0;

if (temp >= 800 && temp <= 2200)
RC_Values[chan] = temp;

chan++;
PORTD &= ~0x10;
}

int main(void)
{
//désactivation du module usb qui sature le µC
PRR1  |= 0x80;

// initialisation UART
DDRD  |= 0x18;
UBRR1H = (UBRRVAL1>>8); //high byte
UBRR1L = (uint8_t)UBRRVAL1; //low byte

UCSR1C = (1<<UCSZ11) | (1<<UCSZ10); //Set data frame format: asynchronous mode,no parity, 1 stop bit, 8 bit size
UCSR1B = (1<<RXEN1 ) | (1<<TXEN1 ); //Enable Transmitter and Receiver

// initialisation timer3
TCCR3A = 1<<WGM31 | 1<<WGM30;
TCCR3B = 1<<ICES3 | 1<<WGM33 | 1<<CS31;
OCR3A  = 32000;
TIMSK3 = 1<<ICIE3;
TIFR3  = 1<<ICF3;

sei();

while(1)
        {
            transmit_data(RC_Values[1]>>8);
            transmit_data(RC_Values[1]);
            transmit_data(0x0D);

   _delay_ms(500);
        }
}
Mauvaise nouvelle ça ne fonctionne pas... J'ai un beau triturer le pauvre morceau de code bidon dans tous les sens je n'arrive à rien... J'avais sous la main une Arduino Uno, donc j'ai adapté le nom des registres et j'ai tout envoyé dessus. Miracle tout fonctionne à merveille   smiley-eek
Pour information : PORTD pin 4 (Digital 4) ne passe jamais à "1" sur la leonardo.

C'est la raison pour laquelle je me tourne vers vous tous, je suis incapable d'expliquer pourquoi cela fonctionne d'un côté et non de l'autre  smiley-cry

Merci d'avance !
43  International / Français / Re: Interruption Timer0 Overflow inopérante on: November 15, 2013, 03:58:42 am
Bonjour à tous et merci de vos réponses !

Effectivement je me suis planté en beauté sur le mode  smiley-sweat
Tu as bien raison, je vais utiliser des mots plus parlant maintenant !
Le coup du drapeau je ne connaissais pas... Merci du tuyau, je vais lire ce pdf là !

Merci encore à tous !
44  International / Français / Re: Interruption Timer0 Overflow inopérante on: November 14, 2013, 04:51:50 pm
Salut !

SREG |= 0x80 revient au même que sei() en fait ^^
45  International / Français / [RESOLU] Interruption Timer0 Overflow inopérante on: November 14, 2013, 03:40:54 pm
Bonsoir mesdames messieurs,

J'ai un problème tout bête que je n'arrive pas à solutionner, j'ai besoin d'utiliser une interruption sur overflow du timer0 avec une carte Arduino Leonardo. Je dev sur Avr Studio.
Code:
/*
 * GccApplication1.cpp
 *
 * Created: 14/11/2013 16:46:50
 *  Author: Procrastineur
 */

#include <avr/io.h>
#include <avr/interrupt.h>

volatile uint32_t Micros = 0;

ISR(TIMER0_OVF_vect)
{
PORTD |= 0x10;

volatile static uint8_t Ticks = 0;

Ticks++;

if (Ticks == 16)
{
Micros++;
Ticks = 0;
}
}

int main(void)
{
DDRD |= 0b10011000;
TCCR0A = 0x02;
TCCR0B = 0x09;
OCR0A  = 16;
TIMSK0 = 0x01;

SREG |= 0x80;
    
while(1)
        {
              //TODO:: Please write your application code
        }
}

Rien à faire j'ai tout essayé ça ne fonctionne pas, il n'y a jamais aucune interruption dans mon programme, PD4 ne passe jamais à 1...
Quelqu'un saurait pourquoi ?

Merci d'avance à vous tous smiley
Pages: 1 2 [3] 4 5 ... 7