Du musst ja jetzt auch das Gate an Minuspol legen, damit der FET leitet.Crafty-Catcher hat geschrieben: dann bleiben die LEDs schonmal aus
leider auch wenn ich von Pin 3 dann über nen R 150 Ohm an Pin 1 gehe
Alles genau umgekehrt, wie bei N-Channel
Moderator: T.Hoffmann

Du musst ja jetzt auch das Gate an Minuspol legen, damit der FET leitet.Crafty-Catcher hat geschrieben: dann bleiben die LEDs schonmal aus
leider auch wenn ich von Pin 3 dann über nen R 150 Ohm an Pin 1 gehe



Code: Alles auswählen
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>
volatile unsigned int Tick; // 100KHz pulse
volatile unsigned int sPulse; // Servo pulse variable
volatile unsigned int Tick_20ms; // Servo frame variable
volatile unsigned int Status; //An oder Aus
volatile unsigned int Action; //Servo schalten
/* Crafty-Catchers C Tagebuch
* x |= (1 << Bitnummer); // Hiermit wird ein Bit in x gesetzt
* x &= ~(1 << Bitnummer); // Hiermit wird ein Bit in x geloescht
*/
int main (void)
{
sei(); // Enable global interrupts
//DDRB = 0x00; // Alle Pins als Ausgang
DDRB |= (1<<PB0) | (1<<PB1) | (1<<PB3); // PB0 and PB1 as outputs
//DDRB &= ~(1<<PB4); //PB4 wieder als Eingang
TCCR0A |= (1<<WGM01); // Configure timer 1 for CTC mode
TIMSK0 |= (1<<OCIE0A); // Enable CTC interrupt
OCR0A = 95; // Set CTC compare value 95
TCCR0B |= (1<<CS00); // No prescaler
Tick = 0;
Status = 0;
Action = 0;
Tick_20ms = 0;
PORTB &= ~(1<<PB3); //Pin PB3 auf AUS schalten
while(1)
{
if( PINB & ( 1 << PB4 ) && Status==0) //Ein schalten
{
PORTB |= (1<<PB3); // Pin PB3 auf AN schalten
Status = 1;
Action = 1;
}
if( !PINB & ( 1 << PB4 ) && Status==1) //Aus schalten
{
PORTB &= ~(1<<PB3); //Pin PB3 auf AUS schalten
Status = 0;
Action = 1;
}
if( PINB & ( 1 << PB2 ) && Status==1) //Manuell Aus schalten
{
PORTB &= ~(1<<PB3); //Pin PB3 auf AUS schalten
Status = 0;
Action = 1;
}
if( Action == 1)
{ sPulse = 133;
for(int i=1; i<=10; i++) // Servo auf AN schalten (i bestimmt wie lange der Zeitrahmen ist, indem das Servo auf die Position sPulse fährt)
{
_delay_loop_2(10000);
}
sPulse = 143;
//_delay_loop_2(20000);
for(int i=0; i<=20; i++) // Servo auf AUS schalten
{
_delay_loop_2(20000);
}
Action = 0;
sPulse = 0;
}
} //while
} //main
ISR(TIM0_COMPA_vect) // 100 KHz interrupt frequency
{
if (Action == 1) {
if(Tick >= 2000 ) // One servo frame (20ms) completed
{
Tick = 0;
Tick_20ms++;
}
Tick++;
if(Tick <= sPulse) // Generate servo pulse
{
PORTB |= (1<<PB0); // Servo pulse high
}
else
{
PORTB &= ~(1<<PB0); // Servo pulse low
}
}
}
Ich würde es zunächst bei dem Bewegungsmelder probieren mit etwa 1000µF. Und dann natürlich eine Schottky Diode davor, sonst nützt der Kondensator nicht viel.hänge ich einen Elko an den Bewegungsmelder oder an das Servo und wie groß sollte der wohl sein?


Code: Alles auswählen
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>
volatile unsigned int Tick; // 50KHz pulse
volatile unsigned int sPulse; // Servo pulse variable
volatile unsigned int Tick_20ms; // Servo frame variable
volatile unsigned int Status; //An oder Aus
volatile unsigned int Action; //Servo schalten
/* Crafty-Catchers C Tagebuch
* x |= (1 << Bitnummer); // Hiermit wird ein Bit in x gesetzt
* x &= ~(1 << Bitnummer); // Hiermit wird ein Bit in x geloescht
*/
int main (void)
{
sei(); // Enable global interrupts
//DDRB = 0x00; // Alle Pins als Ausgang
DDRB |= (1<<PB0) | (1<<PB1) | (1<<PB3); // PB0 and PB1 as outputs
//DDRB &= ~(1<<PB4); //PB4 wieder als Eingang
TCCR0A |= (1<<WGM01); // Configure timer 1 for CTC mode
TIMSK0 |= (1<<OCIE0A); // Enable CTC interrupt
OCR0A = 190; // Set CTC compare value 95
TCCR0B |= (1<<CS00); // No prescaler
Tick = 0;
Status = 0;
Action = 0;
Tick_20ms = 0;
PORTB &= ~(1<<PB3); //Pin PB3 auf AUS schalten
while(1)
{
if( !PINB & ~( 1 << PB4 ) && Status==0) //Ein schalten
{
PORTB |= (1 << PB3); // Pin PB3 auf AN schalten
Status = 1;
Action = 1;
}
if( PINB & ( 1 << PB4 ) && Status==1) //Aus schalten
{
PORTB &= ~(1 << PB3); //Pin PB3 auf AUS schalten
Status = 0;
Action = 1;
}
if( PINB & ( 1 << PB2 ) && Status==1) //Manuell Aus schalten
{
PORTB &= ~(1 << PB3); //Pin PB3 auf AUS schalten
Status = 0;
Action = 1;
}
if( Action == 1)
{ sPulse = 63; //133
for(int i=1; i<=20; i++) // Servo auf AN schalten (i bestimmt wie lange der Zeitrahmen ist, indem das Servo auf die Position sPulse fährt)
{
_delay_loop_2(10000);
}
sPulse = 71; //143
//_delay_loop_2(20000);
for(int i=0; i<=30; i++) // Servo auf AUS schalten
{
_delay_loop_2(10000);
}
Action = 0;
sPulse = 0;
}
} //while
} //main
ISR(TIM0_COMPA_vect) // 100 KHz interrupt frequency
{
if (Action == 1) {
if(Tick >= 1000 ) // One servo frame (20ms) completed
{
Tick = 0;
Tick_20ms++;
}
Tick++;
if(Tick <= sPulse) // Generate servo pulse
{
PORTB |= (1<<PB0); // Servo pulse high
}
else
{
PORTB &= ~(1<<PB0); // Servo pulse low
}
}
}
