Forum: Mikrocontroller und Digitale Elektronik Programm läuft nur mit angeschlossenen Programmer


von JD (Gast)


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

von Simon S. (-schumi-)


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

: Bearbeitet durch User
von JD (Gast)


Lesenswert?

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

von JD (Gast)


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

von Simon S. (-schumi-)


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)

: Bearbeitet durch User
von JD (Gast)


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
}

von Simon S. (-schumi-)


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.

von JD (Gast)


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

von Thomas (kosmos)


Lesenswert?

Ich denke das im Datenblatt steht welche Impulslänge welchen Winkel 
entspricht.

von JD (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.