Forum: Compiler & IDEs Assemblercode Anpassung


von Andre M. (Firma: keine) (murdok1980)


Lesenswert?

Es handelt sich hier um den Assemblercode eines umprogrammierten 
Fahrtreglers für ein Modell. Die Empfänger Signale werden ausgelesen und 
per PWM die entsprechenden FETs angesteuert. Der kleine Haken ist, ich 
hätte gern ein Deathband im Bereich zwischen 1179 und 1219 damit der 
Motor auch wirklich steht und 0 Volt hat. Das ist dann die 
Mittelstellung das Knüppels +\- 20. Kann man in dem Assembler Code noch 
etwas ändern? Ein Paar Werte hab ich schon an meine Fernbedienung 
angepasst.
1
;--- Brushed ESC By Rolf R Bakke, May 2012
2
3
.include "m8def.inc"
4
5
.include "macros.inc"
6
7
.def  t=r16
8
9
.org 0
10
  ldi t, low(ramend)
11
  out spl, t
12
  ldi t, high(ramend)
13
  out sph, t
14
15
16
  ;--- Port setup ---
17
18
  ;        76543210
19
  ldi t, 0b11001100
20
  out ddrc, t
21
22
  ;        76543210
23
  ldi t, 0b11111111
24
  out ddrb, t
25
26
  ;        76543210
27
  ldi t, 0b10111011
28
  out ddrd, t
29
30
31
  ;--- PWM output setup ---
32
33
  ;        76543210
34
  ldi t, 0b10100000  
35
  out tccr1a, t
36
37
  ;        76543210
38
  ldi t, 0b00010001
39
  out tccr1b, t
40
41
  ldi t, high(255)  ;set PWM range
42
  out icr1h, t
43
  ldi t, low(255)
44
  out icr1l, t
45
46
47
  ;--- arming ---
48
49
ar2:  ldi zl, 0
50
51
ar1:  rcall GetPwm
52
  brcs ar2    ;time out, reset counter
53
  
54
  ldy 1159    ;1180 orginaler Wert im Code
55
  cp  xl, yl
56
  cpc xh, yh
57
  brlo ar2    ;too low, reset counter
58
59
  ldy 1239    ;1220 orginaler Wert im Code
60
  cp  xl, yl
61
  cpc xh, yh
62
  brsh ar2    ;too high, reset counter
63
64
  inc zl      ;in range, increase counter
65
  cpi zl, 50    ;50 in a row?
66
  brne ar1    ;no, arming not OK
67
68
69
  ;--- Main loop ---
70
71
ma1:  rcall GetPwm    ;get input PWM value
72
73
  subi xl, low(1199)  ;subtract 1500 uS    1200 orginaler Wert im Code 
74
  sbci xh, high(1199)            ;1200 orginaler Wert im Code
75
76
  brcs ma4    ;wich direction?
77
78
79
  ;--- forward ---
80
81
  clr t      ;turn off B half-bridge PWM
82
  out ocr1bh, t
83
  out ocr1bl, t
84
  rcall delay    ;wait one PWM cycle to let the B PWM hardware finish it current cycle
85
  a_top_off    ;set top transistors for forward configuration
86
  b_top_on
87
  out ocr1ah, xh    ;update A half-bridge with current throttle
88
  out ocr1al, xl
89
90
  rjmp ma1
91
92
93
  ;--- reverse ---
94
95
ma4:  clr yl      ;Y = NEG(X)
96
  clr yh
97
  sub yl, xl
98
  sbc yh, xh
99
100
  clr t      ;turn off A half-bridge PWM
101
  out ocr1ah, t
102
  out ocr1al, t
103
  rcall delay    ;wait one PWM cycle to let the A PWM hardware finish it current cycle
104
  b_top_off    ;set top transistors for reverse configuration
105
  a_top_on
106
  out ocr1bh, yh    ;update B half-bridge with current throttle
107
  out ocr1bl, yl
108
109
  rjmp ma1
110
111
112
  ;--- SUBS ---
113
114
  ;--- delay ----
115
  
116
117
delay:  ldi t, 0    ;96 uS delay
118
de1:  dec t
119
  brne de1
120
  ret
121
122
  
123
124
  ;--- get PWM input value ---
125
126
127
GetPwm:
128
  clr xl
129
  clr xh
130
131
  ;wait for low to high transition on ppm input
132
133
  ldy 0xffff
134
ge1:  sbiw y, 1
135
  brcs ge5  ;timeout (49mS)
136
  sbic pind, 2
137
  rjmp ge1
138
139
  ldy 0xffff    
140
ge2:  sbiw y,1
141
  brcs ge5  ;timeout (49mS)
142
  sbis pind, 2
143
  rjmp ge2
144
145
  ;measure high pulse time, 1.25 uS = 1 count
146
147
  ldy 8000
148
ge3:  adiw x, 1  ;2
149
  sbiw y, 1  ;2
150
  brcs ge5  ;1  ;exit with c=1 if timeout (10mS)
151
  nop    ;1
152
  nop    ;1
153
  sbic pind, 2  ;1
154
  rjmp ge3  ;2
155
156
  ;set to 1500uS if below 900uS or above 2100uS
157
158
  ldy 720
159
  cp  xl, yl
160
  cpc xh, yh
161
  brlo ge4  
162
  ldy 1680
163
  cp  xl, yl
164
  cpc xh, yh
165
  brlo ge6  
166
167
ge4:  ldx 1199    ;out of limits, set to 1500uS     1200 orginaler Wert im Code
168
169
  ;
170
171
ge6:  clc      ;exit with c=0 if no timeout
172
  ret
173
174
ge5:  ldx 1199    ;time out, set to 1500uS and c=1  1200 orginaler Wert im Code
175
  ret



Hier noch die Include

1
.macro  a_top_on
2
  sbi portd, 4
3
.endmacro
4
5
.macro  a_top_off
6
  cbi portd, 4
7
.endmacro
8
9
10
11
.macro  b_top_on
12
  sbi portd, 5
13
.endmacro
14
15
.macro  b_top_off
16
  cbi portd, 5
17
.endmacro
18
19
20
21
22
.macro  ldx
23
  ldi xl, low(@0)
24
  ldi xh, high(@0)
25
.endmacro
26
.macro  ldy
27
  ldi yl, low(@0)
28
  ldi yh, high(@0)
29
.endmacro
30
.macro  ldz
31
  ldi zl, low(@0)
32
  ldi zh, high(@0)
33
.endmacro
34
 
35
36
37
38
.macro  debug_on
39
  sbi portb, 5
40
.endmacro
41
42
.macro  debug_off
43
  cbi portb, 5
44
.endmacro
Ich hoffe es hat jemand eine Lösung. Ich kann kein Assembler nur bissl 
Arduino für den Hausgebrauch.
Größe Andre

von Karl M. (Gast)


Lesenswert?

Andre,

warum ein 2.tes mal dieses Thema?
Da wird sich doch keiner rantrauen mangels Testhardware.
Was spricht gegen eine Hochsprache ? Dein Können ?

von Andre M. (Firma: keine) (murdok1980)


Lesenswert?

Ja ich kann es leider nicht. Ich glaub nicht das ich das noch lerne. 
Etwas Arduino bekomm ich gerade noch hin. Deswegen wende ich mich an 
dich. Ich hab versucht den Code zu verstehen aber ich begreife nicht. 
Die Hardware kann ich beschreiben.
Ich vermute wenn ich mir den Code anschaue muss noch eine Berechnung 
rein.
Grüße
Andre

: Bearbeitet durch User
von Thomas H. (Firma: CIA) (apostel13)


Lesenswert?

Klar geht das. Du fragst aber offensichtlich nach "Wer hat Lust das für 
mich zu machen".

von Franz Rapid (Gast)


Lesenswert?

Thomas H. schrieb:
> Du fragst aber offensichtlich nach "Wer hat Lust das für
> mich zu machen".

Du hast offenbar die Lust nicht. Das ist in Ordnung -nur: Warum 
antwortest Du dann überhaupt?

von MWS (Gast)


Lesenswert?

Franz Rapid schrieb:
> Du hast offenbar die Lust nicht. Das ist in Ordnung -nur: Warum
> antwortest Du dann überhaupt?

Einige Gründe: weil's ein Diskussionsforum ist, er schreiben kann 
solange er lustig ist und es Dich damit einen feuchten Kehricht angeht.

Andre M. schrieb:
> ma4:  clr yl      ;Y = NEG(X)
>   clr yh
>   sub yl, xl
>   sbc yh, xh

YL auf 50 setzten, statt mit CLR auf 0. Nach SUB/SBC auf positiv (carry) 
testen, solange positiv, YL löschen. Das war's schon. Die "Deadzone" 
befindet sich damit im negativen Bereich (Rückwärtsgang) und solange 
etwas weniger Leistung dort ok ist, stört's dort auch nicht. Das kann 
man natürlich auch in der Auswertung auf "positiv" ähnlich machen, um's 
genau auf die Mitte um 1200 zu legen. Oder man zieht mehr als 1199 ab 
und murkst es so zurecht ;D

Als Beispiel kann der gezeigte Code dienen, alle zu verwendeten Opcodes 
sind dort in ähnlicher Form und Kombination bereits verwendet. Es ist 
nur ein wenig Kombinationsgabe notwendig und bei ein wenig Eigenleistung 
helfen die Forumsmitglieder sicher gerne.

von Andre Meschke (Gast)


Lesenswert?

Hallo MWS,

Danke, das ist der erste konstruktive Beitrag. Ich bin auch gewillt mich 
mit dem Code auseinander zu setzen. Es ist halt schwer wenn man gänzlich 
bei Null anfängt. Da hilft ein Schubs in die richtige Richtung ungemein.
Ich werd mich mal versuchen. Ich hoffe ich bekomme es auch in der 
positiven Richtung (Forwärtsgang) hin. Werd jetzt mich gleich hinsetzen 
und den Code studieren.
Werde über das Ergebnis berichten.

Grüße

André

von Andre M. (Firma: keine) (murdok1980)


Lesenswert?

Also wenn ich das jetzt richtig verstehe, bezeichnet yl das Register 
welches mit dem Befehl clr auf Null gesetzt wird.
Ich muss jetzt den Befehl finden der dem yl Register den Wert 50 
zuweist.

> ma4:  clr yl  ;hier muss der Befehl rein für die Wert=50 Zuweisung
>   clr yh
>   sub yl, xl
>   sbc yh, xh
                ;hier soll yl überprüft werden ob der Wert positiv ist
und solange er positiv ist soll yl gelöscht werden (clr yl nehme ich 
an?)

Bin ich auf dem richtigen Weg?
Und bitte mich nicht gleich wieder in der Luft zerreißen.

Grüße

André

von MWS (Gast)


Lesenswert?

MWS schrieb:
> YL auf 50 setzten, statt mit CLR auf 0. Nach SUB/SBC auf positiv
> (carry) testen, solange positiv, YL löschen.

War ein Denkfehler.
Korrektur bzw. Auflösung:
1
ma4:
2
  clr yl
3
  clr yh
4
  sub yl, xl
5
  sbc yh, xh
6
7
  sbiw YL, 50   ; Umfang der Deadzone
8
  brcc outofDZ
9
  clr yl
10
  clr yh
11
outofDZ:
12
13
  clr t      ;turn off A half-bridge PWM
14
  out ocr1ah, t
15
  ; ...
Nach dem sbiw muss die Schreibweise verwendetet werden, die der 
Assembler fordert, zum Beispiel "sbiw YH:YL, 50"

von Andre M. (Firma: keine) (murdok1980)


Lesenswert?

Ich wieder
"Nach dem sbiw muss die Schreibweise verwendetet werden, die der
Assembler fordert, zum Beispiel "sbiw YH:YL, 50" "
Nachdem ich mir jetzt jeden Befehl übersetze kommt geringfügig Licht ins 
dunkle.

Der Befehl sbiw YH:YL, 50 bedeutet doch subtrahiere vom Registerpaar 
YH/YL den Wert 50. Muss das YH und YL nicht klein geschrieben werden? 
Ich benutze AVR Studio 4.19.
Funktioniert der sbiw Code für Vorwärts auch so ähnlich?

von MWS (Gast)


Lesenswert?

Andre M. schrieb:
> Der Befehl sbiw YH:YL, 50 bedeutet doch subtrahiere vom Registerpaar
> YH/YL den Wert 50. Muss das YH und YL nicht klein geschrieben werden?

Schreib's so, dass der Assembler nicht meckert, ich habe nicht das 
Studio verwendet, um's zu testen, müsste ich also erst machen, das 
kannst Du auch selbst.

> Funktioniert der sbiw Code für Vorwärts auch so ähnlich?

Er würde sogar identisch so funktionieren, unterschiedliche Labelnamen 
vorausgesetzt.

von Andre M. (Firma: keine) (murdok1980)


Lesenswert?

Ok ich werde das mal vorsichtig ausprobieren. Hauptsache der Regler 
bleib heile. Bin leider nicht zu Hause, werde jetzt noch den Code weiter 
übersetzen damit ich den Inhalt verstehe.
Für Vorwärts müsste es dann glaub ich so aussehen

ma1:  rcall GetPwm    ;get input PWM value

  subi xl, low(1199)  ;subtract 1500 uS
  sbci xh, high(1199)

sbiw XL:XH, 50   ; Umfang der Deadzone
  brcc outofDZ2
  clr xl
  clr xh
outofDZ2:

  brcs ma4    ;wich direction?

von MWS (Gast)


Lesenswert?

Andre M. schrieb:
> Für Vorwärts müsste es dann glaub ich so aussehen

Da glaubst Du falsch, der SBIW-Block muss nach dem brcs ma4 stehen. 
Dafür gibt's mehrere Gründe, einer davon ist, dass Brcs das intakte 
Carry-Flag aus dem SBI/SBCI benötigt, welches durch das SBIW zerstört 
würde.

Außerdem muss der DZ-Wert halbiert werden, da er nun bei Vor- und 
Rückwärts abgezogen wird.

Im Übrigen würde ich das nur bei Rückwärts einbauen. Vorausgesetzt der 
Code ist so angepasst, dass ein maximaler Knüppelausschlag gerade eben 
100 Prozent Motorleistung ergibt, so fehlt der abgezogene DZ-Wert.

D.h. theoretisch wird der Motor dann keine 100 Prozent erreichen und das 
Messergebnis der Pulslänge müsste skaliert werden. Geht, aber macht 
etwas mehr Aufwand. Die einfache Alternative wäre etwas weniger Leistung 
im Rückwärtsgang.

Kann aber auch sein, dass bereits jetzt die Leistung 100 Prozent 
deutlich vor Ende des Knüppelausschlags erreicht, dann wird's nichts 
ausmachen.

von Andre M. (Firma: keine) (murdok1980)


Lesenswert?

Ok das versteh ich. Als müsste der Wert auf 25 gesetzt werden.

Für vorwärts so...

ma1:  rcall GetPwm    ;get input PWM value

  subi xl, low(1199)  ;subtract 1500 uS
  sbci xh, high(1199)

brcs ma4    ;wich direction?

sbiw XL:XH, 25   ; Umfang der Deadzone
  brcc outofDZ2
  clr xl
  clr xh
outofDZ2:

Für rückwärts so...

ma4:
  clr yl
  clr yh
  sub yl, xl
  sbc yh, xh

  sbiw YL, 25   ; Umfang der Deadzone
  brcc outofDZ
  clr yl
  clr yh
outofDZ:

Ist es richtig das ich bei vorwärts outofDZ2 schreibe und bei rückwärts 
outofDZ. Die Namen müssen doch unterschiedlich sein oder.

von MWS (Gast)


Lesenswert?

Andre M. schrieb:
> Ist es richtig

Ja.

von Andre M. (Firma: keine) (murdok1980)


Lesenswert?

Kurze Rückmeldung Code sieht jetzt so aus und Deathband ist ausreichend.
1
ma1:  rcall GetPwm    ;get input PWM value
2
3
  subi xl, low(1199)  ;subtract 1500 uS    1200 Wert
4
  sbci xh, high(1199)            ;1200Wert
5
6
  brcs ma4    ;wich direction?
7
8
  sbiw xl:xh, 50   ; Umfang der Deadzone
9
  brcc outofDZ2
10
    clr xl
11
    clr xh
12
  outofDZ2:
13
14
15
16
  ;--- forward ---
17
18
  clr t      ;turn off B half-bridge PWM
19
  out ocr1bh, t
20
  out ocr1bl, t
21
  rcall delay    ;wait one PWM cycle to let the B PWM hardware finish it current cycle
22
  a_top_off    ;set top transistors for forward configuration
23
  b_top_on
24
  out ocr1ah, xh    ;update A half-bridge with current throttle
25
  out ocr1al, xl
26
27
  rjmp ma1
28
29
30
  ;--- reverse ---
31
32
ma4:  clr yl      ;Y = NEG(X)
33
  clr yh
34
  sub yl, xl
35
  sbc yh, xh
36
37
  sbiw yl:yh, 50   ; Umfang der Deadzone
38
  brcc outofDZ
39
  clr yl
40
  clr yh
41
  outofDZ:
42
43
44
45
  clr t      ;turn off A half-bridge PWM
46
  out ocr1ah, t
47
  out ocr1al, t
48
  rcall delay    ;wait one PWM cycle to let the A PWM hardware finish it current cycle
49
  b_top_off    ;set top transistors for reverse configuration
50
  a_top_on
51
  out ocr1bh, yh    ;update B half-bridge with current throttle
52
  out ocr1bl, yl
53
54
  rjmp ma1
Eine Kleinigkeit ist mir noch aufgefallen, ich hoffe ich kann das 
beschreiben. Also Knüppel voll vorwärts Motor dreht vorwärts, wenn ich 
dann den Knüppel loslasse, fällt er in Mittelstellung zurück. Kommt er 
dabei geringfügig in Richtung rückwärts ruckt der Motor weil er noch im 
Ausdrehen ist und in Richtung rückwärts umgepolt wird. Das passiert 
obwohl sich der Knüppel im Deathband befindet. Wenn man das noch in den 
Griff bekäme wärs perfekt.
Grüße
Abdré

von MWS (Gast)


Lesenswert?

Ich würde erst einmal die Fernsteuerung nach Vorwärts trimmen, damit der 
Schuldige eindeutig festzumachen ist.

Dann würde sich die Frage stellen, warum Rückwärts bei Leistung 0 
irgendetwas anderes bewirkt als Vorwärts bei Leistung 0.

Könnte man meines Erachtens sauber lösen, wenn man zu Vor-/Rückwärts 
einen dritten Status einführt, in dem nur die PWMs auf 0 gesetzt werden, 
die Richtung dagegen unverändert bleibt.

Das würde mehr Umbaumaßnahmen erfordern, da reicht's nicht mehr aus, nur 
zwei kleine Blöcke einzufügen.

von Andre M. (Firma: keine) (murdok1980)


Lesenswert?

Mit der Trimmung hab ich schon probiert, weil ich den Gedanken auch 
hatte. Das verschiebt nur de Auslösepunkt. In einer Richtung bekommt man 
es dann hin. Es passiert auch nur wenn man den Knüppel in die 
Nullstellung schnippsen läßt. Macht man es langsam und er rutscht nicht 
kurz über den Nullpunkt drüber passiert nix.
Gefährlich wird dier Ruck für die Abtriebswelle am Motor wegen den 
Scherkräften.
Langsam wird auch klar warum der Autor des Codes die Variante verworfen 
hat. Es gib ja noch einen anderen. Dort ist mir aber die PWM Frequenz zu 
niedrig und der Regelbererich zu klein.
Man könnte höchstens dort mal schauen ob das mit weniger Aufwand zu 
ändern ist.
Soll ich den Code mal posten ?
Grüße
Andre

von Karl H. (kbuchegg)


Lesenswert?

Andre M. schrieb:

> Soll ich den Code mal posten ?

Wie wärs, wenn wir mitsammen einen neuen schreiben - mit Arduino 
Bordmitteln.
D.h. falls deine Hardware so aufgebaut ist, dass man mit analogWrite auf 
die beiden Pins deiner PWM Halbbrücken ran kommt.

mehr als ein
1
#define inputPin           Pinnummer des Eingangs an dem der Kanalpuls reinkommt
2
#define leftBridge         Pinnummer des Ausgangs, an dem die eine Halbbrücke hängt
3
#define rightBridge        Pinnummer des Ausgangs, an dem die andere Halbbrücke hängt
4
5
#define CENTER_PULS      1500
6
#define DEADBAND           50
7
8
void setup()
9
{
10
  ...
11
}
12
13
void loop()
14
{
15
  unsigned long pulsDuration;
16
17
  pulsDuration = pulseIn( inputPin, HIGH, 20000 );   // 20ms Timeout
18
19
  if( pulsDuration > 500 && pulsDuration < 2500 )                // gültiger Puls ?
20
21
    // vorwärts?
22
    if( pulsDuration > CENTER_LENGTH + DEADBAND / 2 )
23
    {
24
      // ab dem Einsetzpunkt über der Knüppelhälfte bis zum
25
      // Ende des theoretischen Bereichs (2ms) umrechnen auf
26
      // PWM Werte von 0 bis 255
27
      pulsDuration = min( pulsDuration, 2000 );
28
      pwmValue = map( pulsDuration, CENTER_LENGTH + DEADBAND / 2, 2000, 0, 255 );
29
30
      analogWrite( leftBridge, pwmValue )
31
      analogWrite( rightBridge, 0 );
32
    }
33
34
    // rückwärts ?
35
    else if( pulsDuration < CENTER_LENGTH - DEADBAND / 2 )
36
    {
37
      // ab dem Einsetzpunkt unter der Knüppelhälfte bis zum
38
      // Ende des theoretischen Bereichs (1ms) umrechnen auf
39
      // PWM Werte von 0 bis 255
40
      pulsDuration = max( pulsDuration, 1000 );
41
      pwmValue = map( pulsDuration, 1000, CENTER_LENGTH - DEADBAND / 2, 255, 0 );
42
43
      analogWrite( leftBridge, 0 );
44
      analogWrite( rightBridge, pwmValue );
45
    }
46
47
    else {  // Knüppel steht in Mittelstellung, alles aus
48
      analogWrite( LEFT_BRIDGE, 0 );
49
      analogWrite( RIGHT_BRIDGE, 0 );
50
    }
51
  }
52
}
ist der jetzige Code nämlich im Prinzip nicht.

Das ist im Prinzip die ganze Funktionalität deines Assembler Programms 
(des ersten), wobei der Arduino Code jetzt schon komfortabler ist, was 
die Einstellung der Bereichsgrenzen angeht. Was noch fehlt, das ist die 
Einschaltsicherung, die verhindert, dass der Motor nach dem Einschalten 
loslaufen kann, wenn der Knüppel nicht in Mittelstellung steht. (Und 
eine setup() musst du noch schreiben, in der du die Eingänge bzw. 
Ausgänge richtig definierst)
Worums mir geht: Das Programm sollte auch für dich soweit verständlich 
sein, dass du es an deine Bedürfnisse anpassen kannst, ohne jemanden 
dazu zu benötigen. Ich will dich keineswegs dazu überreden, das ganze 
nicht in Assembler zu machen. Da du aber erwähnt hast, dass du 
normalerweise "Ardunio für den Hausgebrauch" programmieren kannst, denke 
ich, dass du dir hier 100 mal leichter tust. Und dann kriegst du auch 
das, was du willst.

Wie sieht eigentlich die Hardware dazu aus?

: Bearbeitet durch User
von Andre M. (Firma: keine) (murdok1980)


Lesenswert?

Da ist der andere Code, nur wenn du noch Geduld mit mir hast.
1
;--- Brushed ESC V2 By Rolf R Bakke, May 2012. Braking with reverse power and adjustable dragbrake.
2
3
4
;**** SETTINGS ****
5
6
.equ  BrakeStrength = 0  ;0 to 127
7
8
.equ  DeadBand = 5    ;n/127 parts
9
10
.equ  ThrottleNeutral = 1500  ;uS
11
12
;******************
13
14
15
.include "m8def.inc"
16
17
.include "macros.inc"
18
19
.def  t=r16
20
21
.def  Phase=r17
22
23
.def  PwmOut=r18
24
25
.def  Throttle=r19
26
27
.def  tisp=r20
28
29
.def  sregsave=r21
30
31
.def  resetflags=r22
32
33
.def  Counter=r23
34
35
36
.org 0
37
  rjmp reset
38
  rjmp unused
39
  rjmp unused
40
  rjmp unused
41
  rjmp unused
42
  rjmp unused
43
  rjmp unused
44
  rjmp unused
45
  rjmp unused
46
  rjmp timer0overflow
47
  rjmp unused
48
  rjmp unused
49
  rjmp unused
50
  rjmp unused
51
  rjmp unused
52
  rjmp unused
53
  rjmp unused
54
  rjmp unused
55
  rjmp unused
56
57
unused:  reti
58
59
reset:  in resetflags, mcucsr
60
  clr t
61
  out mcucsr, t
62
63
  ldi t, low(ramend)
64
  out spl, t
65
  ldi t, high(ramend)
66
  out sph, t
67
68
69
  ;--- Port setup ---
70
71
  ;        76543210
72
  ldi t, 0b11001100
73
  out ddrc, t
74
75
  ;        76543210
76
  ldi t, 0b11111111
77
  out ddrb, t
78
79
  ;        76543210
80
  ldi t, 0b10111011
81
  out ddrd, t
82
83
84
  ;--- Timer 1 setup ---
85
86
  ;        76543210
87
  ldi t, 0b00000000  
88
  out tccr1a, t
89
90
  ;        76543210
91
  ldi t, 0b00000010  ;1 MHz
92
  out tccr1b, t
93
94
95
  ;--- ISR setup ---
96
97
  ;        76543210
98
  ldi t, 0b00000001  
99
  out tccr0, t
100
101
  ;        76543210
102
  ldi t, 0b00000001  
103
  out timsk, t
104
105
106
  ;--- ADC setup ---
107
108
  ;        76543210
109
  ldi t, 0b01000001  
110
  out admux, t
111
112
  ;        76543210
113
  ldi t, 0b11100111  
114
  out adcsra, t
115
116
117
  ;--- Variables setup ---
118
119
  clr Throttle
120
121
122
  ;--- Reset cause signalling ---
123
124
  clr zl    ;wait
125
  rcall wms
126
  rcall wms
127
  rcall wms
128
  rcall wms
129
  rcall wms
130
131
  sbrs resetflags, 3  ;watchdog reset
132
  rjmp re1
133
134
  ldx 500
135
  ldy 500
136
  rcall sound
137
  rjmp re4
138
139
re1:  sbrs resetflags, 2  ;Brown out reset
140
  rjmp re2
141
142
  ldx 300
143
  ldy 900
144
  rcall sound
145
  ldi zl,0
146
  rcall wms
147
  ldx 300
148
  ldy 1000
149
  rcall sound
150
  ldi zl,0
151
  rcall wms
152
  ldx 300
153
  ldy 1100
154
  rcall sound
155
  rjmp re4
156
157
re2:  sbrs resetflags, 1  ;external reset
158
  rjmp re3
159
160
  ldx 300
161
  ldy 1000
162
  rcall sound
163
  ldi zl,0
164
  rcall wms
165
  ldx 300
166
  ldy 900
167
  rcall sound
168
  rjmp re4
169
170
re3:  sbrs resetflags, 0  ;power on reset
171
  rjmp re4
172
  ldx 500
173
  ldy 1000
174
  rcall sound
175
  rjmp re4
176
177
re4:  
178
179
  ;--- arming ---
180
181
ar2:  ldi Counter, 0
182
183
ar1:  rcall GetPwm
184
  
185
  ldy ThrottleNeutral - 20
186
  cp  xl, yl
187
  cpc xh, yh
188
  brlo ar2    ;too low, reset counter
189
190
  ldy ThrottleNeutral + 20
191
  cp  xl, yl
192
  cpc xh, yh
193
  brsh ar2    ;too high, reset counter
194
195
  ldy 500      ;in range, make short sound
196
  ldx 5
197
  rcall sound
198
199
  inc Counter    ;increase counter
200
  cpi Counter, 50    ;50 in a row?
201
  brne ar1    ;no, arming not OK
202
203
204
  ;--- Armed sound ---
205
206
  ldi Counter, 20
207
  ldy 2000
208
ar3:  ldx 20
209
  rcall sound
210
  sbiw y, 63
211
  dec Counter
212
  brne ar3
213
214
  clr zl
215
  rcall wms
216
217
  ;--- Main loop ---
218
219
  sei
220
221
ma1:  rcall GetPwm    ;get input PWM value
222
  
223
  subi xl, low(ThrottleNeutral)  ;subtract throttle neutral
224
  sbci xh, high(ThrottleNeutral)
225
226
  asr xh      ;divide by 2
227
  ror xl
228
229
  ldy 127      ;limit upper value
230
  cp  xl, yl
231
  cpc xh, yh
232
  brlt ma2
233
  ldx 127
234
ma2:
235
  ldy -127    ;limit lower value
236
  cp  xl, yl
237
  cpc xh, yh
238
  brge ma3
239
  ldx -127
240
ma3:
241
  mov Throttle, xl  ;set throttle
242
243
244
ma5:  in yl, adcl    ;High temp?
245
  in yh, adch
246
  
247
  ldx 200
248
  cp yl, xl
249
  cpc yh, xh
250
  brsh ma4
251
252
  ldx 150      ;yes, sound the alarm until it has cooled down
253
  ldy 1200
254
  rcall sound
255
  ldx 100
256
  ldy 2000
257
  rcall sound
258
  rjmp ma5
259
260
ma4:  rjmp ma1
261
262
263
  ;--- SUBS ---
264
  
265
266
  ;--- get PWM input value ---
267
268
269
GetPwm:
270
  ;wait for low to high transition on ppm input
271
272
ge1:  sbic pind, 2
273
  rjmp ge1
274
ge2:  sbis pind, 2
275
  rjmp ge2
276
277
  ;start counting
278
279
  clr t
280
  out tcnt1h, t
281
  out tcnt1l, t
282
283
  ;wait for low edge
284
285
ge3:  sbic pind, 2
286
  rjmp ge3
287
288
  ;get time
289
290
  in xl, tcnt1l
291
  in xh, tcnt1h
292
293
294
  in yl, adcl    ;temperature compensation
295
  in yh, adch
296
297
  subi yl, low(823)
298
  sbci yh, high(823)
299
300
  asr yh
301
  ror yl
302
  asr yh
303
  ror yl
304
  asr yh
305
  ror yl
306
307
  sub xl, yl
308
  sbc xh, yh
309
310
  ret
311
312
313
  ;--- ISR ---
314
315
timer0overflow:
316
317
  in sregsave, sreg
318
319
  ldi tisp, 0xb0    ;reload ISR counter
320
  out tcnt0, tisp
321
322
;debug_on
323
324
  inc Phase    ;PWM generator
325
  cpi Phase, 128
326
  brne tm1
327
328
;debug_on
329
330
  ;this part is run once, right at the start of the PWM period. 
331
332
  clr Phase
333
334
  mov PwmOut, Throttle  ;sample throttle value
335
336
  cpi PwmOut, DeadBand  ;brake or power?
337
  brge tm4
338
  cpi PwmOut, -DeadBand
339
  brlt tm4
340
341
  a_bottom_on    ;Brake.
342
  b_bottom_on
343
  
344
  ldi PwmOut, BrakeStrength
345
  rjmp tm2
346
347
tm4:  tst PwmOut    ;Power. Which direction?
348
  brmi tm3
349
350
351
  ;forward
352
353
;debug_on
354
355
  a_top_on
356
  nop    ;delay to let top FET turn on before the bottom FET (NFET are better at switching under load)
357
  nop
358
  nop
359
  b_bottom_on
360
  rjmp tm2
361
362
363
  ;reverse
364
365
tm3:
366
;debug_on
367
  neg PwmOut
368
369
  b_top_on
370
  nop    ;delay to let top FET turn on before the bottom FET
371
  nop
372
  nop
373
  a_bottom_on
374
  rjmp tm2
375
376
377
  ; This part turns off the transistors when Phase is => PwmOut
378
379
tm1:  cp Phase, PwmOut
380
  brlo tm2
381
382
  a_bottom_off  ;bottom off first to let the top switch without current
383
  b_bottom_off
384
  a_top_off
385
  b_top_off
386
387
388
  ;exit
389
tm2:
390
;debug_off
391
  out sreg, sregsave
392
  reti
393
394
395
396
  ;--- Sound generation ---
397
398
sound:  cli
399
400
  a_bottom_off
401
  b_bottom_off
402
  a_top_off
403
  b_top_off
404
405
  ldz 100
406
  rcall delay
407
408
so1:  a_top_on
409
  nop
410
  nop
411
  nop
412
  b_bottom_on
413
414
  ldz 200
415
  rcall delay
416
  
417
  a_bottom_off
418
  b_bottom_off
419
  a_top_off
420
  b_top_off
421
422
  movw z, y
423
  rcall delay
424
425
  b_top_on
426
  nop
427
  nop
428
  nop
429
  a_bottom_on
430
431
  ldz 200
432
  rcall delay
433
  
434
  a_bottom_off
435
  b_bottom_off
436
  a_top_off
437
  b_top_off
438
439
  movw z, y
440
  rcall delay
441
442
  sbiw x,1
443
  brne so1
444
  
445
  sei
446
  ret
447
448
449
  ;--- Delay ---
450
451
delay:  sbiw z, 1
452
  brne delay
453
  ret
454
455
wms:   ldi t,235  ; wait zl ms
456
wm1:    ldi zh,11  ;34
457
wm2:    dec zh
458
    brne wm2
459
   dec t
460
   brne wm1
461
  dec zl
462
  brne wms
463
  ret
Der ist auch umfangreicher mit Sound fürs Arming, Temperaturüberwachung 
usw.

von Andre M. (Firma: keine) (murdok1980)


Lesenswert?

Haben uns gerade knapp verfehlt. Die Hardware Liste ich mal auf bin 
gerade unterwegs. Wow das sieht übersichtlich aus.

von Andre M. (Firma: keine) (murdok1980)


Lesenswert?

Mit dem Arduino Nano kann ich ein Taster auslesen hab damit auch erst 
vor nem halben Jahr mal experimentiert. Ich würde schon gern mit dem 
Atmega8 arbeiten, welcher auf dem Fahrtenregler sitzt. Die 
Programmierpins sind rausgeführt und ich nutze nen USB Programmer zum 
flashen des HEX.
Der Atmega8 müsste aber auch mit Arduino IDE zu programmieren gehen. 
Dafür gibt es hier auch ein Projekt 
http://www.kellerwerftcommunity.de/t417f173-KeMo-Projekt-ein-eigener-Regler-auf-Arduino-Basis.html
Dort wird fast das gleiche mit nem anderen Fahrtregler gemacht. Auch nen 
Atmega8 allerdings mit N/N Fet Treibern. Diesen Regler habe ich auch da 
und auch schon die Software ausprobiert. Dort ist auch der Regelbereich 
etwas klein und die mir zu niedrige PWM wird per Software erzeugt und 
nicht über die Hardwaretimer.

von Karl H. (kbuchegg)


Lesenswert?

Andre M. schrieb:
> Haben uns gerade knapp verfehlt. Die Hardware Liste ich mal auf bin
> gerade unterwegs. Wow das sieht übersichtlich aus.

Genau darum gehts. Das ist alles keine Raketentechnik. Und mit Arduino 
Bordmitteln schon gar nicht. Im Grunde ist es nur die Kombination aus 
pulseIn und analogWrite. Wobei es nur um die Verteilung an den jeweilis 
richtigen analogWrite je nach Pulslänge geht.

Sollte die PWM Frequenz nicht ausreichen, kann man immer noch so 
nachhelfen
http://playground.arduino.cc/Code/PwmFrequency
und weiter mit analogWrite arbeiten oder den PWM Teil mit dem Timer 
selbst übernehmen.

: Bearbeitet durch User
von Andre M. (Firma: keine) (murdok1980)


Lesenswert?

Mit dem normalen Arduino Nano gehen aber nur bestimmte Frequenzen, das 
war ja damals mein Problem. Ich brauche wenigsten 16 bis 18 khz.
In dem von mir oben genannten Forum ist der Ansatz ziemlich gut nur das 
PWM war nicht so ganz der Bringer.

von Karl H. (kbuchegg)


Lesenswert?

Andre M. schrieb:
> Mit dem normalen Arduino Nano gehen aber nur bestimmte Frequenzen, das
> war ja damals mein Problem. Ich brauche wenigsten 16 bis 18 khz.
> In dem von mir oben genannten Forum ist der Ansatz ziemlich gut nur das
> PWM war nicht so ganz der Bringer.

Na ja.
Dann machst du eben die beiden PWM 'mit der Hand'.
Ist ja kein Beinbruch. Timer entsprechend aufsetzen und anstelle von 
analogRead dann eben eine Zuweisung an entweder OCR1A oder OCR1B. Der 
Rest bleibt deswegen immer noch gleich. Weder pulseIn noch map sind vom 
Timer abhängig.

Abgesehen davon sehe ich noch nicht, warum beim Nano dieselbe Technik 
wie im verlinkten PWM-Frequenz Einsteller nicht funktionieren sollte. 
Ist ja auch nur ein Mega328 auf dem Board. Maximal die entsprechenden 
Vorteiler könnten andere sein.
Im Zweifel kann man natürlich auch den Timer komplett mit einer PWM mit 
variablem TOP Wert übernehmen. So wie das auch im Assembler Beispiel 
gemacht wird.

: Bearbeitet durch User
von Andre M. (Firma: keine) (murdok1980)


Lesenswert?

Also vom Prinzip her ist es mir egal ob wir das in c oder assembler 
machen. Ich werd mir die Nacht noch bissl die Assembler Lernvorlage zu 
gemüte führen. Ich würde gern in beides begreifen.
Also machen wir jetzt in Assembler weiter oder Arduino IDE.
Für den 2. Regler hätte ich sogar einen Schaltplan da.
Muss mich ja bissl vorbereiten.

von Karl H. (kbuchegg)


Lesenswert?

Karl H. schrieb:

> Im Zweifel kann man natürlich auch den Timer komplett mit einer PWM mit
> variablem TOP Wert übernehmen. So wie das auch im Assembler Beispiel
> gemacht wird.

Edit:
Allerdings:
Wenn ich so nachrechne. Bei 16Mhz, einem 16 Bit Timer, Vorteiler 1, und 
einer 10 Bit PWM, erreicht man eine PWM Frequenz von 15625Hz. Sollte 
doch reichen. Dann hat man eben im map nicht 255 stehen sondern 1023.

von Karl H. (kbuchegg)


Lesenswert?

Andre M. schrieb:
> Also vom Prinzip her ist es mir egal ob wir das in c oder assembler
> machen.

Im Prinzip ist es völlig wurscht.
Denn die PWM erzeugt ja sowieso der Timer, sobald man in die richtigen 
Steuerregister die richtigen Werte schreibt.

FAQ: Timer

Aber das ganze drumherum ist für dich viel leichter anpassbar!

Ob du in Assembler
1
  ldi t, 0b10100000  
2
  out tccr1a, t

oder in C
1
  TCCR1A = 0b10100000;

schreibst, ist ja Jacke wie Hose. Nur das man natürlich nicht so 
bescheuert ist, da eine Binärkonstante zu schreiben, sondern die 
Bitnamen benutzt.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Also. An welche Pins sind denn die Halbbrücken angeschlossen?
Sind die so, dass man mit der Timer-PWM da rann kommt.

von Karl H. (kbuchegg)


Lesenswert?

Karl H. schrieb:
> Karl H. schrieb:
>
>> Im Zweifel kann man natürlich auch den Timer komplett mit einer PWM mit
>> variablem TOP Wert übernehmen. So wie das auch im Assembler Beispiel
>> gemacht wird.
>
> Edit:
> Allerdings:
> Wenn ich so nachrechne. Bei 16Mhz, einem 16 Bit Timer, Vorteiler 1, und
> einer 10 Bit PWM, erreicht man eine PWM Frequenz von 15625Hz. Sollte
> doch reichen. Dann hat man eben im map nicht 255 stehen sondern 1023.

Wobei:
Da würde ich nicht lange fackeln und eine 9 Bit 'Phase and Frequency 
correct' PWM nehmen. Das vermeidet den Sonderfall des Spikes in den 
Extremwerten und eine 9 Bit Auflösung (512 verschiedene Stufen pro 
Seite) ist immer noch gross genug.

von MWS (Gast)


Lesenswert?

Andre M. schrieb:
> Also machen wir jetzt in Assembler weiter oder Arduino IDE.

Mit dem Karl Heinz machst Du in C weiter, da er dahingehend 
missionarisch tätig ist, außerdem kennt er sich in ASM nicht richtig 
aus. Mit mir machst Du nicht weiter, ich will ja hier keinen Wettbewerb 
aufmachen.

@Karl Heinz: Dir ist bekannt, dass es für Deine immer wieder gerne 
benutzte Vorgehensweise einen Foren-Begriff gibt: Thread-Hijacking.

Also das Kapern eines fremden Themas für eigene Interessen. Ich brauch' 
jetzt nicht erklären, dass "Assemblercode Anpassung" jetzt so gar nichts 
mit Arduinisch oder C zu tun hat. Warum machst Du keinen eigenen Thread 
dafür auf?

Und ich will jetzt auch nicht mit Steinen werfen, bin sicher ja nicht 
immer völlig Foren-konform :D

Aber der Unterschied ist: ich muss kein Vorbild sein, oder mich peinlich 
genau an Regeln halten, ich bin kein Mod, ich hab' diesbezüglich mehr 
Freiheiten.

Selbstverständlich werd' ich diese Vorstellung hier weiterverfolgen und 
bin schon gespannt, wie weit Du alles vorgefertigt liefern wirst und 
wieweit Du es schaffst, dass der TE mitzieht.

Deine 4 Posts in Folge sind schon mal ein guter Start LOL

Glück auf ;-)

von Karl H. (kbuchegg)


Lesenswert?

MWS schrieb:
> Andre M. schrieb:
>> Also machen wir jetzt in Assembler weiter oder Arduino IDE.
>
> Mit dem Karl Heinz machst Du in C weiter, da er dahingehend
> missionarisch tätig ist, außerdem kennt er sich in ASM nicht richtig
> aus.

Doch kann ich.

Die Frage ist eher ob und wie sinnvoll das ist, wenn er mit dem hier 
schon Schwierigkeiten hat. In einem anderen Thread hat er erwähnt, dass 
er "Arduino programmieren für den Hausgebrauch" kann. Von daher macht es 
für mich keinen Sinn, ihn da jetzt in Assembler durchzutragen. Der 
Assembler ist hier nur deswegen aufs Tapet gekommen, weil er dafür von 
irgendwo fertige Programme her bekommen hat. Und wie es dann für ihn um 
Anpassen an seine persönlichen Wünsche steht, haben wir ja gesehen. Da 
sehe ich in C++ mehr Chancen als ihm da jetzt einen Crashkurs in 
Assembler zu geben.
D.h. für mich: der unfreiwillige Drift in Richtung Assembler bringt ihn 
seinem Ziel nicht näher sondern im Gegenteil entfernt er sich davon. 
Nicht weil das in Assembler zu schwierig wäre. Ist es überhaupt nicht. 
Aber für ihn ist das eine völlig neue Welt in die er eigentlich gar 
nicht will. Er will einfach nur einen Motorregler, der sich so verhält 
wie er sich das vorstellt. Und dazu braucht es nicht Assembler. Vor 
allen Dingen dann nicht, wenn er das alles erst noch lernen muss.

: Bearbeitet durch User
von MWS (Gast)


Lesenswert?

Karl H. schrieb:
> Die Frage ist eher ob und wie sinnvoll das ist, wenn er mit dem hier
> schon Schwierigkeiten hat.

Der will sich weder in ASM noch in Arduino/C verkünsteln, der will nur 
einen funktionierenden Fahrtregler haben, damit er mit seinem anderem 
Kram weitermachen kann. Mehr interessiert den nicht.


> In einem anderen Thread hat er erwähnt, dass
> er "Arduino programmieren für den Hausgebrauch" kann. Von daher macht es
> für mich keinen Sinn, ihn da jetzt in Assembler durchzutragen.

Wie gesagt, dass will er nicht, 'ne Änderung, damit das Geruckel weg ist 
und gut ist's.

> Der
> Assembler ist hier nur deswegen aufs Tapet gekommen, weil er dafür von
> irgendwo fertige Programme her bekommen hat. Und wie es dann für ihn um
> Anpassen an seine persönlichen Wünsche steht, haben wir ja gesehen. Da
> sehe ich in C++ mehr Chancen als ihm da jetzt einen Crashkurs in
> Assembler zu geben.

Der Thread hier dreht sich um Assembler und nicht um was Anderes. Was 
warum und wieso er woanders machte und wie's zu dem hier dann kam, ist 
hierfür egal.

Ansonsten dito.

> Um das Verstehen der Hardware PWM kommt er so und so nicht rum. Egal ob
> in Assembler oder in C++. Denn eine PWM mit einem variablen Top Wert von
> 65535 bringt ihn auch nicht auf die gewünschte Frequenz :-)

Dito II.

> Doch kann ich.

Will ich mal unbesehen glauben, gesehen hab' ich nie, dass dem so wäre.

von Karl H. (kbuchegg)


Lesenswert?

MWS schrieb:

> wie weit Du alles vorgefertigt liefern wirst und
> wieweit Du es schaffst, dass der TE mitzieht.

Das ist ganz einfach.
Das Grundgerüst steht bereits, die Timer Ansteuerung 'klauen' wir aus 
dem Assembler Programm von ganz oben, anstatt analogWrite kommen 
Zuweisungen an die OCR1x Register und dann ist das Assembler Programm 
aus dem Eröffnungsposting in einer C++ Form, die er kennt und die er 
modifizieren kann. Zeitkritisch ist da ja nichts. Die Pulserkennung 
könnte man besser machen, ist aber im Assembler Programm auch nicht 
besser als das was ein Ardiuno pulseIn macht. Von daher sind wir da also 
wieder auf gleich.

: Bearbeitet durch User
von MWS (Gast)


Lesenswert?

Karl H. schrieb:
> Das Grundgerüst steht bereits, die Timer Ansteuerung 'klauen' wir aus
> dem Assembler Programm von ganz oben, anstatt analogWrite kommen
> Zuweisungen an die OCR1x Register und dann ist das Assembler Programm
> aus dem Eröffnungsposting in einer C++ Form, die er kennt und die er
> modifizieren kann. Zeitkritisch ist da ja nichts. Die Pulserkennung
> könnte man besser machen, ist aber im Assembler Programm auch nicht
> besser als das was ein Ardiuno pulseIn macht. Von daher sind wir da also
> wieder auf gleich.

Lustig wird's dann, wenn ein Fehler im Arduinocode die H-Brücke grillt. 
Das war der Vorteil des ASM-Codes, selbst wenn er schlecht war, er war
erprobt.

Aber wie schon gesagt: mach mal.
Mich musst Du nicht missionieren, ich halt' mich raus.

von Franz Rapid (Gast)


Lesenswert?

MWS schrieb:
> ...ich halt' mich raus.

Versprich Nichts, was Du nicht halten kannst. Dein Ego lässt Dich doch 
nicht ruhen.

von Karl H. (kbuchegg)


Lesenswert?

MWS schrieb:

>> Doch kann ich.
>
> Will ich mal unbesehen glauben, gesehen hab' ich nie, dass dem so wäre.

Öhm. Das halbe Assembler Tutorial ist von mir.

von Karl H. (kbuchegg)


Lesenswert?

MWS schrieb:

> Lustig wird's dann, wenn ein Fehler im Arduinocode die H-Brücke grillt.
Warum sollte er.
Es wird immer nur eine Halbbrücke aufgesteuert oder beide sind auf 0. 
Ganz genau gleich, wie es auch der Assembler Code macht.

Und denn delay da drinnen
1
  clr t      ;turn off A half-bridge PWM
2
  out ocr1ah, t
3
  out ocr1al, t
4
  rcall delay    ;wait one PWM cycle to let the A PWM hardware finish it current cycle
5
  b_top_off    ;set top transistors for reverse configuration
6
  a_top_on
7
  out ocr1bh, yh    ;update B half-bridge with current throttle
8
  out ocr1bl, yl
mit seinen 96µs, und das Umschalten der Portpins, das kriegen wir auch 
noch hin :-)

Der einzige Unterschied: Zur Umrechnung der Servopulse in den Duty Cycle 
benutzen wir ganz normale C_Arithmetik anstelle einer Assembler Sequenz, 
die er nicht versteht und die er nicht analysieren und an seine 
Fernsteuerung anpassen kann. Denn genau daran spiesst es sich seit dem 
21. Dezember.
Beitrag "C-Code für Fahrtregler anpassen"

: Bearbeitet durch User
von Andre M. (Firma: keine) (murdok1980)


Lesenswert?

Hallo,
nicht streiten, soll ein Mod bitte die Threads Teilen in Assembler und 
Arduino beides mit dem Atmega8. Ich will beides probieren Assembler und 
C++. Gebt mir ne Chance und etwas Zeit zu lesen. Ne fertige Lösung ist 
sicherlich schön, aber in die Schublade wollte ich eigentlich nicht 
gesteckt werden. Bissl was lernen wollte ich schon.
Was ich nicht will ist einen Arduino Nano als Prozessor mit dem 
Fahrtregler koppeln damit er den Atmega8 ersetzt.

von Karl H. (kbuchegg)


Lesenswert?

Andre M. schrieb:

> Was ich nicht will ist einen Arduino Nano als Prozessor mit dem
> Fahrtregler koppeln damit er den Atmega8 ersetzt.

Dann musst du jetzt endlich mal sagen, wie denn deine Hardware 
tatsächlich aussieht.
Und nein, es gibt keinen Grund, warum ein A-Nano das nicht können 
sollte.
Wenn du einen hast, dann benutze ihn.

Schön langsam kenne ich mich auch nicht mehr aus, was du eigentlich an 
Hardware wirklich hast. Ich bin halt davon ausgegangen dass ein Arduino 
für dich das einfachste wäre.

von MWS (Gast)


Lesenswert?

Karl H. schrieb:
> Öhm. Das halbe Assembler Tutorial ist von mir.

Hmm, da war ich jetzt neugierig und hab' gesucht, nachdem mir da nie 
etwas auffiel. Eine Referenz zu Dir fand ich nicht, vielleicht hab' ich 
falsch gesucht? Magst Du dazu einen Link posten?

Karl H. schrieb:
> Warum sollte er.

Weil immer was schieflaufen kann und dann nicht Deine HW gegrillt wird.
Software ist immer zu 100% fehlerfrei, garantiert, Hand drauf ;-)

> mit seinen 96µs, und das Umschalten der Portpins, das kriegen wir auch
> noch hin :-)

Na, das hoff' ich doch schwer.

> Fernsteuerung anpassen kann. Denn genau daran spiesst es sich seit dem
> 21. Dezember. Beitrag "C-Code für Fahrtregler anpassen"

Und da bist Du jetzt quasi Retter in der Not geworden, indem ihm das 
schreibst? Versteh' ich, wär' ohne Dich nie gegangen, völlig 
ausgeschlossen. Dann mach' mal zu Ende.

von Karl H. (kbuchegg)


Lesenswert?

MWS schrieb:
> Karl H. schrieb:
>> Öhm. Das halbe Assembler Tutorial ist von mir.
>
> Hmm, da war ich jetzt neugierig und hab' gesucht, nachdem mir da nie
> etwas auffiel. Eine Referenz zu Dir fand ich nicht, vielleicht hab' ich
> falsch gesucht? Magst Du dazu einen Link posten?

Dann schau mal, wer zb die erstversion des 7-Segment Multiplex 
geschrieben hat. Detto für PWM, an die Porterweiterung kann ich mich 
nicht mehr erinnern, ob ich sie angefangen habe, aber ein erklecklicher 
Teil davon ist in der ganz frühen Version von mir.

> Weil immer was schieflaufen kann und dann nicht Deine HW gegrillt wird.
> Software ist immer zu 100% fehlerfrei, garantiert, Hand drauf ;-)

:-)
Die Assemblerversion da oben ist so trivial. Das kriegen wir aus dem 
Stegreif hin, die paar Sachen in C++ hin zu schreiben. Hand drauf.

> Und da bist Du jetzt quasi Retter in der Not geworden, indem ihm das
> schreibst? Versteh' ich, wär' ohne Dich nie gegangen, völlig
> ausgeschlossen.

Darum gehts überhaupt nicht.
Was ist dir lieber? Wenn er jedesmal dich braucht, wenn er das Deadband 
vergrössern will und aber die Vollgasstellung bei Knüppelendposition 
erreichen will, obwohl der Verfahrweg des Knüppels durch das größere 
Deadband kleiner wurde? Bringst du ihm 16 Bit Multiplikation und 
Division bei, damit er sich einen Dreisatz in Assembler programmieren 
kann? Denn genau darauf läuft es hinaus. Entweder darauf oder aber eine 
Verkleinerung des Top Wertes. Wobei das interessant wird, wenn das 
Deadband asymetrisch werden soll. Bzw. machst du ihm die Verriegelung, 
so das es eine Zeit lang nicht möglich ist, den Motor umzupolen, wenn 
die Motor-aus Stellung erreicht ist?
Ich will ihm das nach Möglichkeit auch nicht machen. Aber ich möchte ihn 
in die Lage versetzen, dass er sich das selber programmieren kann. Und 
so komplex ist die Erstversion als Ausgangsbasis nun auch wieder nicht.

: Bearbeitet durch User
von MWS (Gast)


Lesenswert?

Karl H. schrieb:
> MWS schrieb:
>> Karl H. schrieb:
>>> Öhm. Das halbe Assembler Tutorial ist von mir.
>>
>> Hmm, da war ich jetzt neugierig und hab' gesucht, nachdem mir da nie
>> etwas auffiel. Eine Referenz zu Dir fand ich nicht, vielleicht hab' ich
>> falsch gesucht? Magst Du dazu einen Link posten?
>
> Dann schau mal, wer zb die erstversion des 7-Segment Multiplex
> geschrieben hat.

Ich hatte bereits freundlich nach einem Link zum Beleg Deiner Aussagen 
gefragt, das war doch nicht zuviel verlangt?!

> Darum gehts überhaupt nicht.

Aber hallo, genau darum geht's Dir.

> Was ist dir lieber? Wenn er jedesmal dich braucht, wenn er das Deadband
> vergrössern will und aber die Vollgasstellung bei Knüppelendposition
> erreichen will, obwohl der Verfahrweg des Knüppels durch das größere
> Deadband kleiner wurde?

Mach' keine Wissenschaft draus, bzw. Dinge, die so nie gefragt waren.

> Bringst du ihm 16 Bit Multiplikation und
> Division bei, damit er sich einen Dreisatz in Assembler programmieren
> kann? Denn genau darauf läuft es hinaus.

Das ist Deine ganz spezielle Sichtweise, die ich nicht teile.

> Entweder darauf oder aber eine
> Verkleinerung des Duty Bereiches. Wobei das interessant wird, wenn das
> Deadband asymetrisch werden soll. Bzw. machst du ihm die Verriegelung,
> dass es eine Zeit lang nicht möglich ist, den Motor umzupolen, wenn die
> Motor aus Stellung erreicht ist?

Nö, das machst ja jetzt alles Du.

Bzw. dann wenn Du verstanden hast, dass er eben einen fertigen 
Fahrtregler hat, den er programmieren kann, dieser fertige Fahrtregler 
aber nicht im Ganzen oder teilweise per uC-Transplantation in ein 
Arduino-Gefrickel verwandelt werden soll.

von Karl H. (kbuchegg)


Lesenswert?

MWS schrieb:
> Karl H. schrieb:
>> MWS schrieb:
>>> Karl H. schrieb:
>>>> Öhm. Das halbe Assembler Tutorial ist von mir.
>>>
>>> Hmm, da war ich jetzt neugierig und hab' gesucht, nachdem mir da nie
>>> etwas auffiel. Eine Referenz zu Dir fand ich nicht, vielleicht hab' ich
>>> falsch gesucht? Magst Du dazu einen Link posten?

2006 hatt ich meinen Account noch nicht.
Im AVR-Tutorial sind alle Artikel vom ersten Timer Artikel bis zum 
Watchdog (den hab ich nicht mehr geschrieben) in der Urversion von mir. 
Und bei den älteren Zeitstempeln ab 2007 gibt es dann jede Menge 
Einträge kbuchegg

https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Kbuchegg

Meine Arbeit um Tutorial war einer der Gründe, warum ich Mod-Status 
bekommen habe.

Edit:
Der hier
https://www.mikrocontroller.net/articles/AVR-Tutorial:_Arithmetik8
trägt so offensichtlich meine Handschrift, dass man noch nicht einmal in 
der Versionsgeschichte nachsehen muss, wer den Artikel angefangen hat. 
:-)
Aber man kanns natürlich
https://www.mikrocontroller.net/wikisoftware/index.php?title=AVR-Tutorial:_Arithmetik8&dir=prev&action=history

: Bearbeitet durch User
von Andre M. (Firma: keine) (murdok1980)


Angehängte Dateien:

Lesenswert?

Das ist meine Hardware der erste (Hobby King) Regler ist mit Atmega8 und 
N/N Fet Treibern. Der wird in dem Forum verwendet, es gibt einen 
Schaltplan und die Sourcen für die Arduino IDE.
http://www.kellerwerftcommunity.de/t417f173-KeMo-Projekt-ein-eigener-Regler-auf-Arduino-Basis.html
Der zweite Regler (RCTimer) ist mit Atmega8 und P/N Fet Treibern.
Für den war der Assembler Code.
Zum flashen nutze ich einen USBASP 2.0
Die Programmierpins (RESET, VCC, GND, SCLK, MISO, MOSI) sind bei beiden 
Reglern rausgeführt.

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.