Estoy usando atmega32 para hacer un proyecto de puerta de ferrocarril automática. Escribí el código, pero tengo un problema con eso ¿no me da la salida requerida? [cerrado]

-3

Tengo un proyecto escolar "sistema ferroviario automático", Escribí el código pero funciona solo en protues. cuando lo quemo en el kit no funciona. ¿Qué está mal con este código?

"mi idea del proyecto es hacer un control de la puerta del tren ferroviario.

1: cuando el tren se acerca, haga que el zumbador se encienda con 90 segundos de cuenta atrás en 7 seg. luego abre la puerta.

2 - después de que el tren salga de la estación, cierre la puerta & el timbre Estoy usando 2 interruptores de límite uno para abrir la compuerta & La otra para cerrarla.  y un motor de corriente continua para mover la puerta entre la posición 0 y amp; posición 90. "

pero estoy enfrentando un error en el archivo seven_seg.c: expresión esperada antes de '=' token en esta línea

  

PORTB = PORTB | BUZZER;

Intenté hacer esto para ver qué sucede si hago que //PORTB=PORTB|BUZZER; todavía aparezca el mismo error, pero en esta línea en el archivo railway_control.c

if((PINA & SWITCH1)==0b00000000)
PORTB=PORTB | MOTORR;
PORTB=PORTB & ~ BUZZER;
PORTB=PORTB & ~ MOTORR;
else if((PINA & SWITCH2)==0b00000000)
PORTB=PORTB & ~ MOTORL;

¿Qué identificadores faltan antes de '='?

aquí está el código después de que lo edité

#include"avr/io.h"
#define F_CPU 16000000
#include"avr/delay.h"
#include"types.h"
#include"seven_seg.h"



void main (void)
{
  DDRA=0b00000000;// define switches as input
  PORTA=0b00000011;
  DDRB=0b00000111;//define motor & buzzer as output
  DDRD=0b11111111;/* using port d &port c for 7-seg*/
  DDRC=0b11111111;
while (1)
{
    if((PINA&SWITCH1)==0b00000000)
    {
        display();
        PORTB=PORTB|MOTORR;
        _delay_ms(3000);
        PORTB=PORTB & ~ BUZZER;
        PORTB=PORTB&~MOTORR;
        _delay_ms(300);
    }
    else if((PINA&SWITCH2)==0b00000000)
    {

        PORTB=PORTB|MOTORL;
        _delay_ms(3000);
        PORTB=PORTB &~ MOTORL;
        _delay_ms(300);
    }
    else
    {
        //Do Nothing
    }

  }
}

el archivo seven_seg.c

#include"avr\io.h"
#include"types.h"
#include"avr/delay.h"
s8 i,j;
s8 arr[10]={0b00111111,0b00000110,0b01011001,
    0b01001111,0b01101100,0b01101101,0b01111101,
    0b00000111,0b01111111,0b01101111};
void display(void)
    {
        PORTC=arr[9];
        PORTD= arr[0];

        PORTB=PORTB|BUZZER;
        for(i=8;i>=0;i--)
        {
            PORTC=arr[i];
            for(j=9;j>=0;j--)
            {
                PORTD=arr[j];
            _delay_ms(100);
            }
        }
    }

tipos.h archivo

typedef unsigned char u8;
typedef unsigned short int u16;
typedef unsigned long int u32;
typedef signed char s8;
typedef signed short int s16;
typedef signed long int s32;
typedef float f32;
typedef double f64; 
#define BUZZER=0b00000100;
#define MOTORR=0b00000001;
#define MOTORL=0b00000010;
#define SWITCH1=0b00000001;
#define SWITCH2=0b00000010;

archivo seven_seg.h

#ifndef seven_SEG_H_
#define seven_SEG_H_

void display(void);

#endif /* seven_SEG_H_ */
    
pregunta Sara Gero

2 respuestas

5
  

cuando lo quemo en el kit no funciona.

     

¿Qué está mal con este código?

¿Quién sabe? Podría ser cualquier cosa. No nos has dicho cómo sabes que no funciona. Pero eso no es relevante, les diré por qué. No diré su código particular en mi respuesta más que esto: es demasiado grande.

Me parece que este es tu primer proyecto probado en hardware real. Para que esto funcione lo más rápido posible, debe eliminar todo lo que contiene su código y comenzar con el código más pequeño que pueda depurar: el LED parpadea. Este es el ¡Hola, mundo! del mundo integrado.

Su único objetivo es obtener un solo pin, o cada pin en un puerto completo, para alternar repetidamente. La velocidad no importa si tienes un osciloscopio. Si ni siquiera puede hacer que ese funcione, entonces su problema es aún más fácil, porque no tiene toda la lógica de flujo de control en que pensar.

Una vez que haya cambiado de pin, puede comenzar a agregar funcionalidades con cuidado, al mismo tiempo que verifica que cada cambio hace lo que usted planeó.

    
respondido por el pipe
1
  1. Aquí hay un paréntesis derecho adicional: - if ((PINA&0b00000001)==0b00000000))

  2. cuando se presiona el interruptor, se muestra la cuenta regresiva de 90 segundos y luego cierra la puerta. Supongo que quieres cerrar la puerta primero , luego hacer display().

  3. Solo enciende y apaga el motor durante 3 ms. ¿Es este tiempo suficiente para que se mueva?

  4. Parece que tiene dos interruptores, uno cierra la puerta cuando se presiona y el otro lo abre cuando no . Sin embargo, los comentarios solo dicen 'si se presiona el interruptor ' y 'si el interruptor no está presionado', sin indicación de que en realidad haya dos interruptores separados. Entonces, ¿cuál es, uno o dos interruptores?

El primer paso para depurar el código es escribirlo de una manera que sea fácil de entender. Use nombres simbólicos en lugar de números "mágicos", por ejemplo. en lugar de PORTB=PORTB&0b11111011; do: -

#define BUZZER = 0b00000100; 
...
PORTB=PORTB&~BUZZER;

Ahora, cuando observa su código, puede ver lo que está haciendo sin tener que leer los comentarios, y como el símbolo se define solo una vez al principio, es más difícil cometer errores tontos (como cambiar una función de alfiler y olvidarse de edite cada instancia de la misma, o escriba un número binario incorrectamente.)

Los comentarios deben explicar con claridad y precisión lo que hace el código, no solo repetirlo. // if the switch isn't pressed no te dice qué interruptor se presiona, o cuál es su función. Si cambia el código, debe revisar los comentarios para asegurarse de que sigan siendo relevantes (otra razón para hacer que su código se "auto-documente" usando nombres simbólicos apropiados).

Si unas pocas palabras no son suficientes para describir el circuito, ¡dibuja una! El código puede ser perfecto, pero aún así no funcionará si el hardware no coincide. Verifique todo su cableado para asegurarse de que las cosas estén conectadas a los pines correctos de la MCU. Luego use un multímetro para verificar las señales de entrada y salida.

    
respondido por el Bruce Abbott

Lea otras preguntas en las etiquetas