Hallo,
ich habe ein Programm geschrieben, mit dem ich die Helligkeit einer LED
mittels PWM ändere.
1
#include<stdlib.h>
2
#include<stdio.h>
3
#include<stdint.h>
4
#include<avr/io.h>
5
6
#define F_CPU 1000000UL
7
#include<util/delay.h>
8
9
voidinit_timer()
10
{
11
/* Set Fast PWM mode. */
12
TCCR0A|=(1<<WGM00)|(1<<WGM01);
13
14
/* Clear 0C0A on compare. */
15
TCCR0A|=(1<<COM0A1);
16
17
/* Start timer, no prescaling. */
18
TCCR0B|=(1<<CS00);
19
20
/* Duty cycle 0% */
21
OCR0A=0;
22
}
23
24
voidinit_led()
25
{
26
DDRB|=(1<<PB2);
27
}
28
29
intmain(intargc,char*argv[])
30
{
31
inti;
32
33
init_led();
34
init_timer();
35
36
while(1){
37
for(i=0;i<255;i++){
38
OCR0A=i;
39
_delay_ms(10);
40
}
41
42
for(i=255;i>0;i--){
43
OCR0A=i;
44
_delay_ms(10);
45
}
46
}
47
48
return0;
49
}
Das ganze habe ich in AVR Studio 4 gescchrieben und mit dem DIAMEX
PROG-S auf meinen Attiny2313 gebrannt. Dazu habe ich noch zusätlich eine
Batterie am Attiny angeschlossen.
Die LED macht auch genau das, was die in diesem Programm machen soll
(wird also nur heller und dunkler).
Jetzt zu meinem Problem:
Wenn ich den Programmer vom Attiny trenne, die Externe Batterie aber
noch dran lasse, funktioniert es nicht mehr.
Woran kann das liegen?
JD
Hast du einen Pullup am Reset? Sonst floatet der Resetpin möglicherweise
irgendwo zwischen 0 udn 5V rum
(Wenn der Programmer angesteckt ist zieht er ihn vermutlich auf 5V)
[edit]
das "int argc, char *argv[]" bei main kannst du dir im übrigen sparen.
Diese Variablen verwendet man auf dem PC, wenn den Programm beim Start
Parameter übergeben werden -> gibts aufm µC nicht
Ah,
ich schäme mich für diese Frage :(.
Es war wirklich so einfach, aber daran hatte ich gar nicht gedacht. Also
der Controller macht auch ohne Programmer das was er machen soll.
JD
Noch einmal eine Nachfrage,
WEnn ich jetzt meinen Servo daran anschließe, mit Braun an GND vom
Attiny, sowie der externen Batterie, mit Rot an plus und orange am Pin,
bewegt sich nichts. dabei sollte der doch auch hin und her drehen oder?
JD
Welch Zufall, ich programmiere auch gerade an Servos auf einem 2313^^
Wenn das mit der LED funktioniert ists schon mal nicht schlecht. Aber
ich schätze, dass dein Signal viel zu schnell ist, du nimmst ja als
Prescaler 1. Nimm mal 64 als Prescaler (CS00 und CS01 setzen), dann
kommst du schon eher in den richtigen Bereich (das high sollte im
Bereich von 1-2ms liegen, kann je nach Servo etwas abweichen)
[EDIT]
und nach dem high sollte ein etwas längere Pause folgen (~20ms). Also am
besten OCR0A nich von 0 bis 255 laufen lassen, sondern eher von 10 bis
80 oder so. (Das könnte man jetzt auch genau ausrechnen, oder man nimmt
das Oszi)
So dreht er sich jetzt (Ich bin echt happy).
Allerdings dreht er sich hin, wenn er am ende angekommen ist, dreht er
sich sofort zurück und dann macht er erst eine Pause von ~1sekunde.
Woher kann das kommen?
JD schrieb:> dreht er> sich sofort zurück und dann macht er erst eine Pause von ~1sekunde.> Woher kann das kommen?
Also die 10 und 80 waren nur so aus dem Bauch heraus geschätzt. Was
jetzt passiert:
>> Bei der Seite wo er sofort zurückdreht:
Man weis jetzt nicht, ob das die Seite mit den 10 oder den 80 ist. Aber
dass er sofort zurückdreht bedeuted, dass er noch nicht am Ende seines
maximalen Drehwinkels angekommen ist. Du könntest also evtl. noch etwas
mehr Winkel herausholen, indem du entweder die 10 kleiner machst oder
die 80 größer (welches von beiden weis man nicht, da ja nicht bekannt
ist auf welcher Seite er sofort wieder zurückdreht)
>> Bei der Seite wo er stehen bleibt:
Der Tiny versucht den Servo weiter zu drehen als er mechanisch kann. Als
entweder ist die 10 zu klein (Er kann nicht bis 10 "hinunterdrehen")
oder die 80 zu groß (er kann nicht bis 80 "hinaufdrehen"). Welches von
beiden du jetzt kleiner machen musst musst du ausprobieren, da ja wieder
nicht bekannt ist auf welcher Seite er stehen bleibt
Also einfach ein bisschen mit den Werten 10 und 80 spielen, dann siehst
du schon wo es noch hapert.
Ja,
habe ein wenig ausprobiert. Vom Optischen her, sind die Besten
Ergebnisse bei 5<i<40.
Aber kann man diese WErte auch irgendwie besser bestimmen, bzw.
berechnen, bei welchen WErten der Servo welchen Winkel einnimmt?
JD
Ja eigentlich schon,
habe einen Servo von Conrad
(http://www.conrad.de/ce/de/product/404753/Modelcraft-Standard-Servo-410-Getriebe-Kunststoff-JR?ref=searchDetail),
die einzigen daten, ich ich finden konnte waren
Gewicht 38 g
Stell-Moment bei 4,8 6 V 35 44 Ncm
Stell-Moment bei 4,8 V 35 Ncm
Stell-Zeit bei 4,8 / 6 V 0.17sec/ 60˚ / 0.15sec/ 60˚
Stell-Zeit bei 4,8 V 0.17sec/ 60˚
Getriebe Kunststoff
Stell-Zeit bei 6 V 0.15sec/ 60˚
Stell-Moment bei 6 V 44 Ncm
Stecksystem JR
Länge 40.5 mm
Breite 20 mm
Herst.-Teilenr. BMS-410C
Stell-Moment bei 6 / 7,4 V 44 Ncm
Servo-Typ Standard-Servo
Servo-Technologie Analog-Servo
Stell-Zeit 6 V / 7,4 V 0.15sec/ 60˚
als download gibts nur die Konformitätserklärung
auch auf anderen seiten konnte ich ncihts finden.