Programm läuft nur mit angeschlossenen Programmer

Gast #3471401
Lesenswert?

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
void init_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
void init_led()
25
{
26
DDRB |= (1<<PB2);
27
}
28

29
int main(int argc, char *argv[])
30
{
31
int i;
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
return 0;
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
#3471405
Lesenswert?

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
Gast #3471464
Lesenswert?

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
#3471567
Lesenswert?

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)
Gast #3471658
Lesenswert?

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?
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
void init_timer(){
10
  // Set Fast PWM mode.
11
  TCCR0A |= (1<<WGM00) | (1<<WGM01);
12
  // Clear 0C0A on compare.
13
  TCCR0A |= (1<<COM0A1);
14
  // Start timer, no prescaling.
15
  TCCR0B |= (1<<CS00) | (1<<CS01);
16
  // Duty cycle 0% 
17
  OCR0A = 0;
18
}
19

20
void init_servo(){
21
  DDRB |= (1<<PB2); 
22
}
23

24
int main(){
25
  int i;
26
  init_servo();
27
  init_timer();
28
  while(1){
29
    for(i=10; i<80; i++) {
30
      OCR0A = i;
31
      _delay_ms(20);
32
    }
33
    for(i=80; i>10; i--) {
34
      OCR0A = i;
35
      _delay_ms(20);
36
    }
37
  }
38
  return 0;
39
}
#3471781
Lesenswert?

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.
Gast #3472204
Lesenswert?

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
Gast #3472239
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren