Hallo Community,
bin blutiger Anfänger was das Programmieren von Microcontrollern angeht und hoffe auf eure Hilfe. Mein Quellcode funktioniert leider nicht so wie er sollte.
Es geht darum, eine positive Flanke auf einem Mikrocontroller einzulesen und einen Zähler bei jeder positiven Flanke zu erhöhen. Das sollte eigentlich ja nicht allzu schwer sein. Leider bin ich am verzweifeln und finde meine Fehler im Programm nicht.
Hintergrund ist die Signalumsetzung von einer externen GRBL-Steuerung (XYZ) für Schrittmotoren. Die Steuerung gibt pro Achse jeweils ein Drehrichtungssignal und ein Schrittsignal aus. Diese Signale müssen für den Schrittmotorentreiber ULN2003 gewandelt werden (Patternausgabe).
Bisher will ich mich noch nicht auf die Drehrichtung konzentrieren. Dies ist sollte dann nur noch eine kleine Erweiterung des dann fertigen Quellcodes sein.
Der verwendete Controller ist ein ATtiny48-PU.
Die Programmierung ist teilweise untypisch programmiert. Bitte seht mir dies nach.
Der Programmcode ist unten beigefügt. Programmiert wird mit Atmel Studio.
Ich hoffe auf eure Unterstützung und Hinweise.
Viele Grüße kleiner_kaktus
Main.cpp:
/*
* PE.cpp
*
* Created: 20.02.2020 01:13:05
* Author : Jan
*/
#include <avr/io.h>
#include <util/delay.h>
#include "ULN2003_Driver.h"
// +++++++++++++++++++++++++++++++++++++++++++++++++++ DEFINITIONS +++++++++++++++++++++++++++++++++++++++++++++++++++
//Frequency CPU
# define F_CPU 16.000;
// Verzögerung
//#define delay _delay_ms(100)
//Setzen und Rücksetzen von Ausgängen
/*
#define XI2_On PORTB |= (1<<PORTB1)
#define XI2_Off PORTB &= ~(1<<PORTB1)
#define XI3_On PORTB |= (1<<PORTB2)
#define XI3_Off PORTB &= ~(1<<PORTB2)
#define XI4_On PORTB |= (1<<PORTB3)
#define XI4_Off PORTB &= ~(1<<PORTB3)
*/
int main(void)
{
// +++++++++++++++++++++++++++++++++++++++++++++++++++ SETUP +++++++++++++++++++++++++++++++++++++++++++++++++++
initPortsDataDirection();
// +++++++++++++++++++++++++++++++++++++++++++ Variablendeklaration +++++++++++++++++++++++++++++++++++++++++++
//X-Achse
bool bXFlankenmerker = false;
bool bXDI_Signal = false;
bool bXDir = false;
//Zähler für Schritte
uint8_t iCountX = 1; //Zählvariable
uint8_t iCountMax = 8; //Maximalwert Zähler
// +++++++++++++++++++++++++++++++++++++++++++++++++++ LOOP +++++++++++++++++++++++++++++++++++++++++++++++++++
while (1)
{
// ++++++++++++++++++++++++++++++++++++++++++++ X-Achse +++++++++++++++++++++++++++++++++++++++++++++++++++++++
// >>>>>>>>>>>>> X-Step einlesen (Flanke X)
bXDI_Signal = (PINB & (1<<PINB5));
if ((bXDI_Signal == true) && (bXFlankenmerker == false))
{
iCountX++;
bXFlankenmerker = true;
}
else if (bXDI_Signal == false)
{
bXFlankenmerker = false;
}
//Grenzen Zähler festlegen
if (iCountX > iCountMax)
{
iCountX = 1;
}
if (iCountX <=0)
{
iCountX = 1;
}
// Zustände
switch (iCountX)
{
case 1: XI1_On(); XI2_Off(); XI3_Off(); XI4_Off(); break; //1000
case 2: XI1_On(); XI2_On(); XI3_Off(); XI4_Off(); break; //1100
case 3: XI1_Off(); XI2_On(); XI3_Off(); XI4_Off(); break; //0100
case 4: XI1_Off(); XI2_On(); XI3_On(); XI4_Off(); break; //0110
case 5: XI1_Off(); XI2_Off(); XI3_On(); XI4_Off(); break; //0010
case 6: XI1_Off(); XI2_Off(); XI3_On(); XI4_On(); break; //0011
case 7: XI1_Off(); XI2_Off(); XI3_Off(); XI4_On(); break; //0001
case 8: XI1_On(); XI2_Off(); XI3_Off(); XI4_On(); break; //1001
default: XI1_Off(); XI2_Off(); XI3_Off(); XI4_Off(); break; //0000
}
}
}
ULN2003_Driver.h
/*
* ULN2003_Driver.h
*
* Created: 29.02.2020 10:00:20
* Author: Jan
*/
#ifndef ULN2003_DRIVER_H_
#define ULN2003_DRIVER_H_
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DataDirectionsRegister setzen ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void initPortsDataDirection()
{
// Ein-/ Ausgänge definieren --> Data Direction Register (1 - Ausgang, 0-Eingang)
//DDRB = 0b00001111;
//DDRC = 0b00001111;
//DDRD = 0b00001111;
// OUTPUTS B
DDRB |= (1<<DDB0);
DDRB |= (1<<DDB1);
DDRB |= (1<<DDB2);
DDRB |= (1<<DDB3);
//INPUTS B
DDRB &= ~(1<<DDB4);
DDRB &= ~(1<<DDB5);
}
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Funktionen X-Achse ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Ausgänge IN 1 bis IN4
void XI1_On(){PORTB |= (1<<PORTB0);}
void XI1_Off(){PORTB &= ~(1<<PORTB0);}
void XI2_On(){PORTB |= (1<<PORTB1);}
void XI2_Off(){PORTB &= ~(1<<PORTB1);}
void XI3_On(){PORTB |= (1<<PORTB2);}
void XI3_Off(){PORTB &= ~(1<<PORTB2);}
void XI4_On(){PORTB |= (1<<PORTB3);}
void XI4_Off(){PORTB &= ~(1<<PORTB3);}
#endif /* ULN2003_DRIVER_H_ */