Lieber Besucher, herzlich willkommen bei: RCLine Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

swessels

RCLine User

  • »swessels« ist der Autor dieses Themas

Wohnort: 31535 Neustadt, in der Woche HH

Beruf: Arbeitsplanung in der Luftfahzeugkomponenten - Instandsetzung

  • Nachricht senden

21

Dienstag, 18. Januar 2011, 14:47

Hallo Olli,

Zitat

warum glaubst du dann dass das nun besser funktionieren sollte


es könnte besser funktionieren weil
- die ISR kürzer ist (was in diesem Fall eigentlich keinen Einfluß haben sollte)
- die möglichkeit einen Impuls mit falscher Dauer zu messen in der ISR elimiert wurde

Ich muß allerdings sagen daß der von Dir skizzierte Ansatz recht elegant wirkt. Ich probiere beides mal aus. Auf Deine Variante mit nur einer static Variable wäre ich wohl nicht gekommen.

Gruß,
STefan

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »swessels« (18. Januar 2011, 14:48)


22

Dienstag, 18. Januar 2011, 15:20

Zitat

es könnte besser funktionieren weil
ich würde das Problem im PWM vermuten, und da ist nichts geändert.

Zitat

der von Dir skizzierte Ansatz recht elegant wirkt
naja, es geht noch knapper wenn man Thomas' Überlegungen im PIC-Thread mit einbaut. Würde sehr schön und knapp werden, ich denke allerdings dass das mit den Fehlerfällen abfangen dann weniger "elegant" wird. Aber wenn man darauf verzichten kann/will, sicher die Lösung.


main{
Ports auf Eingang/Ausgang initialisieren;
ICP Flanke auf low->high;
ICP Interrupt ein;
Timer1 Prescaler 8;
sei();
while(1) {}
}

ISR(TIM1_CAPT_vect) {
if(TCCR1B & (1 << ICES1)) {
OCR1B=2198+ ICR1; //2198 anpassen, MittenVerschiebung einfach durch +-Wert;
OCR1B Interrupt an;
}else{
AusgangFürServo auf high;
}
ICP Flanke togglen;
}

ISR(TIM1_OCR1B_vect) {
AusgangFürServo auf low;
OCR1B Interrupt aus;
}

swessels

RCLine User

  • »swessels« ist der Autor dieses Themas

Wohnort: 31535 Neustadt, in der Woche HH

Beruf: Arbeitsplanung in der Luftfahzeugkomponenten - Instandsetzung

  • Nachricht senden

23

Dienstag, 18. Januar 2011, 15:33

Zitat

ich würde das Problem im PWM vermuten, und da ist nichts geändert.


Es kann meiner Meinung nach nur am Update (Wert und / oder Updaterate) des OCR1B Registers liegen. Wenn ich einen statischen Wert für OCR1B verwende zuckt da gar nichts.

Auch das Ändern des Wertes zur Laufzeit aus anderen Quellen funktioniert normalerweise. Es ist nicht das erste mal daß ich ein Servo mittels PWM ansteuere, hat bisher immer funktioniert.

Das Synchronisationsproblem zu Eingangsimpuls löse ich damit natürlich nicht.

Ich verfolge das auch deshalb weil ich auf diesen Ansatz selbst gekommen bin. Ich bin für jede Hilfe und jeden Denkanstoß echt dankbar, aber ich lerne am besten wenn ich probiere bis ich verstanden habe warum etwas nicht funktioniert.

Zitat

naja, es geht noch knapper wenn man Thomas' Überlegungen im PIC-Thread mit einbaut. Würde sehr schön und knapp werden, ich denke allerdings dass das mit den Fehlerfällen abfangen dann weniger "elegant" wird. Aber wenn man darauf verzichten kann/will, sicher die Lösung.


Elegant ist ja auch nicht immer mit "möglichst kurz" gleichzusetzen.

Gruß,
Stefan

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »swessels« (18. Januar 2011, 15:35)


haschenk

RCLine User

Beruf: Dipl. Ing.

  • Nachricht senden

24

Dienstag, 18. Januar 2011, 16:27

Stefan,

natürlich kannst du auch mit Interrupts und/oder den Capture/Compare-Funktionen arbeiten... Bei dem Prinzip, den Eingangsimpuls als "pacemaker" zu verwenden, würde ich aber bleiben.

Bei der Fehlersuche hat es sich bei mir bewährt,
a)
z.B. mit dem einem Strahl vom Scope das Eingangssignal darzustellen und darauf zu triggern, und mit dem andern Strahl auf Fehlersuche zu gehen (man kann z.B. vorübergehend irgendeinen "Testimpuls" ins Prog einbauen).
Kurz gesagt, zu suchen, bis wohin das Prog noch das macht, was man erwartet...

b)
Zwischenergebnisse auf ein LCD auszugeben und dazu vorübergehend die LCD-Routinen (müssen erprobt und fehlerfrei sein) mit "reinzuhängen". Die nötigen I/Os und die Laufzeit dafür hat man häufig.


Übrigens müsste es sehr einfach sein, das Ganze mit einem Arduino und dessen vorgegebenen Funktionen zu machen. Wenn´s läuft, kann man das hex-File dann auf (fast) jeden andern AVR spielen.


Gruß,
Helmut

swessels

RCLine User

  • »swessels« ist der Autor dieses Themas

Wohnort: 31535 Neustadt, in der Woche HH

Beruf: Arbeitsplanung in der Luftfahzeugkomponenten - Instandsetzung

  • Nachricht senden

25

Dienstag, 18. Januar 2011, 16:44

Hallo Helmut, hallo Olli,

die letzte Version funktioniert. Also war da irgendwo ein Fehler in der Erzeugung des Impulswertes. Jetzt habe ich nur noch ab un an ein kaum wahrnehmbares Zucken des Servos, was ich aber auf den Aufbau auf dem Steckbrett und eventuelle Schwankungen des internen Oszillators zurückführe.

Jetzt kann ich beruhigt Eure Lösungsansätze durcharbeiten....

Zur Fehlersuche:
Ich leider habe immer noch kein Oszi. Ich glaube auch das meine Regierung die Ausgabe mit Unmut quittieren würde.....

Die Variante mit dem LCD wäre die nächste Stufe gewesen.

Gruß,
Stefan

26

Dienstag, 18. Januar 2011, 17:30

Zitat

Ich verfolge das auch deshalb weil ich auf diesen Ansatz selbst gekommen bin....ich lerne am besten wenn ich probiere bis ich verstanden habe warum etwas nicht funktioniert.
das ist fürwahr ein guter Grund, den verstehe ich gut, da bin ich oft auch nicht anders... :D

:ok: :ok: :ok:


Zitat

Elegant ist ja auch nicht immer mit "möglichst kurz" gleichzusetzen.
das ist wahr, aber hier finde ich wäre es beides, kurz und elagant :)

Zitat

Jetzt habe ich nur noch ab un an ein kaum wahrnehmbares Zucken des Servos
vielleicht OCR im HP setzten atomic machen. Es könnte, da du unsigned int nimmst, auch an dieser Zeile pulse = stop + 19999 - start; liegen, musst du nach sehen was der Compiler wirklich daraus macht, ansonsten könnte es hin und wieder zu einem Aussreisser kommen. Probier mal pulse = stop + 19999; pulse-= start;

Zitat

as ich aber auf den Aufbau auf dem Steckbrett und eventuelle Schwankungen des internen Oszillators zurückführe.
kann natürlich sein glaube ich aber Beides nicht so recht. Ich hatte so Zucken bei eigenen Projekten schon auch öfters mal anfänglich gehabt , und es waren dann immer sporadisch für einen Puls völlig falsch ausgegebene Impulslängen (nach deiner Beschreibung denke ich würdest du das auf nem Oszi sehen können). Der RC Oszillator hat wohl gerade bei den neueren Modellen erheblichen Jitter (Achim hatte da mal einen Link gepostet, weis ich nicht mehr), aber dann sollte das ständig jittern.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »OlliW« (18. Januar 2011, 17:40)


27

Dienstag, 18. Januar 2011, 17:30

Ein Forumskollege und Ich haben einen Servotester gebaut.

Das Teil kann Servoimpulse erzeugen, Servoimpulse messen und auch Multiframes ( Nautic Module ) messen und erzeugen.

Es hat auch eine USB Schnittstelle wo man die Empfangenen Daten mitloggen kann.

Ich denk mal da wird deine Regierung etwas sanfter reagieren, weils doch günstiger ist als ein Oszi.

Wenn man sich aber Ernsthaft mit Elektronik Entwicklungen beschäftigt, geht über Kurz oder Lang natürlich nichts an einem Oszi vorbei.

Eventuell kannst Du Dir auf dem Gebrauchtgerätemarkt eines holen ?

haschenk

RCLine User

Beruf: Dipl. Ing.

  • Nachricht senden

28

Dienstag, 18. Januar 2011, 17:43

Hallo Stefan,

erstmal Glückwunsch zum Erfolg.

Wenn du mal ewas komplexere Dinge versuchen willst, führt aber an einem Scope kein Weg mehr vorbei. Die Teile gibt´s auch gebraucht, und das Beste und Teuerste muß es nicht sein...

Zitat

Ich leider habe immer noch kein Oszi. Ich glaube auch das meine Regierung die Ausgabe mit Unmut quittieren würde.....

Ob das wirklich so ist ? Deine Eltern freuen sich doch wahrscheinlich, wenn du dich mit so anspruchsvollen Dingen befasst und sollten das unterstützen. Zeigst du ihnen gelegentlich die Ergebnisse deiner Arbeit ?


Gruß,
Helmut

swessels

RCLine User

  • »swessels« ist der Autor dieses Themas

Wohnort: 31535 Neustadt, in der Woche HH

Beruf: Arbeitsplanung in der Luftfahzeugkomponenten - Instandsetzung

  • Nachricht senden

29

Dienstag, 18. Januar 2011, 20:31

Hallo Helmut,

Zitat

Ob das wirklich so ist ? Deine Eltern freuen sich doch wahrscheinlich, wenn du dich mit so anspruchsvollen Dingen befasst und sollten das unterstützen. Zeigst du ihnen gelegentlich die Ergebnisse deiner Arbeit ?


als ich das gelesen habe konnte ich ein Grinsen nicht unterdrücken. Ich bin 41 und bin eigentlich nur wegen des Modellbaus wieder zur Elektronik gekommen. Außerdem macht das Spaß und läßt sich auch in meiner Hamburger Bude ohne großen Aufwand betreiben.

Sicherlich könnte ich mir ein Oszi kaufen, aber: Zwei sieben Jahre alte Autos benötigen Sommerreifen, die Winterreifen sind gerade neu, ein Kinderzimmer bedarf der Renovierung usw.

Größere Summen für meine Hobbies gebe ich nur aus wenn ich es auch überhabe. Und ein ein vernünftiges (HM206?) Oszi ist auch gebraucht nicht gerade ein Pappenstiel.

Als nächstes stehen ein AvrISP MKII und ein akzeptbles DMM an. ich habe ein uraltes VC150. Damit bin ich zwar zufrieden, aber das ewige hin und her am Wochenende nervt.
Dann noch ein kleiner Flieger und das wars dann für dieses Jahr.

@Olli:

Zitat

vielleicht OCR im HP setzten atomic machen.

Ich wollte gerade schreiben das das in diesem speziellen Fall kein Problem sein kann, aber da die Mainloop und der Timer nicht synchronisiert sind kann es doch problematisch sein. Danke für den Hinweis.

Zitat

Probier mal pulse = stop + 19999; pulse-= start;

Wo ist da der Unterschied zu meiner Version? Da die Berechnung in der ISR abläuft sollte sie automatisch atomar sein, da die anderen Interrupts gesperrt sind. Oder habe ich da etwas falsch verstanden?

@Wilhelm:
So einen (Multi)Tester will ich mir auch noch basteln. Mir schwebt da ein Gerät zur Antriebsvermessung vor.:

- Spannungsmessung
- Strommesung (Mein Sorgenkind)
- Drehzahlmessung
- Servoimpulsmessung
- Servoimpulserzeugung.

Das Gerät soll auf Basis eines Mega168 Boards von Chip45.com entstehen. Da ist USB schon drauf, alles in SMD und kostet "nur" 20.- Euro. Einen davon habe ich noch da. Ein Display will ich per SPI ansteuern, Bedienung über Drehencoder.

Zunächst aber der Servoreverser sowie ein 2-Stufenschalter für Beleuchtungszwecke.

Gruß,
Stefan

30

Dienstag, 18. Januar 2011, 21:20

pulse = stop + 19999 - start kann der AVR nicht auf einmal rechnen, sondern muss das in zwei Schritten tun, wenn der Compiler nun entscheidet dies so zu tun (z.B. weil er lustig ist, oder um zu optimieren, siehe dir mal deinen Code an...)
pulse = stop - start
pulse = pulse + 19999
dann hast du beim ersten Schritt wegen den unsigned und stop<start evtl ein Problem... mein Vorschlag versucht den Compiler zu zwingen das in ner sinnvollen Reihenfolge zu machen. In meinen ganzen FpKoaxMischer und 4-1+2in1 Codes arbeite ich mit so "Tricks" um das richtige Ergebnis zu erzwingen (den ein Blick in die .lst zeigte allzuoft dass der Compiler das nicht wie erwünscht macht, und das hat sich allzuoft in genau dem geäussert was du beschreibst...)


Als Tester bzw Analysator von so Impulsfolgen benutze ich oft eine Supereinfachschaltung. Irgendein ATmel AVR mit ICP, 16bit Timer und USART, mit ICP bestimme ich die Zeit des Flankenwechsels vom letzten Flankenwechsel, diese Zeit schicke ich per UART/RS232 an ein PC Terminal... und schon sieht man genau was passiert... bei den mir bisher im RC-Bereich untergekommen Implusfolgen war das bisher immer schnell und genau genug... und einfacher geht's fast nicht mehr... :)
(bei Wilhelm's Lösung würde ich z.B. vermuten das es bei völlig krummen Signalen auch was völlig krummes macht, aber das will man ja gerade verlässlich detektieren...)


Zur Strommessung: schau dir mal die Allegro Hallstromsensoren an... einfacher und genauer geht's nicht mehr (ein jüngeres Beispiel z.B. hier). Gibt's mittlerweile auch als Stromsensoren für so datenlogger für ein bischen mehr zu kaufen.

31

Mittwoch, 19. Januar 2011, 00:47

Zitat

Strommesung (Mein Sorgenkind)

Ich nehm da immer Stromwandler, wie den ACS 750 von Allegro.
Da hast Du dann auch gleich galvanische Trennung zwischen Hochstrom und Messkreis.
Das heisst es ist egal, ob Du den Stromsensor in die Plus oder die Masseleitung legst.
Und die Teile sind nur unwesentlich teuerer als ein guter Shunt Widerstand.
Den ACS 750 gibts bis zu 100A maximalem Messstrom.

Ein Nachteil ist das Rauschen, das die Teile produzieren, aber mit einem guten Tiefpaß und ein wenig Oversamplen bekommt man auch das in den Griff.

haschenk

RCLine User

Beruf: Dipl. Ing.

  • Nachricht senden

32

Mittwoch, 19. Januar 2011, 01:02

Hallo Stefan,

Zitat

Ich bin 41 und bin eigentlich nur wegen des Modellbaus wieder zur Elektronik gekommen.

Sorry für das Mißverständnis- mit "Regierung" meinen sonst Jungs ihre Eltern... Ich hätte ja auch in den Profil schauen können. Immerhin könntest du mein erwachsener Sohn sein ;-) .

Aber die Anschaffung eines Scopes solltest du dir wirklich überlegen. Wenn du mal damit zu arbeiten gewohnt bist, kannst du dir nicht mehr vorstellen, wie es "ohne" überhaupt ging.

Zitat

Das Gerät soll auf Basis eines Mega168 Boards von Chip45.com entstehen. Da ist USB schon drauf, alles in SMD und kostet "nur" 20.- Euro. Einen davon habe ich noch da. Ein Display will ich per SPI ansteuern, Bedienung über Drehencoder.

Kennst du "Arduino" ?
Der Einstieg ist hier: www.arduino.cc
Für Experimente sehr gut geeignet, fertige Software-Funktionen für viele Zwecke, Verbindung mit dem PC über USB, eng mit C verwandte Sprache; großes, kompetentes Forum...
Möglicherweise ist das von dir erwähnte board einer der zahlreichen Klone...
Den "Duemilanove" gibt´s z.Zt. (im Abverkauf wegen neuem Modell) z.B. hier: www.watterott.com für 22,61 Teuro. Um damit loslegen zu können, brauchst du nur noch ein USB-Kabel.


Gruß,
Helmut

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »haschenk« (19. Januar 2011, 01:12)


swessels

RCLine User

  • »swessels« ist der Autor dieses Themas

Wohnort: 31535 Neustadt, in der Woche HH

Beruf: Arbeitsplanung in der Luftfahzeugkomponenten - Instandsetzung

  • Nachricht senden

33

Mittwoch, 19. Januar 2011, 06:45

Hallo zusammen,

@Olli:

Zitat

(denn ein Blick in die .lst zeigte allzuoft dass der Compiler das nicht wie erwünscht macht, und das hat sich allzuoft in genau dem geäussert was du beschreibst...)

Ich seh schon, mit der .lst und Assembler muß ich mich auch noch mal beschäftigen :shake: Das atomare beschreiben von OCR1B und Deine änderung in der Berechnung der Impulslänge ergeben keine Änderung im Verhalten.

Zitat

Als Tester bzw Analysator von so Impulsfolgen benutze ich oft eine Supereinfachschaltung. Irgendein ATmel AVR mit ICP, 16bit Timer und USART

das wäre meine Wahl gewesen. Besagtes Board von Chip45.

@Wilhelm:

Zitat

Ich nehm da immer Stromwandler, wie den ACS 750 von Allegro.

Darüber habe ich auch schon nachgedacht. Aber wo bekomme ich die? Die üblichen Verdächtigen (Ich kenne bestimmt nicht alle) haben die Dinger nicht bzw. nur im Schwachstrombereich. 30A sind für ne Antriebsmessung zu wenig.

Die galvanische Trennung ist schön und gut, aber durch die Spannungsmessung ist diese wieder hinfällig. Streßfreies High-Side messen hat natürlich was.

Vielleicht nehme ich erst mal die Variante mit dem selbst aus 2,5mm² CU hergestellten Shunt. Für Vergleichsmessungen sollte das reichen. Klappt ja beim Minilogger usw auch.

@Helmut:

Zitat

Sorry für das Mißverständnis- mit "Regierung" meinen sonst Jungs ihre Eltern...
Macht nichts. Ich fand das nur so niedlich... :tongue:

Den Arduino kenne ich. Das Board von Chip45 läßt sich evtl. mit dem Board von Chip45 lässt sich wohl mit dem Arduino Nano vergleichen. Damit habe ich die Steuerung der Pivotingdoors eines Schubumkehrermodells realisiert.

Ein Oszi wäre schon nett. Aber was benötige ich da? Viel mehr als die Signale die im RC-Bereich vorkommen muß es für mich nicht können.

Gruß,
Stefan

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »swessels« (19. Januar 2011, 08:15)


34

Mittwoch, 19. Januar 2011, 07:59

Zitat

Deine änderung in der Berechnung der Impulslänge ergeben keine Änderung im Verhalten.
Schade. Was machen den die anderen Lösungsvorschläge? Vielleicht werde ich das am WoE auch mal programmieren, macht mich ja neugierig :)

Zitat

Darüber habe ich auch schon nachgedacht. Aber wo bekomme ich die? Die üblichen Verdächtigen (Ich kenne bestimmt nicht alle) haben die Dinger nicht bzw. nur im Schwachstrombereich.
na, dann musst du bei Gelegenheit mal die Liste deiner üblichen Verdächtigen um die wichtigen Verdächtigen erweitern :D, z.B. Farnell und HBE, gebe mal bei http://www.hbe-shop.de/katalog/index.php das stichwort Current Sensor ins Suchfeld ein und schau nach ACS Typen... alles bis 200A da... :)

und was wohl hier, http://www.h obbycity.com/h obbyking/store/u h_viewItem.asp?idProduct=11251 (Blanks entfernen), zu sehen ist... :D

swessels

RCLine User

  • »swessels« ist der Autor dieses Themas

Wohnort: 31535 Neustadt, in der Woche HH

Beruf: Arbeitsplanung in der Luftfahzeugkomponenten - Instandsetzung

  • Nachricht senden

35

Mittwoch, 19. Januar 2011, 09:16

Hallo Olli,

die anderen Vorschläge probiere ich nachher mal aus. Zusätzlich muß ich mir noch etwas halbwegs intelligentes zur Programmierung der Mittelstellung ausdenken....

Vielleicht so:

- wenn beim Einschalten ein Taster gedrückt wird den Programmiermodus aktivieren
- Signalisierung via Low-Current LED
- Tastenentprellung via Timer0
- wenn 10 s keine Taste gedrückt wird Programmiermodus beenden
- wenn der Wert von center <> Wert eeprom -> Wert ins eeprom schreiben

Kann es sein das HBE ne Apotheke ist?

Gruß,
Stefan

36

Mittwoch, 19. Januar 2011, 11:15

Für die ACS Chips kenn ich 2 Lieferanten.
1 Farnell, wenn Du keinen Firmenaccount hast, kannst Du das komplette Farnell Programm auch über HBE Shop bestellen.
Farnell hat den ACS 758 von 50 bis 200A Maximalstrom.

2. Digikey, wobei da natürlich der Mindermengen Zuschlag und die Versandkosten sehr hoch sind.

Natürlich ist klar, das man durch die Spannungsmessung da wieder galvanische Verbindungen reinkriegt. Allerdings kann der Strommesser an jede beliebige andere Leitung gelegt werden, die keine Verbindung mit der Messchaltung hat und trotzdem geht das.

Diese Geschichte mit dem Shunt ist mir einfach zu blöd, weil man da immer aufpassen muß, welche Leitung man da wo anschließt um keinen Kurzschluß zu basteln.

Guck mal hier: http://www.toeging.lednet.de/flieger/pro…lt/lipovolt.htm da haben wir so einen ACS verbastelt.

Zitat

Kann es sein das HBE ne Apotheke ist?

Farnell ist nicht gerade supergünstig und HBE möchte noch einen AUfschlag darauf haben!

Segor hat auch ein paar von diesen Stromsensoren - Wie ich gerade sehe.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »wkrug« (19. Januar 2011, 11:23)


swessels

RCLine User

  • »swessels« ist der Autor dieses Themas

Wohnort: 31535 Neustadt, in der Woche HH

Beruf: Arbeitsplanung in der Luftfahzeugkomponenten - Instandsetzung

  • Nachricht senden

37

Mittwoch, 19. Januar 2011, 20:08

Hallo Wilhelm,

danke für die Info. Ich habe den ACS758 auch bei Darsius entdeckt, da ist er wohl am günstigsten.

@Olli:

Ich habe mal das von Dir vorgeschlagene Konstrukt ausprobiert. Da gibt es anscheinend Synchronisationsprobleme. Beim anlegen der Versorgungsspannung fährt das Servo in den Endanschlag.

Wenn das Servo nachträglich angesteckt wird funktioniert es in 30% der Fälle, dann ohne jede Zuckung.

Mein Code, im Moment ohne Drehrichtungsumkehr:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/*
Servoreverser - Variante OlliW
MCU ATtiny 24
Takt: 8MHz
RC-In: ICP (PA7)
RC-Out: PA5
Taster an PA3 und PA4
*/

#ifndef F_CPU
    #define F_CPU 8000000UL
#endif

#include <avr/io.h>
#include <avr/eeprom.h>
#include <avr/interrupt.h>

volatile uint16_t pulse;
volatile uint8_t flag;

int main (void) {

    uint16_t center;
    
    center = 1499;
    flag = 0;
    
    //PB2 als Eingang, Pull-Up an
    DDRB &= ~(1 << PB2);
    PORTB |= 1 << PB2;
    
    //PORTA bis auf PA5 als Eingang, Pull-Up an
    DDRA &= ~( 1 << PA0 | 1 << PA2 | 1 << PA3 | 1 << PA4 |  1 << PA6 | 1 << PA7);
    PORTA |= 1 << PA0 | 1 << PA2 | 1 << PA3 | 1 << PA4 |  1 << PA6;
    
    //PA5 als Ausgang
    DDRA |= 1 << PA5;
    PORTA &= ~(1 << PA5);
    
    //Timer1, free running, prescaler 8, Inputcapture 
    OCR1A = center;
    TIMSK1 |= 1 << ICIE1;
    TCCR1B |= 1 << ICES1 | 1 << CS11;

    sei();
    
    while(1) {
    
        if(flag) {
            OCR1A = pulse;                 //OCR1A auf Pulslänge
            TCNT1 = 0;                          //Timer1 auf 0
            PORTA |= 1 << PA5;          //Servoausgang 1
            TIMSK1 |= 1 << OCIE1A;  //Comparematch Int 1A an
            flag = 0;                               //Flag zurücksetzen
        }    
    }
    return(1);
}

ISR(TIM1_CAPT_vect) {
    
    static uint16_t start;
    
    if(TCCR1B & (1 << ICES1)) {         //Wenn Capture auf steigende Flanke
        start = ICR1;                                        //Startwert lesen
        TCCR1B &= ~(1 << ICES1);            //Capture auf fallende Flanke
        TIFR1 |= 1 << ICF1;
    }
    else {                                                  //Sonst
        pulse = ICR1 - start;                          //Pulslänge = Capturewert - Startwert
        TCCR1B |= 1 << ICES1;                   //Capture auf steigende Flanke
        TIFR1 |=1 << ICF1;
        flag = 1;                                               //Flag für neuen Impuls setzen
    }
}

ISR(TIM1_COMPA_vect) {
    PORTA &= ~(1 << PA5);               //Servoausgang 0
    TIMSK1 &= ~(1 << OCIE1A);       // Comparematch Int 1A 0
 }


Im Simulator läuft das Programm korrekt ab, auch die Laufzeit stimmt.

Gruß,
Stefan

swessels

RCLine User

  • »swessels« ist der Autor dieses Themas

Wohnort: 31535 Neustadt, in der Woche HH

Beruf: Arbeitsplanung in der Luftfahzeugkomponenten - Instandsetzung

  • Nachricht senden

38

Mittwoch, 19. Januar 2011, 20:32

Kleiner Nachtrag:

ich habe aus
OCR1A = pulse; jetzt wegen der Drehrichtungsumkehr OCR1A = 2198 - pulse +900; gemacht --> Die Zucker sind wieder da. Genau wie bei der PWM - Lösung ???

Es scheint da also irgendwo Probleme zu geben.

Gruß,
Stefan

39

Mittwoch, 19. Januar 2011, 21:56

Noch ne Quelle: ACS758

swessels

RCLine User

  • »swessels« ist der Autor dieses Themas

Wohnort: 31535 Neustadt, in der Woche HH

Beruf: Arbeitsplanung in der Luftfahzeugkomponenten - Instandsetzung

  • Nachricht senden

40

Donnerstag, 20. Januar 2011, 20:18

Noch ne Variante....

Hallo zusammen,

hier noch eine Variante. Aber auch da bekomme ich den minimalen Jitter nicht weg. :(

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/*
Servoreverser - Variante OlliW
MCU ATtiny 24
Takt: 8MHz
RC-In: ICP (PA7)
RC-Out: PA5
Taster an PA3 und PA4
*/

#ifndef F_CPU
    #define F_CPU 8000000UL
#endif

#define SERVODDR DDRA
#define SERVOPORT PORTA
#define SERVO PA5

#define KEYPORT PORTA
#define KEYPIN PINA
#define KEY_UP PA3
#define KEY_DOWN PA4

#include <avr/io.h>
#include <avr/eeprom.h>
#include <avr/interrupt.h>

volatile uint16_t center;

int main (void) {

    //PB2 als Eingang, Pull-Up an
    DDRB &= ~(1 << PB2);
    PORTB |= 1 << PB2;
    
    //PORTA bis auf PA5 als Eingang, Pull-Up an
    DDRA &= ~( 1 << PA0 | 1 << PA2 | 1 << PA3 | 1 << PA4 |  1 << PA6 | 1 << PA7);
    PORTA |= 1 << PA0 | 1 << PA2 | 1 << PA3 | 1 << PA4 |  1 << PA6;
    
    //SERVO als Ausgang
    SERVODDR |= 1 << SERVO;
    SERVOPORT &= ~(1 << SERVO);

    center = 3000;
    
    //Timer1, free running, prescaler 8, Inputcapture Rising edge, IC Int an
    TCCR1B |= 1 << ICES1 | 1 << CS11;
    TIMSK1 |= 1 << ICIE1;
    
    sei();
    
    while(1) {
        asm volatile("nop");
    }
    return(1);
}

ISR(TIM1_CAPT_vect) {
     
    if(TCCR1B & (1 << ICES1)) {
        OCR1A = ICR1 + center;          //Capture + Servomitte in Comparematchregister
        TCCR1B &= ~(1 << ICES1);        //ICP auf fallende Flanke
        TIFR1 |= 1 << ICF1;             //IC Int flag löschen
    }
    else {
        SERVOPORT |= 1 << SERVO;        //Servoport auf 1
        TIMSK1 |= 1 << OCIE1A;          //Comparematch Int ein
        TCCR1B |= 1 << ICES1;           //ICP auf steigende Flanke
        TIFR1 |= 1 << ICF1;             //IC Int flag löschen
    }   
}

ISR(TIM1_COMPA_vect) {
    SERVOPORT &= ~(1 << SERVO);         //Servoausgang 0
    TIMSK1 &= ~(1 << OCIE1A);           // Comparematch Int 1A 0

    //Tastenabfrage
    if(!(KEYPIN & (1 << KEY_UP))) {
        if(center <= 3300) {
            center++;
        }
    }
    
    if(!(KEYPIN & (1 << KEY_DOWN))) {
        if(center >= 2700) {
            center--;
        }
    }
}


Wisst Ihr vielleicht noch irgendeinen Rat? ich gebs für Heute auf.....

gruß,
Stefan