Ja, schon krass. :D Hatte erst gedacht, Du zitierst aus einem anderen Thread, ohne was zu sagen.Zitat:
Zitat von Hubert.G
Druckbare Version
Ja, schon krass. :D Hatte erst gedacht, Du zitierst aus einem anderen Thread, ohne was zu sagen.Zitat:
Zitat von Hubert.G
So, hab ab heute wieder Zeit...
so ganz verstehe ich das auch noch nicht :-(
Auch wenn ich dein Teil Code benutze, muss ich noch 2 variable declarieren. Bekomme diese Fehlermeldung.
main.c: In function 'main':
main.c:54: error: static declaration of '__vector_9' follows non-static declaration
main.c:54: error: previous declaration of '__vector_9' was here
make.exe: *** [main.o] Error 1
2. was bedeutet bei: PORTD^=(1<<PD3); //PortD3 toggelt 50% PWM
das ^ ?
Das ^ist ein exclusiv-oder, jedesmal wenn die Zeile angesprungen wird ändert sich der Wert von 0 auf 1 oder umgekehrt.
Zu den Fehlern kann ich so nichts sagen, da müsste ich den ganzen Code sehen.
Hi,
das ist der aktuelle Code (funktioniert noch nicht, fehlt ja nach was bei der if PD2 abfrage, was ich noch nicht weißt):
Code:#define F_CPU 8000000L // Systemtakt in Hz
#include <stdint.h>
#include <string.h>
#include <avr/io.h>
#include <avr/interrupt.h>
int main(void) {
DDRD &= (~ (1<<PD2)); /* Pin D2 als Eingang */
PORTD |= (1<<PD2); /* Pull Up von PIN D2 aktivieren */
volatile uint8_t takt;
ISR(TIMER0_OVF_vect){
takt++;
}
TCCR0=(1<<CS00); //kein Prescaler
TIMSK|=(1<<TOIE0); // Overflow Interrupt en
DDRD=(1<<PD3);// PortD3 wird Ausgang
if(takt>=10){ //Takt bis 10 zählen
PORTD^=(1<<PD3); //PortD3 toggelt 50% PWM
}
if (!( PIND & (1<<PIND2))) { /* mache was wenn PinD2 low ist */
// Hier: der Getriebemotor an L293D soll mit 50% laufen
}
return 0;
}
So sollte es aussehen ...
.. obs funktioniert hab ich nicht geprüft, nur lesbar geordnet und syntax korrigiert ...
Jetzt dürfte der compiler jedenfalls keinen Fehler mehr melden ...Code:#define F_CPU 8000000L // Systemtakt in Hz
#include <stdint.h>
#include <string.h>
#include <avr/io.h>
#include <avr/interrupt.h>
volatile uint8_t takt = 0; // Grundinitinalisierung nie vergessen
void AVRinit(void)
{
// DDRD &= (~ (1<<PD2)); // Pin D2 als Eingang -- unnötig
// wenn schon, dann:
DDRD = 0;
PORTD |= (1<<PD2); // Pull Up von PIN D2 aktivieren
DDRD |= (1<<PD3); // PortD3 wird Ausgang
TCCR0 = 0 | (1<<CS00); //kein Prescaler
TIMSK |= (1<<TOIE0); // Overflow Interrupt en
}
SIGNAL(TIMER0_OVF_vect)
{
takt++;
}
int main(void)
{
AVRinit();
// wo war denn die MainLoop ?
for(;;)
{
if(takt >= 10)
{ //Takt bis 10 zählen
PORTD ^= (1<<PD3); //PortD3 toggelt 50% PWM
// ist das absicht, hier takt nicht wieder auf 0
// zu setzen ?
// ohne das, ist fortan true für die restlichen 244 schritte
}
if (!( PIND & (1 << PIND2)))
{ // mache was wenn PinD2 low ist
// Hier: der Getriebemotor an L293D soll mit 50% laufen
}
}
return(0); // damit der compiler keine Warnungen ausgibt ...
}
Diese Code läuft zumindest im Simulator. takt gehört natürlich auf 0 gestellt.Code:#define F_CPU 8000000L // Systemtakt in Hz
#include <stdint.h>
#include <string.h>
#include <avr/io.h>
#include <avr/interrupt.h>
volatile uint8_t takt;
ISR(TIMER0_OVF_vect){
takt++;
}
int main(void) {
DDRD &= (~ (1<<PD2)); /* Pin D2 als Eingang */
PORTD |= (1<<PD2); /* Pull Up von PIN D2 aktivieren */
DDRD=(1<<PD3);// PortD3 wird Ausgang
TCCR0=(1<<CS00); //kein Prescaler
TIMSK|=(1<<TOIE0); // Overflow Interrupt en
sei();
for(;;){
if (!( PIND & (1<<PIND2))) { /* mache was wenn PinD2 low ist */
// Hier: der Getriebemotor an L293D soll mit 50% laufen
if(takt>=10){ //Takt bis 10 zählen
takt=0;
PORTD^=(1<<PD3); //PortD3 toggelt 50% PWM
}
}
else{
PORTD|=(1<<PD3); // Motor läuft mit 100%
}
}
}
Wenn man die Endlosschleife mit for(;; ){ beginnt, dann braucht man kein return0.
Danke für deinen Code +Zeit!
Ich verstehe es nicht, wie ich deinen Code einbinden kann!
Also beim normalen PWM kann ich durch (OCR1A) sagen;
solange ich Taster PD2 drucke, soll der Servo sich nach einer Richtung drehen:
Aber wie mache ich das, mit deinen Beispiel; solange ich Taster drücke sich der Getriebemotor 50% dreht?Code:if (!( PIND & (1<<PIND2))) // mache was wenn PinD2 low ist
{ OCR1A--;
_delay_ms(10);} /* Servo dreht nach rechts */
}
Danke!
Ich kann erst Montag dazu was schreiben ob es funktioniert hat oder nicht.
Wünsches allen ein schönes WE!
Das tut mein Code ja auch, oder soll Servo drehen und Motor 50% gleichzeitig sein.
Zusammengefügt würde das so aussehen, wird aber wegen dem _delay nicht richtig funktionieren. Delay und Timerinterrupt vertragen sich nicht richtig.Code:if (!( PIND & (1<<PIND2))) { /* mache was wenn PinD2 low ist */
// Hier: der Getriebemotor an L293D soll mit 50% laufen
if(takt>=10){ //Takt bis 10 zählen
takt=0;
PORTD^=(1<<PD3); //PortD3 toggelt 50% PWM
OCR1A--;
_delay_ms(10); /* Servo dreht nach rechts */
}
}
else{
PORTD|=(1<<PD3); //Motor 100%
}
Hi Hubert.
Hab dein Code grade getestet und es Funktioniert!
1000 Danke!
Frag noch dazu:
Kann ich denn Ausgangpin für mein Getriebemotor auch z.B Pin PC1 nehmen oder darf ich nur PD3 (wegen INT1) nehmen?