Forum: Mikrocontroller und Digitale Elektronik Anfänger sucht Rat "Kettenöler"


von Ralph M. (revolt3c)


Lesenswert?

Hi @ all,

bin zwar neu in dem Gebiet aber habe schon mein erstes Projekt im 
Visier.
Habe einen Code geschrieben und suche Rat ob der so funktionieren 
könnte.
Vermutlich noch nicht, aber das will ich ja wissen ;P

Funktion:

Ich möchte an meinem Motorrad über einen Reedkontakt einen Controller
ansteuern. Sprich je Radumdrehung = 1 signal. Nach 50000x Signalen
sollte der Controller einen Ausgang für ca 5sek ansteuern. (letzteres 
fehlt noch) Danach wieder
von vorne.

Hier der Code:

1
;Reset and Interrupt vector             ;VNr.  Beschreibung
2
  rjmp  main  ;1   POWER ON RESET
3
  rjmp  takt  ;2   Int0-Interrupt
4
  reti    ;3   Int1-Interrupt
5
  reti    ;4   TC2 Compare Match
6
  reti    ;5   TC2 Overflow
7
  reti    ;6   TC1 Capture
8
  reti    ;7   TC1 Compare Match A
9
  reti    ;8   TC1 Compare Match B
10
  reti    ;9   TC1 Overflow
11
  reti    ;10  TC0 Overflow
12
  reti    ;11  SPI, STC Serial Transfer Complete
13
  reti    ;12  UART Rx Complete
14
  reti    ;13  UART Data Register Empty
15
  reti    ;14  UART Tx Complete
16
  reti    ;15  ADC Conversion Complete
17
  reti    ;16  EEPROM Ready
18
  reti    ;17  Analog Comparator
19
  reti    ;18  TWI (I²C) Serial Interface
20
  reti    ;19  Store Program Memory Ready
21
;------------------------------------------------------------------------
22
;Start, Power ON, Reset
23
main:  ldi  r16,lo8(RAMEND)
24
  out  SPL,r16
25
  ldi  r16,hi8(RAMEND)
26
  out  SPH,r16
27
28
29
  ldi  r16,0xFF
30
  out  DDRB,r16
31
32
  ldi  r17,0x00
33
  out  DDRD,r17
34
35
36
  ldi  r16,0b00001010
37
  out  MCUCR,r16
38
39
  ldi  r16,0x11000000
40
  out  GICR,r16
41
42
  sei
43
44
45
impuls:  ldi  r16,0x11111111
46
  inc  r17
47
  cp  r16,r17         ;äußerer Zähler (bis 255)
48
  brne  impuls          ;wenn äußerer Zähler = 255 dann springen
49
  ldi  r17,0           ;wieder auf 0 zurücksetzen
50
  rjmp  takt
51
52
53
54
55
56
takt:  inc  r18
57
  cpi  r18,200           ;innerer Zähler (bis 200)
58
  brne  impuls            ;wenn inerrer Zähler = 200 springen
59
  ldi  r18,0             ;wieder auf 0 setzen
60
  rjmp  aktion
61
62
63
64
;------------------------------------------------------------------------
65
aktion:  wdr
66
  "Fehlt noch"
67
  
68
  rjmp  main
69
;------------------------------------------------------------------------


Gruss Ralph

von Karl H. (kbuchegg)


Lesenswert?

Ralph Müller wrote:

> Habe einen Code geschrieben und suche Rat ob der so funktionieren
> könnte.
> Vermutlich noch nicht, aber das will ich ja wissen ;P

Bis jetzt besteht dein Code lediglich aus ein paar 
ineinandergeschachtelten Zählschleifen, die einfach nur Zeit verbrutzeln 
und einigen unmotivierten Jump-durch-die-Gegend.
Ich seh ehrlich noch nicht wirklich, wie man diesen Code zu der von dir 
gewünschten Funktionalität ausweiten könnte.

Da du den INT0 Interrupt anscheinend benutzen willst: Du willst doch 
hoffentlich nicht wirklich den Kontakt an einen Interrupt eingang legen? 
Mechanische Kontakte prellen immer, so dass es keine gute Idee ist, die 
einen Interrupt auslösen zu lassen.

PS: Wenn du schon die Programmierung lernen musst, warum machst du das 
dann nicht einfach in C? Der Compiler würde dir viele lästige kleine 
Details abnehmen, wie zb. wie zählt man in 2 Registern bis 50000, etc. 
Ob du bei 0-Ahnung in Asembler oder in C einsteigst ist erst mal gehupft 
wie gesprungen. Nur sind deine Chancen in Assembler wesentlich größer, 
dich selbst ins Knie zu schiessen.

PS2: Im AVR-Studio gibt es einen Simulator. Wenn du wissen willst, ob 
dein Code auch das macht, was du dir vorstellst, dann gehs einfach mal 
im Simulator Schritt für Schritt durch.

PS3: Fang erst mal mit Vorübungen an: Wie wertet man einen Eingang aus, 
wie kann man 16 Bit Arithmetik betreiben, etc. Dein Projekt ist für dein 
Vorwissen zur Zeit noch eine Nummer zu groß so dass du dich verzetteln 
wirst.

von Z8 (Gast)


Lesenswert?

Furchtbar. Gibt noch nicht mal einen Stack-Überlauf.
Wie langweilig. Ein Int. ohne reti.


>  cpi  r18,200           ;innerer Zähler (bis 200)
>  brne  impuls            ;wenn inerrer Zähler = 200 springen

...

>  ldi  r16,0x11000000
>  out  GICR,r16

...


haste von mir "0"b"11000000" was?.


Gute Nacht!

von Tim (Gast)


Lesenswert?

@ Ralph Müller

Also ich tippe mal das dein Reedkontakt an Int0-Interrupt hängt.....

Der Programmablauf ist irgendwie kaputt. Der AVR arbeitet schön Zeile
für Zeile von deinem Programm ab. d.h nach dem sei macht er mit
"ldi  r16,0x11111111" weiter zählt dann bis 255 und springt nach
"takt:" von da aus wiederholt alles 200 mal ab "impuls:".
Danach springt er nach "aktion:", setzt die watchdog zurück
und macht danach einen Software "reset" ("rjmp  main").

Von Impuls zählen ist da weit und breit nix zu sehen....

Beschäftige dich doch mal mit ret, reti und call bzw rcall

von spess53 (Gast)


Lesenswert?

Hi

1. Von wo kommt jetzt in deinem Programm der Takt vom Reedschalter?

2. Wenn du ein Register inkrementierst ist das nach 256mal wieder Null. 
Das wird dann durch Zeroflag signalisirt. Der Vergleich mit r16 ist 
überflüssig.

3. Für einen gösseren Bereich (z.B. 50000) bietet sich der Befehl 'adiw' 
an, z.B.  adiw r25:r24,1 überstreicht einen Bereich von 0 bis 65535.

4. Als Erstes solltest du den Reedschalter Einlesen können. 
Erfahrungsgemäss prellen die ganz erheblich. Dann kannst du zählen. Und 
zum Schluss den Ölschalter betätigen.

5. ....

6. ....

MfG Spess

von Z8 (Gast)


Lesenswert?

An alle Anfänger:

"ldi  r16,0x11111111" ;falsch   entspricht dezimal 17
           -
"ldi  r16,0b11111111" ;richtig  entspricht dezimal 255
           -

von ms (Gast)


Lesenswert?

Mal davon abgesehen, möchtest du während der Fahrt immer deine Kette 
geölt haben und das alle 50-100km? Und dann immer schön während der 
Fahrt auf die Kette sprühen und die Straße und dein Motorrad mit dem 
zeug einsauen?

Wenn ja halte ich das für einen etwas zu frühen Aprilscherz

von spess53 (Gast)


Lesenswert?

Hi

>Wenn ja halte ich das für einen etwas zu frühen Aprilscherz

Vor ein paar Tagen hat(te) das jemand schon mal vor.

MfG Spess

von Otto (Gast)


Lesenswert?

> Mal davon abgesehen, möchtest du während der Fahrt immer deine Kette
> geölt haben und das alle 50-100km? Und dann immer schön während der
> Fahrt auf die Kette sprühen und die Straße und dein Motorrad mit dem
> zeug einsauen?
>
> Wenn ja halte ich das für einen etwas zu frühen Aprilscherz

Das machen auch die kommerziell käuflichen Systeme (mechanisch oder 
elektronisch) so - das verwendete Öl ist dafür geeignet.

Alternative ist, alle 500-1000 km die Kette mit einem guthaftenden 
Sprühfett einzusprühen, was man aber gerne immer weiter verschiebt.....

> Vor ein paar Tagen hat(te) das jemand schon mal vor.

Ist der Gleiche

Otto

von spess53 (Gast)


Lesenswert?

Hi

>Ist der Gleiche

Sah das da auch schon so schlimm aus? Hab das nur überflogen.

MfG Spess

von Otto (Gast)


Lesenswert?

Hallo spess53,

entscheide selber: Beitrag "Umdrehung zählen und Aktion durchführen"

Gruss Otto

von ms (Gast)


Lesenswert?

Ich hab jetzt mal nachgesehen und tatsächlich solche Teile gibts 
wirklich. Wer denkt sich sowas aus? Wozu soll das gut sein?
Wie gesagt alle 500-1000km (bei mir waren es auch schon mal 2000km) wird 
eben die Kette mal eingesprüht, hatte damit noch nie Probleme. Ich bin 
anscheinend zu Konservativ.

Was für ne Pumpe hast du dir denn vorgestellt?

Ich bezweifle irgendwie die Wirkung trotzdem, ich sprüh dann nen Tropfen 
drauf und der Fliegt doch sofort wieder weg wenn ich ordentlich Feuer 
gebe.

Und wenn ich richtig viel draufsprühe dann sauts mir erst recht alles 
ein.

Also ich finds blödsinn bei der Fahrt die Kette schmieren zu wollen.

von Otto (Gast)


Lesenswert?

Hallo ms,

nee, das kann schon was (z. B. Scott-Oiler) - ich fette meine Kette 
übrigens auch mit der Sprühdose - die mit einem automatischen 
Schmiersystem geschmierten Ketten halten i. A. doppelt so lange (es sei 
denn, Du gibst immer zu viel Stoff) und sehen immer nett aus.

Gruss Otto

von ms (Gast)


Lesenswert?

Anscheinend geb ich nicht genug Stoff um mir um sowas gedanken machen zu 
müssen. Ich weiß gar net wie alt meine Kette schon ist und is immernoch 
Top.

Wie heißts doch in meiner Gegend immer: "Wenns schee macht"...

Ich verabschiede mich aus dieser Diskussion und rate bei betrachtung des 
Codes dem Threadersteller erstmal davon ab sowas als erstes Projekt 
realisieren zu wollen.

von H.Joachim S. (crazyhorse)


Lesenswert?

Zum Projekt möchte ich auch nichts sagen, da sind zu viele Baustellen 
und es gibt gute und ausgereifte Lösungen.
Aber ein Öler an sich ist ne prima Sache. Hat viele Vorteile:
1. du brauchst dich im Prinzip gar nicht mehr um die Kette kümmern. 
Immer gut geschmiert. Und da das Zeug nicht klebt wie Fett oder anderer 
Kram, bleibt auch der Dreck nicht kleben und verwandelt sich nicht im 
Lauf der Zeit zu perfekter Schmirgelpaste.
2. Ölverbrauch ist minimal, wenn richtig eingestellt. Habe meinen 
Scottoiler vor 2 Jahren drangebaut, vom mitgelieferten Öl (0,5l) ist 
noch etwa die Hälfte da, gefahren bin ca. 35.000km.
3. ich fahre schon mal Touren >500km, wer es Ernst meint mit der 
Kettenpflege, muss dann ein Sprühdöschen mitführen.
4. du musst die Kette auch nicht mehr reinigen wie bei Fett oder 
diversen Sprays
5. Ein Kettensatz hält damit wesentlich länger. Der 1. war nach 20.000 
komplett hinüber, jetzt weitere 33.000 mit Öler, Kettensatz noch 
ziemlich gut.

von FRAGENSTELLER (Gast)


Lesenswert?

@Ralph Müller

sieh dir das einmal an:
http://www.alpentourer.de/shop/schwaboiler/schwaboiler.html

von Karl H. (kbuchegg)


Lesenswert?

Otto wrote:
> Hallo spess53,
>
> entscheide selber: Beitrag "Umdrehung zählen und Aktion durchführen"
>
> Gruss Otto

Da sieht das Programm aber viiiieeel besser aus :-)

Die Beschreibung passt zwar nicht zum Programm, und mit der Verwendung 
von binären Vergleichskonstanten hat sich der Autor selbst ein Ei 
gelegt, aber grundsätzlich, wenn wir mal von der Verwendung des 
Interrupts absehen, ist das schon nicht so schlecht. Zumindest ist ein 
Sinn erkennbar.

Wie hat sich der Autor eigentlich gedacht, dass er das Problem löst, 
dass er an 200 Nachmittagen jeweils 10km fährt und danach jeweils der µC 
den Strom verliert. Er ist ja dann 2000km gefahren, nur hat der µC 
jedesmal beim Einschalten der Zündung wieder bei 0 angefangen :-) 
Sprich: Die erforderliche Anzahl an Impulsen kommt nicht zustande und 
die Kette wird nie geölt.

von Jürgen H. (nobody)


Lesenswert?

Du kannst ja mal unter

http://www.mccoi.de/ nach schauen. Dort ist so ein Projekt.
Das Problem wird die Pumpe sein. Die ist teuer, aber die könntest du 
dort auch einzeln bestellen. Auch anderes Zubehör wie Regensensor usw.

Zudem gibt es dor Tips und info's.

Würde mir den aber fertig kaufen da alleine die Teile wahrscheinlich 
schon teuerer sein werden.

Gruß

von Sven P. (Gast)


Lesenswert?

Eine C-Control für einen Kettenöler? Das ist 'Overkill' um Faktor 
Fünftausend.

von Norgan (Gast)


Lesenswert?

> Habe einen Code geschrieben

Hast du nicht. Du hast ein (Assembler-)Programm geschrieben. Ein Code 
(oder Kode) ist eine Vereinbarung von Symbolen zum 
Informationsaustausch.

von Ralph M. (revolt3c)


Lesenswert?

So da bin ich wieder, hat sich ja einiges getan :P

Ja ich weiss ich bin blutiger Anfänger, habe mich erst seit 2 Woche mit 
dem Thema Mikrocontroller beschäftigt. Mir sagte man es wäre besser mit 
Assembler anzufangen bevor man auf die Hochsprache wechselt, hier ratet 
man mir genau das Gegenteil?

Zum Kettenöler selbst. Klar läasst sich darüber streiten ob man sowas 
haben muss. Natürlich kann ich die Kette auch von Hand schmieren aber 
der Tüftler will ja was basteln ;) Aber ich seh schon ich muss wohl 
erstmal kleinere Brötchen backen :(

Das der "Zähler" wieder auf 0 springt (Zündung aus) war auch so 
eingeplant.
Bin letzes Jahr 17000 Kilometer gefahren. Darunter das meiste 
Langstrecken (über 50km am Stück) Da spielt es keine Rolle wenn mal nach 
ein paar Kurzstrecken nicht geölt wird.

@nobody: Eigentlich will ich garkeine Pumpe verwenden. Habe ein 12V 
Hydroventil rumliegen, das Öl ist so Viskos das es durch die erhöhte 
Lage des Tanks alleine zum Ziel findet.

Gruss

von ms (Gast)


Lesenswert?

Doch nochmal hier einschalt


>Eigentlich will ich garkeine Pumpe verwenden. Habe ein 12V
>Hydroventil rumliegen, das Öl ist so Viskos das es durch die erhöhte
>Lage des Tanks alleine zum Ziel findet.

Das hab ich mir fast gedacht. Soviel zum Thema Sauerei auf der Straße, 
der Felge, und was weiß ich wo das Zeug noch hinfließt wenn du das 
einige sek einfach durch nen Schlauch rausläuft.

Wenn man sowas schon macht, dann sollte das Öl auch entsprechend Dosiert 
werden.

Und ob dus mit Assembler oder in Hochsprache schreibst ist hier nach 
eigenem Gusto und können.

von Ralph M. (revolt3c)


Lesenswert?

Das gibt keine Sauerei, ein Drosselventil kommt dazwischen und gut ist. 
Ich weiss nicht wie du dir das vorstellst, die Kette soll nicht geflutet 
werden.

von Blackbird (Gast)


Lesenswert?

Das Öl muß sehr gut haften, sonst wird es sofort abgeschleudert. Da ist 
nicht viel Auswahl. Ich verwende Kettensägenöl von Stihl. Und geschmiert 
wird so alle 3 bis 12 km ein Tropfen per Pumpe, kann ich einstellen.
Pumpe deshalb, weil das Öl so hoch viskos ist.
Und bei Regen (Regensensor ist auch dran) wird das eingestellte Interval 
halbiert, weil das Wasser das Öl früher abwäscht.
Einen "Cross"-Modus gibt es auch noch. Der ist fürs Gelände und 
Sandstrecken, da wird statt einem dann 8 Tropfen auf die Kette gegeben.


50km sind eher Kurzstrecke, da ist ein Reset ungünstig bei Deinem 
geplanten Tropfenintervall.



Mein Rat ist, kaufe Dir sowas, die jahrelangen Erfahrungen und 
Rückschläge der anderen Fahrer mit so einem Teil kannst Du nicht allein 
machen ohne zu verzweifeln.

Im schlimmsten Falle ölst Du Dir Deinen Reifen ein und legst Dich in 
einer Kurve hin.


Blackbird

von ms (Gast)


Lesenswert?

Genau darauf wollte ich hinaus. Vielleicht hab ichs nur falsch 
formuliert, bzw gedacht man muss es nicht so direkt sagen.

Kettensägenöl wär mir auch eingefallen aber da läuft die Kette ja auch 
wesentlich langsamer (der verbrauch ist natürlich aufgrund der Nutzung 
der Kette exorbitant höher)

von Blackbird (Gast)


Lesenswert?

Kettensägenöl (normales, nicht die Bio-Variante) hat sich als das Beste 
herausgestellt. Auch die Intervallzeiten und alles Andere sind 
Erfahrungswerte von vielen, vielen hunderttausenden "Test"-Kilometer von 
zig. Fahrern.

Trotzdem spricht nichts dagegen, sowas selbst zu machen. Aber man sollte 
sich, schon um der eigenen Sicherheit wegen, zuvor mal kundig machen: 
www.mccoi.de (keine Werbung, aber dort tummeln sich auch µC-Fans, 
schließlich ist da ein ATtiny2313 verbaut und mit BASCOM programmiert).

Aber der ATtiny und das Programm sind das kleinste Problem.
Ich hatte schon genug zu tun, den fertigen Bausatz FACHGERECHT an mein 
Motorrad zu adaptieren.
Lohn der Mühe: ca. 10000km ohne Kettengeschmiere alle 400km.


Blackbird

von Andrew T. (marsufant)


Lesenswert?

Blackbird wrote:
> Lohn der Mühe: ca. 10000km ohne Kettengeschmiere alle 400km.
>
>
> Blackbird

Und das ist ja schon mal eine Menge wert. Denn die Kette ist ja auch 
nicht ganz billig, auch wenn man diese ggfs. selber tauscht.
10 Tkm ist schon mal gut.

Automati. Kettenöler ist eine feine Sache. Ich hatte das auch mal 
gebaut, allerdings in der schlichten Variante mit einfachem Taktgeber, 
Dosierpumpe und ohne Reed-Input etc. Hat auch gute Werte an der Kette 
für 8-9 Tkm geliefert.

Man sieht, es braucht nicht übermäßig viel Aufwand bei der Steueung. Es 
geht so mit bescheidenen Mitteln.


hth,
Andrew

von Ralph M. (revolt3c)


Lesenswert?

so 2 wochen später ein neuer anlauf ;) diesesmal ist das programm 
hoffentlich etwas besser geworden ---> da mehr eingelesen. was meint ihr 
könnte das in der praxis funktionieren? ist bestimmt nicht die 
eleganteste lösung aber würde es so funktionieren?

1
;**********************************************************
2
.include "m8def.inc"  
3
;**********************************************************
4
5
6
7
8
9
.org INT_VECTORS_SIZE
10
11
12
.org 0x00
13
           rjmp main            ; Reset Handler
14
15
.org INT0addr
16
           rjmp int0_handler    ; IRQ0 Handler
17
18
19
20
21
.def temp = r16
22
23
main: ldi temp,low(RAMEND)  ; Stackpointer initialisieren
24
      out SPL,temp
25
26
      ldi  temp,high(RAMEND)
27
      out  SPH,temp
28
      
29
      ldi r18, 0
30
31
      ldi r19, 0
32
33
      ldi  temp,0xFF
34
      out  DDRB,temp
35
36
  
37
      ldi r17,0x00
38
      out  DDRD,r17
39
40
41
      ldi temp, 0b00000011  ; INT0 und INT1 konfigurieren
42
      out MCUCR, temp
43
 
44
      ldi temp, 0b11000000  ; INT0 und INT1 aktivieren
45
      out GICR, temp
46
 
47
      sei                   ; Interrupts allgemein aktivieren
48
49
loop: rjmp loop
50
51
52
53
54
int0_handler:
55
56
57
      ldi r16, 0b11001000    ; zählt bis 200
58
      inc r18 
59
      cp   r16, r18
60
61
      breq step
62
63
      reti
64
65
66
67
reset1:  ldi r19, 0x00         ; resetet r19  
68
      
69
70
71
72
reset2:  ldi r18, 0x00      ; resetet r18      
73
         reti
74
75
76
77
78
step:
79
      ldi r16, 0b11111111   ; zählt bis 255
80
      inc r19
81
      cp r16, r19
82
83
      breq schmieren
84
85
      rjmp reset2
86
87
88
schmieren:                    ; "fehlt noch"
89
      
90
               inc r20        ;"zählt anzahl der schmierungen"
91
92
               rjmp reset1

von McCoi (Gast)


Lesenswert?

der Name ist Programm in Sache µC-Kettenschmierung.

von spess53 (Gast)


Lesenswert?

Hi

Warum so umständlich?
1
main: ldi temp,.....
2
      
3
      ldi r18, Low(50000)
4
      ldi r19,High(50000)
5
      .....
6
7
8
int0_handler:
9
     
10
     sbiw r19:r18,1
11
     brne int0_handler10
12
13
schmieren:                    ; "fehlt noch"
14
      
15
    inc r20        ;"zählt anzahl der schmierungen"
16
     
17
    ldi r18, Low(50000)
18
    ldi r19,High(50000)
19
20
int0_handler10:
21
     reti

Hat 2 min gedauert.
Zu deinem Programm: Wenn Zählen, dann rückwärts. Damit ersparst du das 
'cp...'. Grössere Zahlen kannst du in mehreren Registern halten. Für 
Zahlen bis 65535 gibt es zum Zählen die Befehle adiw und sbiw.
Bei Interruptroutinen sollte man SREG sichern. Hat bei dir hier keinen 
Einfluss, kann aber bei anderen Programmen zu interessaten 
Überraschungen führen.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Du liebst Binärzahlen :-)
1
      ldi r16, 0b11001000    ; zählt bis 200
schreibs doch gleich so
1
      ldi r16, 200
dann brauchst du auch keinen Kommentar und niemand muss überlegen, ob 
0b11001000 tatsächlich 200 ist, oder du aus irgendwelchen Gründen 
vielleicht 1 mehr oder weniger oder sonstwas hat.

Merke: Überleg bei jedem Kommentar, ob man das was der Kommentar 
aussagt, nicht auch im Code unterbringen könnte.

1
reset1:  ldi r19, 0x00         ; resetet r19
schön, das du dazuschreibst, dass hier r19 resettet wird. Aber leider: 
das seh ich auch, wenn ich den Code anschaue. Was ich aber nicht sehe, 
wenn ich den Code betrachte: Warum wird r19 auf 0 gesetzt und was zum 
Teufel befindet sich logisch gesehen eigentlich in r19? Ist das die 
Anzahl der Schmierungen, oder die Anzahl der Kilometer oder die 
Tankfüllung oder was?

Merke: Kommentier nicht das, was sowieso im Code auch steht. Kommentiere 
was nicht im Code steht! Das sind meist Logik-Dinge, also: warum 
passiert etwas.

In diesem Sinne:
1
      ldi temp, 0b00000011  ; INT0 und INT1 konfigurieren
2
      out MCUCR, temp

Was bedeutet INT0 und INT1 konfigurieren? Auf welchen Modus werden sie 
konfiguriert? Gib mir im Code ein paar Stichworte mit denen ich zur Not 
in der µC Doku suchen gehen kann
1
      ldi temp, ( 1 << ISC01 ) | ( 1 << ISC00 )  ; INT0 und INT1 konfigurieren
2
                                                 ; INT0: steigende Flanke
3
                                                 ; INT1: low Level
4
      out MCUCR, temp

(PS: Bist du sicher, dass du INT1 auf Interrupt bei low-Level haben 
willst?)

von Karl H. (kbuchegg)


Lesenswert?

PS: man kann Registern auch Namen geben :-)

zb.
1
.def Pulse200 = r18
2
....


Dann wird aus deinem Code
1
int0_handler:
2
      ldi r16, 0b11001000    ; zählt bis 200
3
      inc r18 
4
      cp   r16, r18
5
6
      breq step
7
8
      reti

das hier
1
int0_handler:
2
      inc Pulse200 
3
      cpi Pulse200, 200
4
5
      breq step
6
7
      reti

und das hat dann schon eine ganz andere selbstdokumentierende Qualität.

Und noch was: hüte dich vor wilden Sprungorgien. Du bist momentan drauf 
und drann, dich in einem Sprungdickicht zu verlieren, wenn du wie wild 
mit rjmp hin und her springst.

von Ralph M. (revolt3c)


Lesenswert?

jaja ich bin ein kleiner binärzähler :) hab mir hier die ersten 
tutorials angeschaut bei denen auch mit binärzahlen gearbeitet wurde. 
warscheinlich nur zum verständniss. ist bei mir eben noch 
hängengeblieben genau so wie ich beim festlegen des richtungsregisters 
ein hexzähler bin :P

das mit den registernamen werde ich dann so umsetzen. danke

und zu dem r19, falls das keine rethorische frage war: ich benötige 
50000x signale = 50000 radumdrehungen. zähle in dem r18 bis auf 200 und 
im r19 auf 255 ergibt 200*255 = 50000. habe ich ja schon oben erwähnt.


gruss ralph

von Karl H. (kbuchegg)


Lesenswert?

Ralph Müller wrote:

> und zu dem r19, falls das keine rethorische frage war:

:-) Doch, war es.

Bei meinen letzten Antworten ging es hauptsächlich um Prinzipien und 
weniger um dein konkretes Programmproblem.

> ich benötige
> 50000x signale = 50000 radumdrehungen. zähle in dem r18 bis auf
> 200 und im r19 auf 255 ergibt 200*255 = 50000. habe ich ja schon
> oben erwähnt.

Siehst du: Genau das wäre zb. etwas was in einen Kommentar am Anfang des 
Interrupt Handlers rein könnte/sollte/müsste:
Der Handler soll bis 50000 zählen. Der Zähler ist realisiert indem r18 
bis 200 zählt und bei einem Überlauf von r18 r19 bis 255 hochgezählt 
wird.

Genau das sind Dinge, die man mit einem Kommentar dokumentiert.

von spess53 (Gast)


Lesenswert?

Hi

>200*255 = 50000?????

>PS: man kann Registern auch Namen geben :-)

Mag bei kleinen Programmen etwas Sinn machen. Wenn ein Register aber 
sehr unterschiedliche Funktionen haben kann, eher lästig (versuch mal 
das vernünftig zu debuggen).

>jaja ich bin ein kleiner binärzähler :)
Alles wo es hin gehört. Einen Dezimalwert unbedingt binär wiederzugeben 
ist etwas sinnfrei.

MfG Spess

von Sven P. (Gast)


Lesenswert?

Ich grabs nochmal aus, weil mich im XJ-Forum jemand auf ne Idee gebracht 
hat:

Die Dosierung könnte man idiotensicher von der gefahrenen Wegstrecke 
abhängig machen (wurde ja hier auch getan). Idiotensicher, weil man den 
Geberkontakt nicht einmal an Reifen oder Kette montieren/kleben müsste!

Amerikanische Motorräder haben da so eine Blinkerschaltung verbaut, die 
den Blinker automatisch nach einer Zeit bzw. nach einer gefahrenen 
Strecke wieder abstellen, und die nehmen die Wegstrecke direkt vom 
Magneten im Tacho ab. Wäre doch eigentlich eine geniale wie saubere 
Lösung :-D

von Gast4 (Gast)


Lesenswert?

>Autor:  Z8 (Gast)
> Datum: 31.03.2009 23:32
>An alle Anfänger:

>"ldi  r16,0x11111111" ;falsch   entspricht dezimal 17

Besser nicht merken ist naemlich:

   286331153


Gast4

von Meister E. (edson)


Lesenswert?

@Gast4

Um den Sven zu zitieren: Käse

Der 8-Bit Assembler interessiert sich nicht für mehr als zwei Stellen 
nach dem '0x'. Z8s Aussage ist demnach korrekt.

von Martin (Gast)


Lesenswert?

> keine Werbung, aber dort tummeln sich auch µC-Fans,
> schließlich ist da ein ATtiny2313 verbaut und mit BASCOM programmiert

Das ich da mit BASCOM gecodet hab, das wüßte ich aber :-)

Das ist alles feinster Assembler...


Grüße aus dem McCoi-Lager

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.