Hallo AVR-Praxis Mitglieder,
ich hab probleme mit den Atmega644 ich schreib in AVR-studio 5 ein programm das folgenes machen soll
ueber den A-kanal eines optischen impulsgeber ( WEDL5541-A06) soll die fallende Flanke im interrupt ein Variable hochzaehlen
das ganze ist an ein motor geschraubt.
Der motor ist an einer H-Brücke am ATmega644 angeschlossen so wie der impulsgeber. den motor kann ich mit zwei taster bedienen.
Der Atmega644 soll jetzt die impulse zählen und mir über ein lcd-display anzeigen so das ich sie dann weiter verarbeiten kann ( abspeichern und spaeter soll der die positionen selber anfahren ).
er zählt zwar was aber nur müll hab es so programmiert das er über ein externe interuppt aktiviert wird und dann nachschaut ob der b-kanal auf high ist wenn ja soll er die variable hochzählen wenn sie auf low ist soll sie runterzählen.ich weis jetztnicht ob ich den eicra richtig eingestellt habe er soll auf fallende flanke ansprechen.
wäre nett wenn einer mir helfen könnte. BITTE
schon mal danke im voraus
Gruß
madkai
ich hab probleme mit den Atmega644 ich schreib in AVR-studio 5 ein programm das folgenes machen soll
ueber den A-kanal eines optischen impulsgeber ( WEDL5541-A06) soll die fallende Flanke im interrupt ein Variable hochzaehlen
das ganze ist an ein motor geschraubt.
Der motor ist an einer H-Brücke am ATmega644 angeschlossen so wie der impulsgeber. den motor kann ich mit zwei taster bedienen.
Der Atmega644 soll jetzt die impulse zählen und mir über ein lcd-display anzeigen so das ich sie dann weiter verarbeiten kann ( abspeichern und spaeter soll der die positionen selber anfahren ).
er zählt zwar was aber nur müll hab es so programmiert das er über ein externe interuppt aktiviert wird und dann nachschaut ob der b-kanal auf high ist wenn ja soll er die variable hochzählen wenn sie auf low ist soll sie runterzählen.ich weis jetztnicht ob ich den eicra richtig eingestellt habe er soll auf fallende flanke ansprechen.
wäre nett wenn einer mir helfen könnte. BITTE
schon mal danke im voraus
Gruß
madkai
Code:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
volatile unsigned int enc_delta_H = 0;
#include <avr/io.h>
#define F_CPU 8000000UL
#include <util/delay.h>
#include <lcd/lcd-routines-porta.h>
#include <lcd/lcd-routines.c>
#include <avr/signal.h>
#include <avr/interrupt.h>
//////////////////////////////////////////////////////
#define T_Kanal_A_H PD2
#define T_Kanal_A_H_DDR DDRD
#define T_Kanal_A_H_PIN PIND
#define T_Kanal_A_H_PORT PORTD
#define T_Kanal_B_H PD1
#define T_Kanal_B_H_DDR DDRD
#define T_Kanal_B_H_PIN PIND
#define T_Kanal_B_H_PORT PORTD
#define PHASE_A_H (T_Kanal_A_H_PIN & 1<<T_Kanal_A_H)
#define PHASE_B_H (T_Kanal_B_H_PIN & 1<<T_Kanal_B_H)
///////////////////////////////////////////////////
ISR(INT0_vect)
{
if (!(PHASE_B_H >= 1))
{
enc_delta_H++;
}
else
{
enc_delta_H--;
}
}
///////////////////////////////////////////////////////////
int main(void)
{
lcd_init();
char buffer[16];
T_Kanal_A_H_PORT |= (1<<T_Kanal_A_H); // Taster interrup eingeschaltet
T_Kanal_B_H_PORT |= (1<<T_Kanal_B_H); // Taster interrup eingeschaltet
EICRA |=(1<<ISC01); // Fallenden Flanke aktivieren
EIMSK |= (1<< INT0); // INT0 aktivieren
sei();
while(1)
{
cli();
lcd_clear();
lcd_setcursor(0,1);
sprintf(buffer,"PHASE_A_V=%d",enc_delta_H);
lcd_string(buffer);
_delay_ms(100);
sei();
}
}