Atmega644 problem, Hilfe BITTE

madkai

Neues Mitglied
02. Juli 2012
2
0
0
Sprachen
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

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();
        }
    
}
 
Hallo madkai!

Meldet der Compiler warnings?

Es fehlt:
#include <stdio.h>


Du aktivierst den Pullup-Widerstand des Portpins, an dem der optische Sensor angeschlossen ist. Es kann sein, dass das so in Ordnung ist, ich habe mir den Sensor nicht angesehen.

In der while(1) Schleife deaktivierst du für mindestens 100ms global die Interrupts. In der Pausezeit wird nicht gezählt, es können hier also Signale vom Sensor verloren gehen.
Am besten du erstellst dir in main() eine Hilfsvariable unsigned int variable, diese nimmt den aktuellen Wert von enc_delta_H auf. Die Pause entfernst du.
Gut wäre es auch, wenn du vor der Ausgabe auf dem LCD prüfst, ob überhaupt ausgegeben werden muss. Du musst nicht ausgeben, wenn bereits schon einmal ausgegeben wurde und sich die Zahl nicht geändert hat.
Code:
while(1)
{

  cli();
  variable = enc_delta_H;
  sei();

  ;variable ausgeben, wenn notwendig.
}



Hier würde ich noch Klammern einfügen:
#define PHASE_A_H (T_Kanal_A_H_PIN & (1<<T_Kanal_A_H))

Ansonsten sehe ich keine Fehler.

Gruß,
Dirk
 
Hallo Dirk,

vielen lieben Dank fuer die Hilfe, manchmal hat man Tomaten auf den Augen. :eek:
Der Tip mit der Hilfsvariablen ist gut und mit den Klammern uebersieht man schnell.
Der Quellcode mit der Ausgabe an das LCD war nur zur Ueberpruefung, ob der Interrupt die fallende Flanke
vom Drehwinkelgeber erkennt und sollte es zur Ausgabe geben.
Da war das Problem mit dem Delay, ich habe es nun mal auf 2ms reduziert und nun erkennt er fast alle Werte.
Die Ausgabe an das LCD ist im Hauptprogramm nicht mehr vorhanden und somit ist die Funktiontuechtigkeit gegeben.

Vielen Dank nochmals.

Neue Probleme kommen bestimmt. :)

liebe Gruesse

madkai
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)