AVR-GCC, /var/folders/cl/5yhhp7cn4yq873qgvp307ttw0000gn/T//cctmsaTL.s:32: Error: constant value required

j'ai cette erreur je sais pas. comment la resoudre

Le problème exposé dans ce sujet a été résolu.

Bonjour, j’ai depuis 1 heure la même erreur que j’essaie de la résoudre , je suis en train de faire un projet en C et en ASM de remplacer l’Arduino par ma propre librairie mais à peine commence j’ai cette erreur :

avr-gcc -g -Wall -mcall-prologues -mmcu=atmega328P -Os main.c pins.c -Wl,-gc-sections -Wl,-relax -o main.obj
/var/folders/cl/5yhhp7cn4yq873qgvp307ttw0000gn/T//cctmsaTL.s: Assembler messages:
/var/folders/cl/5yhhp7cn4yq873qgvp307ttw0000gn/T//cctmsaTL.s:32: Error: constant value required
/var/folders/cl/5yhhp7cn4yq873qgvp307ttw0000gn/T//cctmsaTL.s:61: Error: constant value required
/var/folders/cl/5yhhp7cn4yq873qgvp307ttw0000gn/T//cctmsaTL.s:70: Error: constant value required
make: *** [main.obj] Error 1
rm main.o

pour l’instant j’ai 3 fichier : pins.h, pins.c, et main.c

pins.h :




#ifndef LAGOS_PINS_H
#define LAGOS_PINS_H
#define uint8_t unsigned char

#define PB 0x05
#define PC 0x08
#define PD 0x0B

typedef struct PinUnoR3 {
    uint8_t port;
    uint8_t pin;
} PinUnoR3;

PinUnoR3 initPin(uint8_t port, uint8_t pin);

void digitalWrite(PinUnoR3 pin, uint8_t value);


#endif //LAGOS_PINS_H

pins.c :



#include "pins.h"

PinUnoR3 initPin(uint8_t port, uint8_t pin) {
    PinUnoR3 pinUnoR3;
    pinUnoR3.port = port;
    pinUnoR3.pin = pin;
    asm volatile ("sbi %0, %1"
            :  "=r" (port)
            :  "0" (pin)
            ); // Set pin to output
    return pinUnoR3;
}

void digitalWrite(PinUnoR3 pin, uint8_t value) {
    if (value == 0) {
        asm volatile ("cbi %0, %1"
        :  "=r" (pin.port)
        :  "0" (pin.pin)
        ); // turn off LED by setting pin to low
    } else {
        asm volatile ("sbi %0, %1"
                :  "=r" (pin.port)
                :  "0" (pin.pin)
                ); // turn off LED by setting pin to high
    }
}

et main.c


#include <stdint.h>
#include "pins.h"
#define F_CPU 16000000UL
#define asm __asm__

void
delay_ms(double ms)
{
    double tmp ;
    uint16_t ticks;
    tmp = ((F_CPU) / 4000) * ms;
    if (tmp < 1.0)
        ticks = 1;
    else if (tmp > 65535)
    {

        //    ticks = requested delay in 1/10 ms
        ticks = (uint16_t) (ms * 10.0);
        while(ticks)
        {
            uint16_t d = ((F_CPU) / 4000) / 10;
            // wait 1/10 ms
            __asm__ volatile (
                    "1: sbiw %0,1" "\n\t"
                    "brne 1b"
                    : "=w" (d)
                    : "0" (d)
                    );
            ticks --;
        }
        return;
    }
    else
        ticks = (uint16_t)tmp;
    asm volatile (
            "1: sbiw %0,1" "\n\t"
            "brne 1b"
            : "=w" (ticks)
            : "0" (ticks)
            );
}

int main()
{

    PinUnoR3 pin = initPin(PB, 3);
    while(1)
    {
        digitalWrite(pin, 1);
        delay_ms(500);
        digitalWrite(pin, 0);
        delay_ms(500);
    }
}

si quelqu’un peut m’aider ce serait sympa

+0 -0

Je pense que l’idéal serait de jeter un coup d’œil à l’ASM produit. Essaye de remplacer -o main.obj par -S -o main.s et poste le contenu de main.s

Il y a de grande chance que cela vienne des lignes d’assembleur que tu as toi même injecté.

+1 -0

J’ai trouvé : ici et dans plein d’autre endroit du fichier :

asm volatile ("sbi %0, %1"
            :  "=r" (port)
            :  "0" (pin)
            ); 

sbi (et cbi) prend un registre puis une valeur constante or le "0" (pin) donne un registre voila problème règle

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte