Forum: Mikrocontroller und Digitale Elektronik Servoansteuerung (HXT900) mit AtMega16- kleine probleme mit dem code?


von Alex (Gast)


Lesenswert?

Hallo,
ich versuche mich gerade das erste mal mit servos und der delay bib von 
WinAVR.
Alles was ich momentan versuche ist in einer schleife meinem HXT900 
Servo die verlangten 20ms pause und dann ein 2ms signal zu geben um ihn 
damit dauerhaft auf die endstellung auszurichten.

Ich benutze einen AtMega16 und programmiere mit AVRStudio4 und WinAVR.
Der sehr kurze testcode sieht wie folgt aus:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
int main (void)
5
{
6
  DDRA = 0xff;
7
  DDRB = 0xff;  
8
        DDRC = 0xff;
9
  DDRD = 0xff;
10
       
11
  while (1)
12
  {
13
    _delay_ms(20);
14
    PORTD = 0b01000000;
15
    _delay_ms(2);
16
    PORTD = 0x00000000;  
17
  }
18
return 0;
19
}

Ich habe am Pulspin für den servo auch eine led und die zeigt mir 
folgendes:
Ein Blinken mit ungefähr 2 Hz.
Ich würde ja nun 50Hz erwarten... also habe ich in den 
projekteinstellungen den Takt des Controllers explizit auf 16000000 Hz 
angegeben. Es hängt auch definitv ein 16Mhz quarz dran.

Wo liegt der fehler? Der servo arbeitet natürlich nicht korrekt, die 
daten kommen aber an - blos eben so wie es aussieht mit dem falschen 
takt.

von Karl H. (kbuchegg)


Lesenswert?

Alex schrieb:

> projekteinstellungen den Takt des Controllers explizit auf 16000000 Hz
> angegeben. Es hängt auch definitv ein 16Mhz quarz dran.

Das mag schon sein.
Aber wird er auch benutzt?
Sprich: Hast du die Fuses so eingestellt, dass der AVR auch 'weiß' das 
er einen Qaurz an den Pins hängen hat.

_delay_ms ist da ein gutes Werkzeug. Mach dir eine Schleife, die bei 
16Mhz eine LED 1 Sekunde an und 1 Sekunde aus schaltet. Wenn die 1 
Sekunde eher 16 Sekunden sind, dann wird der Quarz nicht benutzt.
Fuses umstellen und wieder den Blinktest machen.

http://www.mikrocontroller.net/articles/AVR_Fuses

von Alex (Gast)


Lesenswert?

hallo!
danke, das mit den fuses wird es wohl sein - die led leuchtet 16sekunden 
bei delay von "1000ms"..

wenn ich jetzt in avr studio die SUT_CKSEL fuses einstellen will habe 
ich mehrere möglichkeiten für einen externen quarz  (Ext. 
Crystal/Resonator ...) - und bin nun nicht sicher welche einstellung auf 
meinen 16MHz quarz zutrifft- sind die 16MHz jetzt medium oder high 
frequency und wie sieht es mit der "start up time" aus?

von Alex (Gast)


Lesenswert?

ach und (die profis hier mögen mir die anfängerfrage verzeihen) - das 
bedeutet ich kann den Atmega 16 auch komplett ohne externen quarz auf 
1MHz intern laufen lassen? .. dann tue ich das bei meinem RC-Roboter 
nämlich (da habe ich einen 16MHz quarz dran aber an fusebits setzen habe 
ich nicht gedacht)..

von Alex (Gast)


Lesenswert?

...das ausprobieren mit SUT_CKSEL hat jetzt dazu geführt, dass ich nicht 
mehr auf den internen oszi zurückstellen kann und einen "ISB Mode Error" 
bekomme... irgendwelche tips? :/

von Karl H. (kbuchegg)


Lesenswert?

Alex schrieb:

> Crystal/Resonator ...) - und bin nun nicht sicher welche einstellung auf
> meinen 16MHz quarz zutrifft- sind die 16MHz jetzt medium oder high
> frequency

high

> und wie sieht es mit der "start up time" aus?

Nimm die längste.

von Karl H. (kbuchegg)


Lesenswert?

Alex schrieb:
> ach und (die profis hier mögen mir die anfängerfrage verzeihen) - das
> bedeutet ich kann den Atmega 16 auch komplett ohne externen quarz auf
> 1MHz intern laufen lassen?

Ja.
Das ist der Default Zustand. So wird der µC ausgeliefert.

von Karl H. (kbuchegg)


Lesenswert?

Alex schrieb:
> ...das ausprobieren mit SUT_CKSEL hat jetzt dazu geführt, dass ich nicht
> mehr auf den internen oszi zurückstellen kann und einen "ISB Mode Error"
> bekomme... irgendwelche tips? :/

Du hast den verlinkten Artikel nicht gelesen und hast irrtümlich auf 
externen Taktgenerator gestellt. Ein Quarz ist aber kein Taktgenerator. 
Lies nochmal den Link.

Da du noch einen 2.ten Prozessor hast:
Programmiere den so, dass er einen Pin ständig 0 / 1 schaltet.
Dieses Signal bietest du dem verfusten Prozessor als Taktsignal an XTAL1 
an. Im AVR-Studio auf die kleinste mögliche Programmierfrequenz stellen 
und der µC sollte sich wieder ansprechen lassen.

von Alex (Gast)


Lesenswert?

ist auf high und längste gesetzt... und da komme ich jetzt nicht mehr 
raus und bekomme beim befehl "Program" dauernd eine error message. HIGH 
und LOW sind auf 0xFF... habe beim suchen eben auch gesehen dass das 
eventuell problematisch ist...
was nun? ich benutze den AFR ISP mkII und habe wie gesagt den externen 
quarz dran...  verstehe nicht was jetzt falsch war - reset ist so nicht 
möglich?
sorry für die fragerei ich hänge hier grade ziemlich in der luft...

von Alex (Gast)


Lesenswert?

na schönes schlamassel.. werde ich dan wohl mal tun. danke für die 
Gedult.

von Alex (Gast)


Lesenswert?

-t +d

von Karl H. (kbuchegg)


Lesenswert?

Alex schrieb:
> na schönes schlamassel..

Da musst du durch.
Hat man diese Hürde erst mal geschafft, ist die wichtigste Falle 
umgangen.
Wenn du den µC wieder am laufen hast und wieder an die Fuses rann 
kommst: schalt auch gleich JTAGEN ab.

von Alex (Gast)


Lesenswert?

danke, werde ich. wenn ich das richtig verstanden habe, also folgendes:
meinem anderen µC eine schleife geben, die einen pin abwechselnd auf 
ein/aus schaltet - womit ich wohl 500kHz bekomme (da der ja auch seinen 
externen quarz nicht nutzt).
Den pin anschließen an XTAL1 (den isp auf 125kHz gestellt lassen? passt 
ja grade oder nicht)- und schon kann ich die fusebits in AVR studio 
wieder setzen?  - dort auf external oszi/crystal / high mit längster 
start up time - und JTAGEN aus.
na ich bin gespannt. ;)

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.