Schalter

mktrspalte

Neues Mitglied
20. Mai 2008
30
0
0
Sprachen
Hallo
iIch will über den PC5 einen Schalter abfragen woraufhin PortD Pin 2 auf high schaltet und mein schrittmotor dreht.Hier einmal der Code mit dem ich es probiert habe , es aber Schalter funktionirt nicht .Hoffe ihr könnt mir weiterhelfen.
HTML:
#include <avr\io.h>
#include <inttypes.h>
#include <avr\interrupt.h>
#include <util/delay.h>

volatile int y=0;	//Schrittanzahl
void InitPorts()
{
 	DDRD =0b00000100 ;   //	PD2 Takt Signal

}
/*  Funktion zum Entprellen eines Tasters */
inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
{
    if ( ! (*port & (1 << pin)) )
    {
        
        _delay_ms(50);  
        _delay_ms(50); 
        if ( *port & (1 << pin) )
        {
            
            _delay_ms(50);
            _delay_ms(50); 
            return 1;
        }
    }
    return 0;

}
void InitTimer2(void)		//timer initialisierung
{
	
	TIFR2  =0b00000010;		// Interrupt Request loeschen (sicherheitshalber)
	TIMSK2 =0b00000010;		// Enable Output Compare A Interrupt
	TCCR2A =0b01000010;		
	TCCR2B =0b00000101;		// Prescaler 1024, CTC Mode 4, Timer1 Start
	OCR2A  =900;			// Frequenz=10 hz
	TCNT2 =0;			
}

ISR (TIMER2_COMPA_vect)
{			
		y++;
	
  		if (y<220000)
		{
			PORTD^= (1<<PD2);
		}

		if (y==220000)
		{
			TCCR2A =0b00000000;		
			TCCR2B =0b00000000;
			y = 0;
		}
	
}
int main()
{
sei();
InitPorts();
InitTimer2();

    DDRC &= ~( 1 << PC5 );                 /* PIN PC5 auf Eingang (Taster)            */ 
    PORTC |= ( 1 << PC5 );                 /* Pullup-Widerstand aktivieren            */ 
    
    if (debounce(&PINC,PC5))             /* Falls Taster an PIN PC5 gedrueckt..    */ 
        PORTD ^= ( 1<<PD2 );  			/* . Port PD2 Takt */
                                 		  
	else

  	 PORTD &=~ (1<< PD2); 

do{}
while(1);

}
 
Hallo,

du hast die do-while Schleife hinter deine Tastenabfrage gesetzt, die Taste wird nur einmalig nach Reset abgefragt.


Gruss,
Dirk
 
Sind die Code korrekt?..wenn ich do Schleife oben Tastenabgrage gesetzt,dann nichts passiert?Vielleicht Programm ist falsch?
 
Hallo,

ich glaube da ist ein Fehler in der Routine debounce:


Code:
inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
{
    if ( ! (*port & (1 << pin)) )
    {
        
        _delay_ms(50);  
        _delay_ms(50); 
        if ([COLOR=DarkRed][B]!( [/B][/COLOR]*port & (1 << pin)[B][COLOR=DarkRed])[/COLOR][/B] )
        {
            
            _delay_ms(50);
            _delay_ms(50); 
            return 1;
        }
    }
    return 0;
}
In main() muss die if-Abfrage in eine Endlosschleife!
In der ISR änderst du den Zustand von PD2.

Wird die Taste betätigt, wird PD2 getoggelt, die Frequenz wird hauptsächlich durch die Pausen in der Routine debounce bestimmt.

Gruss,
Dirk
 
Hallo Dirk
Timer2 funktioniert nicht richtig:(
Also die Register Einstellungen ist falsch.Ich möchte 1 sn Interrupt auslösen.Aber die Periode des Signals 5ms:(
Code:
#include <avr\io.h>
#include <inttypes.h>
#include <avr\interrupt.h>
#include <util/delay.h>

volatile int y=0;	//Schrittanzahl
		
void InitPorts()
{
 	DDRD =0b00000100 ;   //	PD2 Takt Signal

}


void InitTimer2(void)		//timer initialisierung
{
	
	TIFR2  =0b00000010;		// Interrupt Request loeschen 
	TIMSK2 =0b00000010;		// Enable Output Compare A Interrupt
	TCCR2A =0b01000010;		
	TCCR2B =0b00000110;		// Prescaler 256
	OCR2A =36000;			// Frequenz=1hz
	TCNT2 =0;			
}

ISR (TIMER2_COMPA_vect)
{	
		y++;
	
  		if (y<220000)
		{
			PORTD^= (1<<PD2);
		}

		else if (y==220000)
		{
			TCCR2A =0b00000000;		
			TCCR2B =0b00000000;
			y = 0;
	}	
	}
int main()
{

sei();
InitPorts();
InitTimer2();
do{}
while(1);

}
 
Hallo,

ich vermute du nutzt den ATmega88, den Mikrocontroller hattest du auch in dem anderen Thread verwendet.

Timer2 ist bei ATmega88 als 8bit-Timer ausgelegt, du kannst also nicht einen 16bit-Wert in das Register OCR2A laden.

Code:
OCR2A = 36000;  [COLOR=SeaGreen]// geht hier nicht![/COLOR]
Gruss,
Dirk
 
ohhh jaaa....ich hab gesehen..ich habe erstmal Timer1 eingestellt..dann habe ich nicht bemerkt...
Entschuldigen:)
 

Ü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)