Forum: Mikrocontroller und Digitale Elektronik Verzweigungen


von Andy11 (Gast)


Lesenswert?

Meine Frage ist, ob diese Verzweigung die ich hier habe prinzipiell 
funktioniert oder es halt nicht üblich ist so zu verzweigen:
1
;*****************************Hauptprogramm************************************
2
Hauptprogramm:
3
rcall  ADC_Kanal0
4
rcall    StartADC
5
        in Messergebnisleft, ADCH
6
        cp Messergebnisleft, Schwellwertleft
7
        brsh LinksGroesser
8
MessungZW05:                        ;LINIENERKENNUNG linker LDR
9
        cp Messergebnisleft, Schwellwertleft
10
        brlo LinksKleiner
11
MessungZW1: 
12
13
rcall  ADC_Kanal1
14
rcall    StartADC
15
        in Messergebnismiddle, ADCH
16
        cp Messergebnismiddle, Schwellwertmiddle
17
        brsh MitteGroesser
18
MessungZW15:                        ;LINIENERKENNUNG mittlerer LDR
19
        cp Messergebnismiddle, Schwellwertmiddle
20
        brlo MitteKleiner
21
MessungZW2:
22
23
rcall  ADC_Kanal2
24
rcall    StartADC
25
        in Messergebnisright, ADCH
26
        cp Messergebnisright, Schwellwertright
27
        brsh RechtsGroesser
28
MessungZW25:                        ;LINIENERKENNUNG rechter LDR
29
        cp Messergebnisright, Schwellwertright
30
        brlo RechtsKleiner
31
          
32
MessungZW3:
33
34
;#######Motoransteuerung##########
35
      cpi Linienerkennung, 0b00000001
36
      breq MotorLinks
37
MotorZW:
38
      cpi Linienerkennung, 0b00000010
39
      breq MotorMitte
40
MotorZW2:
41
      cpi Linienerkennung, 0b00000100
42
      breq MotorRechts
43
MotorZW3:
44
;#################################
45
46
47
    sbis PIND, 2        ;Überprüfe PIND.0
48
    rcall Messeschwellwert     ;Wenn PIND.0 = 0 (Taster betätigt)--> Messung
49
rjmp Hauptprogramm          ;ansosnten wieder von vorne
50
;*********************************************************************************
51
52
;Motoren setzen####################################
53
MotorLinks:
54
  sbi PORTB, 2
55
  cbi PORTB, 1
56
rjmp MotorZW
57
58
MotorMitte:
59
  sbi PORTB, 2
60
  sbi PORTB, 1
61
rjmp MotorZW2
62
63
MotorRechts:
64
  cbi PORTB, 2
65
  sbi PORTB, 1
66
rjmp MotorZW3
67
;##################################################
68
69
;Setze Bits in Byte für die Linienerkennung########
70
LinksGroesser:
71
  sbr Linienerkennung, 1  
72
rjmp MessungZW05
73
74
LinksKleiner:
75
  cbr Linienerkennung, 1
76
rjmp MessungZW1
77
78
79
MitteGroesser:
80
  sbr Linienerkennung, 2
81
rjmp MessungZW15
82
  
83
MitteKleiner:
84
  cbr Linienerkennung, 2
85
rjmp MessungZW2
86
87
88
RechtsGroesser:
89
  sbr Linienerkennung, 4
90
rjmp MessungZW25
91
92
RechtsKleiner:
93
  cbr Linienerkennung, 4
94
rjmp MessungZW3
95
96
;##################################################

lg andy

von spess53 (Gast)


Lesenswert?

Hi

>rcall  ADC_Kanal0
>rcall    StartADC
>in Messergebnisleft, ADCH

Diese Aufteilung der ADC-Messung ist relativ sinnfrei.

>cp Messergebnisleft, Schwellwertleft
>brsh LinksGroesser
>MessungZW05:                        ;LINIENERKENNUNG linker LDR
>cp Messergebnisleft, Schwellwertleft
>brlo LinksKleiner

Wenn Messergebnisleft nicht >= Schwellwertleft ist, ist es 
zwangsläufig kleiner. Da es keine dritte Möglichkeit gibt, ist der 
zweite Vergleich überflüssig.

>;Setze Bits in Byte für die Linienerkennung########
>....
Warum macht du das nicht sofort nach dem Vergleich. Das Herumgespringe 
ist unübersichtlich.

MfG Spess

von Andy11 (Gast)


Lesenswert?

>Diese Aufteilung der ADC-Messung ist relativ sinnfrei.
ich finde, wenn ich es auskommentiere ist es viel unübersichtlicher als 
wie ernn ich dafür eigene unterprogramme schreibe


>Wenn Messergebnisleft nicht >= Schwellwertleft ist, ist es
>zwangsläufig kleiner. Da es keine dritte Möglichkeit gibt, ist der
>zweite Vergleich überflüssig.
Richtig, da is mal gleich ein fehler drinn, denn richtig ist es so:
1
;*****************************Hauptprogramm************************************
2
Hauptprogramm:
3
rcall  ADC_Kanal0
4
rcall    StartADC
5
        in Messergebnisleft, ADCH
6
        cp Messergebnisleft, Schwellwertleft
7
        brsh LinksGroesser
8
MessungZW05:                        ;LINIENERKENNUNG linker LDR
9
        cp Messergebnisleft, Linksaus
10
        brlo LinksKleiner
11
MessungZW1: 
12
13
rcall  ADC_Kanal1
14
rcall    StartADC
15
        in Messergebnismiddle, ADCH
16
        cp Messergebnismiddle, Schwellwertmiddle
17
        brsh MitteGroesser
18
MessungZW15:                        ;LINIENERKENNUNG mittlerer LDR
19
        cp Messergebnismiddle, Mitteaus
20
        brlo MitteKleiner
21
MessungZW2:
22
23
rcall  ADC_Kanal2
24
rcall    StartADC
25
        in Messergebnisright, ADCH
26
        cp Messergebnisright, Schwellwertright
27
        brsh RechtsGroesser
28
MessungZW25:                        ;LINIENERKENNUNG rechter LDR
29
        cp Messergebnisright, Rechtsaus
30
        brlo RechtsKleiner
31
          
32
MessungZW3:
33
34
;#######Motoransteuerung##########
35
      cpi Linienerkennung, 0b00000001
36
      breq MotorLinks
37
MotorZW:
38
      cpi Linienerkennung, 0b00000010
39
      breq MotorMitte
40
MotorZW2:
41
      cpi Linienerkennung, 0b00000100
42
      breq MotorRechts
43
MotorZW3:
44
;#################################
45
46
47
    sbis PIND, 2        ;Überprüfe PIND.0
48
    rcall Messeschwellwert     ;Wenn PIND.0 = 0 (Taster betätigt)--> Messung
49
rjmp Hauptprogramm          ;ansosnten wieder von vorne
50
;*********************************************************************************
51
52
;Motoren setzen####################################
53
MotorLinks:
54
  sbi PORTB, 2
55
  cbi PORTB, 1
56
rjmp MotorZW
57
58
MotorMitte:
59
  sbi PORTB, 2
60
  sbi PORTB, 1
61
rjmp MotorZW2
62
63
MotorRechts:
64
  cbi PORTB, 2
65
  sbi PORTB, 1
66
rjmp MotorZW3
67
;##################################################
68
69
;Setze Bits in Byte für die Linienerkennung########
70
LinksGroesser:
71
  sbr Linienerkennung, 1  
72
rjmp MessungZW05
73
74
LinksKleiner:
75
  cbr Linienerkennung, 1
76
rjmp MessungZW1
77
78
79
MitteGroesser:
80
  sbr Linienerkennung, 2
81
rjmp MessungZW15
82
  
83
MitteKleiner:
84
  cbr Linienerkennung, 2
85
rjmp MessungZW2
86
87
88
RechtsGroesser:
89
  sbr Linienerkennung, 4
90
rjmp MessungZW25
91
92
RechtsKleiner:
93
  cbr Linienerkennung, 4
94
rjmp MessungZW3
95
96
;##################################################

spess53 schrieb:
> Warum macht du das nicht sofort nach dem Vergleich. Das Herumgespringe
> ist unübersichtlich.

weil, wenn ich die Marke gleich nach dem Vergleich aufschreibe, er dann 
so oder so hineinspringt, denn wenn die bedingung nicht eintrifft,dann 
macht er weiter im coding, es wäre natürlich viel schöner.

von Flo (Gast)


Lesenswert?

wie wärs damit:

PROGRAMM:
S1:
falls ADC1 kleiner Wert, springe zu S2

Mach was (ADC1>Wert)

S2:
falls ADC2 kleiner Wert, springe zu S3

Mach was (ADC2>Wert)

S3:
falls ADC3 kleiner Wert, springe zu ENDE

Mach was (ADC3>Wert)

ENDE:
zurück zu S1

;-)

von Andy11 (Gast)


Lesenswert?

Flo schrieb:
> PROGRAMM:
> S1:
> falls ADC1 kleiner Wert, springe zu S2
>
> Mach was (ADC1>Wert)
>
> S2:
> falls ADC2 kleiner Wert, springe zu S3
>
> Mach was (ADC2>Wert)
>
> S3:
> falls ADC3 kleiner Wert, springe zu ENDE
>
> Mach was (ADC3>Wert)
>
> ENDE:

das funktioniert leider nicht

siehdir mal diesen Bascom code an, nach dem habe ich mich gerichtet:

1
Do
2
    Start Adc
3
4
    Messergebnisleft = Getadc(0)
5
    If Messergebnisleft > Schwellwertleft Then Zustand.0 = 1       'Else Zustand = 0
6
    If Messergebnisleft < Linksaus Then Zustand.0 = 0       'schreibe Information von sensor rechts in Byte Zustand
7
8
    Messergebnismiddle = Getadc(1)
9
    If Messergebnismiddle > Schwellwertmiddle Then Zustand.1 = 1       'Else Zustand = 0
10
    If Messergebnismiddle < Mitteaus Then Zustand.1 = 0     'schreibe Information von sensor mitte in Byte Zustand
11
12
    Messergebnisright = Getadc(2)
13
    If Messergebnisright > Schwellwertright Then Zustand.2 = 1       'Else Zustand = 0
14
    If Messergebnisright < Rechtsaus Then Zustand.2 = 0     'schreibe Information von sensor links in Byte Zustand
15
16
    Select Case Zustand
17
18
        Case &B00000001 :
19
            Portb = &B00000100
20
            Letzterzustand = "Links"                        'Merke dir den letzten Zustand
21
22
        Case &B00000100 :
23
            Portb = &B00000010
24
            Letzterzustand = "Rechts"
25
26
        Case &B00000010 :
27
            Portb = &B00000110
28
            Letzterzustand = "Mitte"
29
30
        Case &B00000000                                     'Falls undefinierter Zustand dann behalte letzten Zustand
31
            If Letzterzustand = "Links" Then
32
                Portb = &B00000100
33
            End If
34
35
            If Letzterzustand = "Rechts" Then
36
                Portb = &B00000010
37
            End If
38
39
    End Select
40
41
    Debounce Pind.2 , 0 , Messeschwellwert                  'Gehe zu Messeschwellwert wenn PinD2= 1
42
43
Loop

von Flo (Gast)


Lesenswert?

Ok, das Programm haste mit deinem Assemblercode noch nicht ganz 
getroffen ;-)
Es fehlt noch die Behandlung für den Fall, dass sich nichts ändert.
Ohne diesen wäre ein Statusspeicher nämlich überhaupt nicht nötig 
gewesen, deshalb mein Ansatz.
Du willst ner Linie hinterher, oder?

von Andy11 (Gast)


Lesenswert?

Flo schrieb:
> Es fehlt noch die Behandlung für den Fall, dass sich nichts ändert.

wenn sich nichts ändert, wie meinst du das denn?
meinst du jetzt den letzten Fall case Zustand = 0b00000000
wenn ja, dann brauch ich diesen nicht, denn ohne abfrage ändert sich 
auch nicht am letzten Zustand, theoretisch könnt eich den weglassen

>Du willst ner Linie hinterher, oder?
das ist richtig, und das Bascom programm funktioniert, jedoch habe ich 
einwenig probleme mit assembler, uch mein das programm funktioniert so 
aus irgendeinem grund noch nicht, aber deshalb ja diese Fragen

von spess53 (Gast)


Lesenswert?

Hi

>weil, wenn ich die Marke gleich nach dem Vergleich aufschreibe, er dann
>so oder so hineinspringt, denn wenn die bedingung nicht eintrifft,dann
>macht er weiter im coding, es wäre natürlich viel schöner.

Dann mach die Bedingung passend.

Der nachfolgende Code ist ohne Gewähr:
1
;*****************************Hauptprogramm************************************
2
Hauptprogramm:
3
rcall  ADC_Kanal0
4
rcall    StartADC
5
        in Messergebnisleft, ADCH
6
        cp Messergebnisleft, Schwellwertleft
7
        brlo MssungZW05
8
9
MessungZW05:                        ;LINIENERKENNUNG linker LDR
10
        cp Messergebnisleft, Linksaus
11
        brshlo MessungZW1
12
       cbr Linienerkennung, 1
13
14
MessungZW1: 
15
16
rcall  ADC_Kanal1
17
rcall    StartADC
18
        in Messergebnismiddle, ADCH
19
        cp Messergebnismiddle, Schwellwertmiddle
20
        brlo MessungZW15
21
        sbr Linienerkennung, 2
22
23
MessungZW15:                        ;LINIENERKENNUNG mittlerer LDR
24
        cp Messergebnismiddle, Mitteaus
25
        brsh MessungZW2
26
        cbr Linienerkennung, 2
27
28
MessungZW2:
29
30
rcall  ADC_Kanal2
31
rcall    StartADC
32
        in Messergebnisright, ADCH
33
        cp Messergebnisright, Schwellwertright
34
        brlo MessungZW25
35
        sbr Linienerkennung, 4
36
37
MessungZW25:                        ;LINIENERKENNUNG rechter LDR
38
        cp Messergebnisright, Rechtsaus
39
        brsh MessungZW3
40
        cbr Linienerkennung, 4
41
         
42
MessungZW3:
43
;#######Motoransteuerung##########
44
      cpi Linienerkennung, 0b00000001
45
      sbi PORTB, 2
46
      cbi PORTB, 1
47
MotorZW:
48
      cpi Linienerkennung, 0b00000010
49
      sbi PORTB, 2
50
      sbi PORTB, 1
51
MotorZW2:
52
      cpi Linienerkennung, 0b00000100
53
      cbi PORTB, 2
54
      sbi PORTB, 1
55
MotorZW3:
56
;#################################
57
    sbis PIND, 2        ;Überprüfe PIND.0
58
    rcall Messeschwellwert     ;Wenn PIND.0 = 0 (Taster betätigt)--> Messung
59
rjmp Hauptprogramm          ;ansosnten wieder von vorne
60
;********************************************************************************

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi
1
MessungZW05:                        ;LINIENERKENNUNG linker LDR
2
        cp Messergebnisleft, Linksaus
3
        brshlo MessungZW1
4
        sbr Linienerkennung, 1  !!! Das hat noch gefehlt

MfG Spess

von Andy11 (Gast)


Lesenswert?

spess53 schrieb:
> Hauptprogramm:
> rcall  ADC_Kanal0
> rcall    StartADC
>         in Messergebnisleft, ADCH
>         cp Messergebnisleft, Schwellwertleft
>         brlo MssungZW05
>
> MessungZW05:                        ;LINIENERKENNUNG linker LDR
>         cp Messergebnisleft, Linksaus
>         brshlo MessungZW1
>        cbr Linienerkennung, 1

Das Problem hierbei ist, dass wenn die Bedingung eintrifft oder auch 
nicht er bei der Marke MessungZW05 weitermacht
habe ich neulich getestet, und deswegen die zusätzlichen Rücksprünge

von spess53 (Gast)


Lesenswert?

Hi

>Das Problem hierbei ist, dass wenn die Bedingung eintrifft oder auch
>nicht er bei der Marke MessungZW05 weitermacht
>habe ich neulich getestet, und deswegen die zusätzlichen Rücksprünge

Bei dir doch auch. Du solltest aber beachten, das ich brsh und brlo 
vertauscht habe.

MfG Spess

P.S. Beachte meine Korrektur.

von Andy11 (Gast)


Lesenswert?

>Bei dir doch auch.

nein, denn bei mir springt er bei eintreffen des Ereignisses auf die 
richtige Marke und anschließend wieder zur richtigen Stelle zurück, und 
bei nicht eintreffen macht er einfach weiter im Programmcode und lasst 
den Sprung weg

>Du solltest aber beachten, das ich brsh und brlo
>vertauscht habe.
ok, du kommst aber trotzdem nicht drum herum, denn in deinem Fall hast 
du keine Verzweigung mehr, denn du machst es so und so durch

von spess53 (Gast)


Lesenswert?

Hi

Dein Code:

>        cp Messergebnisleft, Schwellwertleft
>        brsh LinksGroesser
>MessungZW05:                        ;LINIENERKENNUNG linker LDR

>LinksGroesser:
>  sbr Linienerkennung, 1
>rjmp MessungZW05

Du landest in jedem Fall bei 'MessungZW05'

Mein Code:

>        cp Messergebnisleft, Schwellwertleft
>        brlo MssungZW05
>        sbr Linienerkennung, 1
>MessungZW05:                        ;LINIENERKENNUNG linker LDR

Ich lande auch immer bei 'MessungZW05'. Nur ohne Umwege.

MfG Spess

von Andy11 (Gast)


Lesenswert?

spess53 schrieb:
> Ich lande auch immer bei 'MessungZW05'. Nur ohne Umwege.

es geht hier nicht um ZW05, denn das ist nur eine Hilfsmarke

es ging mir um sbr Linienerkennung, aber ich sehe grad, dass du das doch 
umangen hast. Deine Methode ist sicher besser, aber ich möchte jetzt mal 
wissen wieso meins nicht hinhaut, denn im endeffekt laufts ja aufs selbe 
hinaus oder nicht?

von Flo (Gast)


Lesenswert?

Vielleicht malst du mal ein Flussdiagramm, damit klar wird, was wo 
angesprungen werden muss.
Hilft ungemein weeiter ;-)

von spess53 (Gast)


Lesenswert?

Hi

>aber ich möchte jetzt mal wissen wieso meins nicht hinhaut, denn im
>endeffekt laufts ja aufs selbe hinaus oder nicht?...

Wenn ich mich nicht vertan habe, ja.
Ich habe dein Programm nicht auf die logische Richtigkeit überprüft. Was 
geht denn nicht?

MfG Spess

von Andy11 (Gast)


Angehängte Dateien:

Lesenswert?

spess53 schrieb:
> Wenn ich mich nicht vertan habe, ja.
> Ich habe dein Programm nicht auf die logische Richtigkeit überprüft. Was
> geht denn nicht?

tja nun jetzt weiß ich halt wieder nicht ob ich das ganze Programm 
posten soll oder nicht, großteils wurde das Programm schon teilweise im 
FOrum korriegiert, also Problem ist halt, dass er bei pind = 1 (siehe 
Abfrage unten) er die Messungen macht, das nehme ich jedenfalls an, denn 
er simbolisiert die LEDs und wenn die Messung fertig ist, dann tut sich 
nichts mehr, ich hoffe das coding ist ausreichend auskommentiert:

1
;**********************************Header**************************************
2
;* Projektname:  Roboter-Linienverfolgung                    *
3
;* Name des Erstellers: Shamoon Andy                      *
4
;* Zuletzt aktualisiert: 7.4.2010                        *
5
;* Beschreibung: Ein ROboter, der einer ca1,5-2cm breiten Linie nachfaährt    *                                      
6
;******************************************************************************
7
8
9
;*****************************Initialisierungen********************************
10
.include "m8def.inc" ;Definitionsdatei des Mega8
11
12
;Stackpointer-init***********
13
  ldi r16, High(Ramend)
14
  out SPH, r16
15
16
  ldi r16, Low(Ramend)
17
  out SPL, r16
18
19
HH:
20
  
21
22
23
RJMP HH
24
25
;ADC-init***********
26
  ldi r16, 0x20    ;Externe Referenz, Ergebnis linksbündig, Kanal 0 0b00100000
27
  out ADMUX, r16    ;Ausgabe
28
29
  ldi r16, 0x87    ;Enable ADC, Prescaler = 16  
30
  out ADCSRA, r16    ;Ausgabe
31
32
33
;*************************Variablendeklarationen*******************************
34
.def Messergebnisleft = r16
35
.def Messergebnisright = r17
36
.def Messergebnismiddle = r18
37
38
.def Schwellwertleft = r19
39
.def Schwellwertmiddle = r20
40
.def Schwellwertright = r21
41
42
.def Linksaus = r22
43
.def Mitteaus = r23
44
.def Rechtsaus = r24
45
46
.def Linienerkennung = r29
47
48
;*****************************Ein-Ausgänge*************************************
49
  sbi DDRB, 1    ;PORTB.1 als Ausgabeport
50
  sbi DDRB, 2    ;PORTB.2 als Ausgabeport
51
52
  cbi DDRD, 2    ;PORTD.2 als Eingabeport
53
  sbi PORTD, 2  ;Pullups aktivieren
54
55
;******************************************************************************
56
;Lese Werte von vorheriger Messung aus und speichere diese in 
57
;die Schwellwerte rein
58
  
59
  ;Lese SchwellwertLeft aus------------------------------------------------
60
  ldi ZL, 1  ;niederwertigen Bits laden, lese Adresse 1 aus
61
  ldi ZH, 0   ;unteres Byte des MessergebnisERAMleft
62
  rcall Read_EEPROM
63
  in Schwellwertleft, EEDR      ;Daten aus EPROM in Variable laden
64
  ;------------------------------------------------------------------------
65
  ;Lese SchwellwertMiddle aus----------------------------------------------
66
  ldi ZL, 2  ;niederwertigen Bits laden, lese Adresse 2 aus
67
  ldi ZH, 0   ;unteres Byte des MessergebnisERAMleft
68
  rcall Read_EEPROM
69
  in Schwellwertmiddle, EEDR      ;Daten aus EPROM in Variable laden
70
  ;-------------------------------------------------------------------------
71
  ;Lese SchwellwertRechts aus----------------------------------------------
72
  ldi ZL, 3  ;niederwertigen Bits laden, lese Adresse 3 aus
73
  ldi ZH, 0   ;unteres Byte des MessergebnisERAMleft
74
  rcall Read_EEPROM
75
  in Schwellwertright, EEDR      ;Daten aus EPROM in Variable laden
76
  ;-------------------------------------------------------------------------
77
78
79
  ;Lese Linksaus aus--------------------------------------------------------
80
  ldi ZL, 4      ;niederwertigen Bits laden, lese Adresse 4 aus
81
  ldi ZH, 0    ;Null für höhere Bits
82
  rcall Read_EEPROM
83
  in Linksaus, EEDR          ;Daten aus EPROM in Variable laden
84
  ;-------------------------------------------------------------------------
85
  ;Lese Mitteaus aus--------------------------------------------------------
86
  ldi ZL, 5      ;niederwertigen Bits laden, lese Adresse 5 aus
87
  ldi ZH, 0    ;Null für höhere Bits
88
  rcall Read_EEPROM
89
  in Mitteaus, EEDR          ;Daten aus EPROM in Variable laden
90
  ;-------------------------------------------------------------------------
91
  ;Lese Rechtsaus aus----------------------------------------------
92
  ldi ZL, 6    ;niederwertigen Bits laden, lese Adresse 6 aus
93
  ldi ZH, 0    ;Null für höhere Bits
94
  rcall Read_EEPROM
95
  in Rechtsaus, EEDR          ;Daten aus EPROM in Variable laden
96
  ;-------------------------------------------------------------------------
97
  
98
;*****************************Hauptprogramm************************************
99
Hauptprogramm:
100
rcall  ADC_Kanal0
101
rcall    StartADC
102
        in Messergebnisleft, ADCH
103
        cp Messergebnisleft, Schwellwertleft
104
        brsh LinksGroesser
105
MessungZW05:                        ;LINIENERKENNUNG linker LDR
106
        cp Messergebnisleft, Linksaus
107
        brlo LinksKleiner
108
MessungZW1: 
109
110
rcall  ADC_Kanal1
111
rcall    StartADC
112
        in Messergebnismiddle, ADCH
113
        cp Messergebnismiddle, Schwellwertmiddle
114
        brsh MitteGroesser
115
MessungZW15:                        ;LINIENERKENNUNG mittlerer LDR
116
        cp Messergebnismiddle, Mitteaus
117
        brlo MitteKleiner
118
MessungZW2:
119
120
rcall  ADC_Kanal2
121
rcall    StartADC
122
        in Messergebnisright, ADCH
123
        cp Messergebnisright, Schwellwertright
124
        brsh RechtsGroesser
125
MessungZW25:                        ;LINIENERKENNUNG rechter LDR
126
        cp Messergebnisright, Rechtsaus
127
        brlo RechtsKleiner
128
          
129
MessungZW3:
130
131
;#######Motoransteuerung##########
132
      cpi Linienerkennung, 0b00000001
133
      breq MotorLinks
134
MotorZW:
135
      cpi Linienerkennung, 0b00000010
136
      breq MotorMitte
137
MotorZW2:
138
      cpi Linienerkennung, 0b00000100
139
      breq MotorRechts
140
MotorZW3:
141
;#################################
142
143
144
    sbis PIND, 2        ;Überprüfe PIND.0
145
    rcall Messeschwellwert     ;Wenn PIND.0 = 0 (Taster betätigt)--> Messung
146
rjmp Hauptprogramm          ;ansosnten wieder von vorne
147
;*********************************************************************************
148
149
;Motoren setzen####################################
150
MotorLinks:
151
  sbi PORTB, 2
152
  cbi PORTB, 1
153
rjmp MotorZW
154
155
MotorMitte:
156
  sbi PORTB, 2
157
  sbi PORTB, 1
158
rjmp MotorZW2
159
160
MotorRechts:
161
  cbi PORTB, 2
162
  sbi PORTB, 1
163
rjmp MotorZW3
164
;##################################################
165
166
;Setze Bits in Byte für die Linienerkennung########
167
LinksGroesser:
168
  sbr Linienerkennung, 1  
169
rjmp MessungZW05
170
171
LinksKleiner:
172
  cbr Linienerkennung, 1
173
rjmp MessungZW1
174
175
176
MitteGroesser:
177
  sbr Linienerkennung, 2
178
rjmp MessungZW15
179
  
180
MitteKleiner:
181
  cbr Linienerkennung, 2
182
rjmp MessungZW2
183
184
185
RechtsGroesser:
186
  sbr Linienerkennung, 4
187
rjmp MessungZW25
188
189
RechtsKleiner:
190
  cbr Linienerkennung, 4
191
rjmp MessungZW3
192
193
;##################################################
194
195
;***********************Unterprogramme/Funktionen******************************
196
Messeschwellwert:
197
rcall  EnableADC
198
;***************************************
199
rcall  ADC_Kanal0
200
rcall    StartADC
201
        in r25, ADCH
202
203
rcall  ADC_Kanal1
204
rcall    StartADC
205
        in r26, ADCH      ;Messe alle Werte der LDRs bei weißem Untergrund
206
207
rcall  ADC_Kanal2
208
rcall    StartADC
209
        in r27, ADCH
210
;***************************************
211
212
rcall wait1        ;WARTE 1 SEK
213
214
sbi PORTB, 1
215
216
rcall wait3        ;WARTE 3 SEK
217
218
cbi PORTB, 1
219
220
;Linker Schwellwert--------------
221
rcall  ADC_Kanal0
222
rcall    StartADC
223
        push r28
224
        clr r28
225
        in Messergebnisleft, ADCH    ;Messe Wert auf schwarz vom linken LDR
226
        add r25, Messergebnisleft    ;Summe von Wert auf Schwarz und Wert auf Weiß
227
        in r28, SREG
228
        sbrc r28, 0
229
        ldi r28, 0b10000000        
230
        mov r30, r25          ;Lade Divident in Divisionsregister r30
231
        ldi r31, 2            ;Lade Divisor in Divisionsregister r31
232
rcall      division            ;dividiere die zwei zahlen
233
        mov Schwellwertleft, Ergebnis  ;bringe errechneten Schwellwert in definierte Variable(Register)
234
        add Schwellwertleft, r28
235
        push Ergebnis          ;sichere Ergebnis
236
          
237
          mov r25, Schwellwertleft    ;da r25 in Write EEPROM zum schreiben der Variable 
238
                          ;verwendet wird muss das Register kopiert werden  
239
          ldi ZH, 0             ;niederwertige Bit der EEPROM Adresse = 0
240
          ldi ZL, 1            ;schreibe EEPROM an adresse 1
241
rcall        Write_EEPROM          ;schreibe Wert in EEPROM
242
        
243
        pop Ergebnis          ;stelle ergebnis wieder her        
244
        subi Ergebnis, 5        ;Ausschaltschwelle (Schmitttriggerfunktion)
245
        mov Linksaus, Ergebnis      ;Lade es in fixen SPeicher
246
          
247
          mov r25, Linksaus        ;da r25 in Write EEPROM zum schreiben der Variable 
248
                          ;verwendet wird muss das Register kopiert werden  
249
          ldi ZH, 0             ;niederwertige Bit der EEPROM Adresse = 0
250
          ldi ZL, 4            ;schreibe EEPROM an adresse 1
251
rcall        Write_EEPROM          ;schreibe Wert in EEPROM  
252
        pop r28
253
rcall wait1   
254
;--------------------------------
255
256
sbi PORTB, 1
257
sbi PORTB, 2
258
259
rcall wait3
260
261
cbi PORTB, 1
262
cbi PORTB, 2
263
264
;Mittlerer Schwellwert-----------
265
rcall  ADC_Kanal1
266
rcall    StartADC
267
        push r28
268
        clr r28
269
        in Messergebnismiddle, ADCH    ;Messe Wert auf schwarz vom mittleren LDR
270
        add r26, Messergebnismiddle    ;Summe von Wert auf Schwarz und Wert auf Weiß
271
        in r28, SREG
272
        sbrc r28, 0
273
        ldi r28, 0b10000000  
274
        mov r30, r26          ;Lade Divident in Divisionsregister r30
275
        ldi r31, 2            ;Lade Divisor in Divisionsregister r31
276
rcall      division            ;dividiere die zwei zahlen
277
        mov Schwellwertmiddle, Ergebnis  ;bringe errechneten Schwellwert in definierte Variable(Register)  
278
         add Schwellwertmiddle, r28
279
        push Ergebnis          ;sichere Ergebnis
280
          
281
          mov r25, Schwellwertmiddle    ;da r25 in Write EEPROM zum schreiben der Variable 
282
                          ;verwendet wird muss das Register kopiert werden  
283
          ldi ZH, 0             ;niederwertige Bit der EEPROM Adresse = 0
284
          ldi ZL, 2            ;schreibe EEPROM an adresse 1
285
rcall        Write_EEPROM          ;schreibe Wert in EEPROM
286
        
287
        pop Ergebnis          ;stelle ergebnis wieder her  
288
        subi Ergebnis, 5        ;Ausschaltschwelle (Schmitttriggerfunktion)
289
        mov Mitteaus, Ergebnis      ;Lade es in fixen SPeicher
290
        
291
          mov r25, Mitteaus        ;da r25 in Write EEPROM zum schreiben der Variable 
292
                          ;verwendet wird muss das Register kopiert werden  
293
          ldi ZH, 0             ;niederwertige Bit der EEPROM Adresse = 0
294
          ldi ZL, 5            ;schreibe EEPROM an adresse 1
295
rcall        Write_EEPROM          ;schreibe Wert in EEPROM  
296
        pop r28
297
rcall wait1        
298
;--------------------------------
299
300
sbi PORTB, 2
301
302
rcall wait3
303
304
cbi PORTB, 2
305
306
;Rechter Schwellwert-------------
307
rcall  ADC_Kanal2
308
rcall    StartADC
309
        push r28
310
        clr r28
311
        in Messergebnisright, ADCH    ;Messe Wert auf schwarz vom rechten LDR
312
        add r27, Messergebnisright    ;Summe von Wert auf Schwarz und Wert auf Weiß
313
        in r28, SREG
314
        sbrc r28, 0
315
        ldi r28, 0b10000000
316
        mov r30, r27          ;Lade Divident in Divisionsregister r30
317
        ldi r31, 2            ;Lade Divisor in Divisionsregister r31
318
rcall      division            ;dividiere die zwei zahlen
319
        mov Schwellwertright, Ergebnis  ;bringe errechneten Schwellwert in definierte Variable(Register)  
320
        add Schwellwertright, r28
321
        push Ergebnis          ;sichere Ergebnis
322
          
323
          mov r25, Schwellwertright    ;da r25 in Write EEPROM zum schreiben der Variable 
324
                          ;verwendet wird muss das Register kopiert werden  
325
          ldi ZH, 0             ;niederwertige Bit der EEPROM Adresse = 0
326
          ldi ZL, 3            ;schreibe EEPROM an adresse 1
327
rcall        Write_EEPROM          ;schreibe Wert in EEPROM
328
        
329
        pop Ergebnis    
330
        subi Ergebnis, 5        ;Ausschaltschwelle (Schmitttriggerfunktion)
331
        mov Rechtsaus, Ergebnis    ;Lade es in fixen SPeicher
332
        
333
          mov r25, Rechtsaus        ;da r25 in Write EEPROM zum schreiben der Variable 
334
                          ;verwendet wird muss das Register kopiert werden  
335
          ldi ZH, 0             ;niederwertige Bit der EEPROM Adresse = 0
336
          ldi ZL, 6            ;schreibe EEPROM an adresse 1
337
rcall        Write_EEPROM          ;schreibe Wert in EEPROM    
338
        pop r28
339
rcall wait1           
340
;--------------------------------
341
342
rcall  DisableADC
343
ret
344
;*************************************
345
;*************************************
346
347
348
;################################################################################
349
.include "Division8Bit+Rest.asm"   ;8 Bit division    //call division
350
;.include "WaitCA1s.asm"        ;Warte ca 1s ab    //call wait
351
;.include "Stack_init.asm"      ;Stackinitialisieung//call Stack_init
352
;.include "ADC_init.asm"        ;ADCinitialisieung  //call ADC_init
353
.include "EnableADC.asm"      ;ADC erlauben    //call EnableADC
354
.include "DisableADC.asm"      ;ADC sperren    //call DisableADC
355
.include "StartADC.asm"        ;Starte Messung    //call StartADC
356
;.include "EndADC.asm"        ;Stoppe Messung    //call EndADC      
357
.include "ADC_Kanal0.asm"      ;Wechsel zu Kanal 0 //call ADC_Kanal0
358
.include "ADC_Kanal1.asm"      ;Wechsel zu Kanal 1 //call ADC_Kanal1
359
.include "ADC_Kanal2.asm"      ;Wechsel zu Kanal 2 //call ADC_Kanal2
360
;.include "ADC_Kanal3.asm"      ;Wechsel zu Kanal 3 //call ADC_Kanal3
361
;.include "ADC_Kanal4.asm"      ;Wechsel zu Kanal 4 //call ADC_Kanal4
362
;.include "ADC_Kanal5.asm"      ;Wechsel zu Kanal 5 //call ADC_Kanal5
363
;.include "ADC_Kanal6.asm"      ;Wechsel zu Kanal 6 //call ADC_Kanal6
364
;.include "ADC_Kanal7.asm"      ;Wechsel zu Kanal 7 //call ADC_Kanal7
365
;.include "PRESCALER=2.asm"      ;PSECALER einstellung für ADC
366
;.include "PRESCALER=8.asm"      ;PSECALER einstellung für ADC
367
;.include "PRESCALER=32.asm"    ;PSECALER einstellung für ADC
368
;.include "PRESCALER=128.asm"    ;PSECALER einstellung für ADC
369
.include "wait1.asm"
370
.include "wait3.asm"
371
.include "ReadEEPROM.asm"      ;        //call Read_EEPROM
372
.include "WriteEEPROM.asm"      ;        //call Write_EEPROM
373
;################################################################################

von spess53 (Gast)


Lesenswert?

Hi

Das muss ich mir erst mal in Ruhe zu Gemüte führen. Allerdings ein 
erzeugt ein erster Überblick gesträubte Nackenhaare.

MfG Spess

von Andy11 (Gast)


Lesenswert?

spess53 schrieb:
> Das muss ich mir erst mal in Ruhe zu Gemüte führen. Allerdings ein
> erzeugt ein erster Überblick gesträubte Nackenhaare.

ok, das
HH:



RJMP HH

vergiss mal, das hab ich nur wegen vorhin reingemacht wegen den Sprüngen

von Hannes L. (hannes)


Lesenswert?

Andy11 schrieb:
> spess53 schrieb:
>> Das muss ich mir erst mal in Ruhe zu Gemüte führen. Allerdings ein
>> erzeugt ein erster Überblick gesträubte Nackenhaare.
>
> ok, das
> HH:
>
>
>
> RJMP HH
>
> vergiss mal, das hab ich nur wegen vorhin reingemacht wegen den Sprüngen

Das ist es nicht, es ist Dein Programmierstil. Dein Spaghetticode ist 
extrem schwer nachvollziehbar. Es ist zuviel Hinundherspringerei zu 
Sprungzielen, die auch noch in anderen Dateien liegen. Das ist unnötig 
unübersichtlich. Und effizient ist Deine Vorgehensweise auch nicht, Du 
hast zuviel Wartezeit auf den ADC. Wenn man mehrere Kanäle messen muss, 
dann lohnt es sich, dies in einer Statemachine im Hintergrund zu tun. 
Klar, als Anfänger kann man das noch nicht, aber als Anfänger beginnt 
man auch nicht gleich mir einer Robotersteuerung mit Linienverfolgung. 
Ehe man das macht, erarbeitet man sich an kleineren Basteleien das 
nötige Knowhow (Statemachine, Timer-Interrupt, ...).

Dazu kommt noch die grauenhafte Formatierung (Einrückung). Hier mal ein 
Beispiel, wie man einen ASM-Quelltext formatieren kann damit er halbwegs 
lesbar bleibt:
http://www.mikrocontroller.net/attachment/67466/IR8_V12_SAA3008.asm
Noch ein Tip zur Formatierung: Solltest Du Interesse daran haben, dass 
die Formatierung auch außerhalb von AVR-Studio korrekt angezeigt wird, 
dann könntest Du in den Einstellungen zum Editor mal die Tabs durch 
Spaces ersetzen lassen. Das macht den Quelltext zwar geringfügig größer, 
wird dann aber von jedem Textbetrachterprogramm korrekt dargestellt.

Ich weiß nicht, wo Du Dir diesen Programmierstil abgeschaut hast, mir 
ist das jedenfalls zu unübersichtlich. Deshalb habe ich mich auch bisher 
aus diesem Thread herausgehalten.

Mir geht es nicht darum, Dich "niederzumachen". Aber wenn es Dir keiner 
sagt, dann kannst Du es ja nicht ändern...

...

von Karl H. (kbuchegg)


Lesenswert?

Hannes Lux schrieb:

> Mir geht es nicht darum, Dich "niederzumachen". Aber wenn es Dir keiner
> sagt, dann kannst Du es ja nicht ändern...

Puuh, bin ich froh.
Ich hab mich zurückgehalten, damit ich nicht schon wieder als Nörgler 
dastehe.


Meines Erachtens wurde zuviel Wert darauf gelegt, den BASCOM Code 
möglichst 1:1 zu übernehmen (in dem Fall frag ich mich dann, warum 
bleibt man nicht gleich bei BASCOM, das könnte man wenigstens lesen), 
anstatt sich die Idee des Codes, das Prinzip, herauszuextrahieren und 
mit dieser Idee im Hinterkopf ein Assemblerprogramm zu konzipieren. Ich 
sag absichtlich 'konzipieren', denn wenn man einfach drauflos 
programmiert, dann kommt genau sowas raus.

Zum Thema 100-tausend Files mit 'Funktionen' die aus 3 Anweisungen 
bestehen, sag ich nichts mehr, das wurde in einem anderen Thread schon 
angesprochen, dass das Murks ist. Nicht notwendigerweise die Funktion an 
sich, sondern das Auslagern in die vielen Files. Da findet man doch 
nichts mehr.

An den TO
Sieh dir auch an, wie Hannes kommentiert.
Einen Kommentar wie diesen hier
1
rcall        Write_EEPROM          ;schreibe Wert in EEPROM
kannst du dir schenken. Ich nenn das gerne einen Alibi-Kommentar. Das da 
etwas ins EEPROM geschrieben wird, kann ich zur Not auch erraten, wenn 
ich mich frage, welche Funktionalität sich hinter einer Funktion 
'Write_EEPROM' verstecken wird. Man muss nicht Uri Geller heissen um das 
zu erraten. Kommentier lieber was im EEPROM wo abgelegt wird. Generell: 
Kommentiere das Warum und nicht das Wie. Ein Kommentar soll mir erzählen 
warum etwas passiert, welche Nebenbedingungen es gibt, was sich aus 
einer höheren Sichtweise gesehen an dieser Stelle abspielt. Wie das 
gemacht wird steht im Code.
Zum Teil laufen deine Kommentare schon in diese Richtung, aber die 
meisten sind von der ersten Sorte.

von spess53 (Gast)


Lesenswert?

Hi

Hannes und Karl Heinz haben meine Meinung zu deinem Programm schon auf 
den Punkt gebracht. Erspart mir einige Schreiberei. Danke.

Ein paar Bemerkungen zu deinem Programm:

>;*************************Variablendeklarationen*********************** ********
>.def Messergebnisleft = r16
>.def Messergebnisright = r17
>.....
>.def Rechtsaus = r24
>.def Linienerkennung = r29

Was soll das in den Registern? Dein AVR hat Ram.


>;*****************************Hauptprogramm**************************** ********
>Hauptprogramm:
>rcall  ADC_Kanal0
>rcall    StartADC

Mach dir ein Unterprogramm das die AD-Wandlung macht. Übergabe des 
Kanals in
einem Register und Rückgabe des Wertes in einem/dem Register.

.....
>RechtsKleiner:
>  cbr Linienerkennung, 4
>rjmp MessungZW3
>;##################################################

Das hatten wir schon. (sinnloses herumgehüpfe)

>in Messergebnisleft, ADCH    ;Messe Wert auf schwarz vom linken LDR
>add r25, Messergebnisleft    ;Summe von Wert auf Schwarz und Wert auf Weiß

>in r28, SREG
>sbrc r28, 0

Das ist No go
Lesbar und auch noch kürzer:
1
         add r25, Messergebnisleft    ;Summe von Wert auf Schwarz und Wert auf Weiß
2
         brnc xyz
3
         ldi r28, 0b10000000        
4
xyz:     mov r30, r25

>ldi r28, 0b10000000

>mov r30, r25
>ldi r31, 2
>rcall division

Die Division kannst du dir sparen. Ein 'lsr r25' reicht.

>mov Schwellwertleft, Ergebnis
>add Schwellwertleft, r28

Bist du sicher, das du u.U. SREG addieren willst (->in r28, SREG) ?

>push Ergebnis

Ich habe nicht alle deine Threads komplett verfolgt, aber etliche 
Vorschläge kommen mir bekannt vor. Kann es sein, das du etwas 
beratungsresistent bist.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

und um auch mal etwas Konkretes beizusteuern:
Schau dir mal diese Sequenz an
1
;#######Motoransteuerung##########
2
      cpi Linienerkennung, 0b00000001
3
      breq MotorLinks
4
MotorZW:
5
      cpi Linienerkennung, 0b00000010
6
      breq MotorMitte
7
MotorZW2:
8
      cpi Linienerkennung, 0b00000100
9
      breq MotorRechts
10
MotorZW3:
11
;#################################
12
13
14
    sbis PIND, 2        ;Überprüfe PIND.0
15
    rcall Messeschwellwert     ;Wenn PIND.0 = 0 (Taster betätigt)--> Messung
16
rjmp Hauptprogramm          ;ansosnten wieder von vorne
17
;*********************************************************************************
18
19
;Motoren setzen####################################
20
MotorLinks:
21
  sbi PORTB, 2
22
  cbi PORTB, 1
23
rjmp MotorZW
24
25
MotorMitte:
26
  sbi PORTB, 2
27
  sbi PORTB, 1
28
rjmp MotorZW2
29
30
MotorRechts:
31
  cbi PORTB, 2
32
  sbi PORTB, 1
33
rjmp MotorZW3

Wie ist das der Programmfluss?
Wenn Linienerkennung 0x01, 0x02, 0x04 ist, dann geht es einmal runter zu 
einem Label, da sind dann 2 Befehle und es wird wieder hochgesprungen.
Ziel der Sache ist es, dass diese Befehle nur dann ausgeführt werden, 
wenn eine bestimmte Bedinungung wahr ist.

Das kann man auch in der Logik umdrehen: Wenn die entsprechende Bedinung 
nicht wahr ist, dann werden ganz einfach die beiden Befehle 
übersprungen.
Das sieht dann so aus
1
;#######Motoransteuerung##########
2
      cpi   Linienerkennung, 0b00000001
3
      brne  MotorZW
4
      sbi   PORTB, 2         ; Motoren auf Links schalten
5
      cbi   PORTB, 1
6
7
MotorZW:
8
      cpi   Linienerkennung, 0b00000010
9
      brne  MotorZW2
10
      sbi   PORTB, 2         ; Motoren auf Mitte schalten
11
      sbi   PORTB, 1
12
13
MotorZW2:
14
      cpi   Linienerkennung, 0b00000100
15
      brne  MotorZW3
16
      cbi   PORTB, 2         ; Motoren auf Rechts schalten
17
      sbi   PORTB, 1
18
19
MotorZW3:
20
      sbis  PIND, 2             ;Überprüfe PIND.0
21
      rcall Messeschwellwert    ;Wenn PIND.0 = 0 (Taster betätigt)--> Messung
22
      rjmp  Hauptprogramm       ;ansosnten wieder von vorne
23
;*********************************************************************************

Die ganze Sequenz ist fast um die Hälfte kürzer geworden. Ausserdem muss 
man nicht mehr ständig auf und ab scrollen um zu sehen, was die Abfragen 
bei Linienerkennung überhaupt bewirken. Auf einer halben Bildschirmseite 
kann man mit '3 Augenbewegungen' sowohl die Bedingungen als auch die 
davon abhängige Operation überblicken. In der Logik hat sich nichts 
geändert, aber durch die Schreibweise hat alles an Klarheit gewonnen.


Warum wir auf solchen Dingen so dermassen rumreiten:
Weil ein gutes, möglichst fehlerfreies Programm auch immer eine Frage 
des Programmierstils ist. Programme die unübersichtlich sind, bei denen 
wie wild herumgespungen wird, es schwierig ist den Programmfluss zu 
verfolgen, sind tendenziell genau die Programme, bei denen laufend 
irgendwelche Fehler auftreten. Fehler die dann nicht dadurch behoben 
werden, dass man zunächst die Programmstruktur bereinigt, sondern 
dadurch, dass wieder irgendwo ein 'Heftpflaster' aufgeklebt wird, 
welches sich dann oft genug als neuer Quell von neuen Fehlern entpuppt. 
Man würde ja gerne sauber korrigieren aber in der Jump-Flut findet man 
die Stelle gar nicht, wo mein eigentlich ansetzen muss.

Programme hingegen, die eine saubere äussere Form haben, bei denen der 
Programmfluss im wesentlichen von oben nach unten verfläuft und nur in 
Ausnahmefällen kommt ab und zu ein Sprung vor (der dann meistens auch 
nicht sehr weit geht), das sind die Programme, die man im Kopf gut 
verfolgen kann, bei denen sich einem die dahintersteckende Logik 
förmlich aufdrängt und das sind auch die Programme, die meistens 
wesentlich weniger Probleme machen.

Ob Programme mmöglichst fehlerfrei sind oder nicht, ist nicht nur eine 
Frage der Logik, sondern auch oft eine Frage der äußeren Form und wie 
kompliziert ein Programm aufgebaut ist. Je verwickelter desto 
wahrscheinlicher ist es, das Problemstellen unentdeckt bleiben. Je 
geradliniger, desto besser sieht man Probleme.

Ein Programm in kleinere Blöcke zu zerteilen ist grundsätzlich eine gute 
Sache, keine Frage. Aber du hast es ganz einfach übertrieben. Deine 2 
Zeilen Unterprogramme ADC_Kanal0, ADC_Kanal1, ADC_Start und was da noch 
so alles kreucht und fleucht, verschleiern mehr als sie Klarheit ins 
Programm bringen. Man muss ständig rumscrollen (oder Files wechseln) um 
sich zu vergewissern ob und wenn ja welche Register verändert werden, ob 
sie ordnungsgemäss gesichert werden oder nicht, welche global 
verwendeten Register verändert werden, etc ...

von Andy11 (Gast)


Angehängte Dateien:

Lesenswert?

ok, da es anscheinend wirklich unübersichtlich ist habe ich das ganze 
verbessert:
1
;**********************************Header**************************************
2
;* Projektname:  Roboter-Linienverfolgung                    *
3
;* Name des Erstellers: Shamoon Andy                      *
4
;* Zuletzt aktualisiert: 7.4.2010                        *
5
;* Beschreibung: Ein ROboter, der einer ca1,5-2cm breiten Linie nachfaährt    *                                      
6
;******************************************************************************
7
8
9
;*****************************Initialisierungen********************************
10
.include "m8def.inc" ;Definitionsdatei des Mega8
11
12
;Stackpointer-init***********
13
  ldi r16, High(Ramend)
14
  out SPH, r16
15
16
  ldi r16, Low(Ramend)
17
  out SPL, r16
18
19
;ADC-init***********
20
  sbi ADCSRA, ADEN  ;ADC erlauben
21
  cbi ADCSRA, ADPS0  
22
  sbi ADCSRA, ADPS1  
23
  sbi ADCSRA, ADPS2  ;PRESCALER 64 
24
25
;*************************Variablendeklarationen*******************************
26
.def Messergebnisleft = r16
27
.def Messergebnisright = r17
28
.def Messergebnismiddle = r18
29
30
.def Schwellwertleft = r19
31
.def Schwellwertmiddle = r20
32
.def Schwellwertright = r21
33
34
.def Linksaus = r22
35
.def Mitteaus = r23
36
.def Rechtsaus = r24
37
38
.def Linienerkennung = r29
39
40
;*****************************Ein-Ausgänge*************************************
41
  sbi DDRB, 1    ;PORTB.1 als Ausgabeport
42
  sbi DDRB, 2    ;PORTB.2 als Ausgabeport
43
44
  cbi DDRD, 2    ;PORTD.2 als Eingabeport
45
  sbi PORTD, 2  ;Pullups aktivieren
46
47
  
48
;*****************************Hauptprogramm************************************
49
Hauptprogramm:
50
clr Linienerkennung ;Virbereitung auf neue Messung
51
52
    
53
;TEIL1...................START.......................Messe aktuelle Werte der Linie aus
54
rcall  StartADConChanel0_8bit      
55
      in Messergebnisleft, ADCH
56
rcall  StartADConChanel1_8bit      
57
      in Messergebnismiddle, ADCH
58
rcall  StartADConChanel2_8bit      
59
      in Messergebnisright, ADCH    
60
61
;TEIL2...................START.......................Erstelle aktuelle Werte für Linienerkennung
62
    cp Messergebnisleft, Schwellwertleft  ;Vergleiche LDR links aktuell mit vorher ausgerechnetem
63
                        ;Schwellwert
64
    brlo FahreFort0                  
65
    ldi Linienerkennung, 0b00000100        ;Wenn nicht kleiner, sprich wenn größer dann setze Bit auf 1
66
                        
67
FahreFort0:
68
69
70
71
    cp Messergebnismiddle, Schwellwertmiddle  ;Vergleiche LDR mitte aktuell mit vorher ausgerechnetem
72
                          ;Schwellwert
73
    brlo FahreFort1                  
74
    ldi Linienerkennung, 0b00000010        ;Wenn nicht kleiner, sprich wenn größer dann setze Bit auf 1
75
                        
76
FahreFort1:                    ;wenn kleiner dann lass es auf Null
77
    
78
79
80
    cp Messergebnisright, Schwellwertright  ;Vergleiche LDR rechts aktuell mit vorher ausgerechnetem
81
                        ;Schwellwert
82
    brlo FahreFort2                  
83
    ldi Linienerkennung, 0b00000001        ;Wenn nicht kleiner, sprich wenn größer dann setze Bit auf 1
84
                        
85
FahreFort2:                    ;wenn kleiner dann lass es auf Null  
86
87
;TEIL3...................START.......................Auswertung-->Motorsteuerung
88
    
89
    sbrc Linienerkennung, 2  
90
      ldi r28, 0b00000010    ;Motor = Rechts
91
      out PORTB, r28
92
    sbrc Linienerkennung, 1    
93
      ldi r28, 0b00000110    ;Motor = Beide
94
      out PORTB, r28
95
    sbrc Linienerkennung, 0    
96
      ldi r28, 0b00000100    ;Motor = Links
97
      out PORTB, r28
98
;TEIL4...................START.......................Falls neie Messung vorgesehen dann mache sie zuerst
99
    sbis PIND, 2        ;Überprüfe PIND.0
100
    rcall Messeschwellwert     ;Wenn PIND.0 = 0 (Taster betätigt)--> Messung
101
rjmp Hauptprogramm          ;ansosnten wieder von vorne
102
;*********************************************************************************
103
104
105
106
;***********************Unterprogramme/Funktionen******************************
107
Messeschwellwert:
108
rcall  StartADConChanel0_8bit      ;Messe linken LDR bei weißem Untergrund
109
      in r25, ADCH
110
rcall  StartADConChanel1_8bit      ;Messe mittleren LDR bei weißem Untergrund
111
      in r26, ADCH
112
rcall  StartADConChanel2_8bit      ;Messe rechten LDR bei weißem Untergrund
113
      in r27, ADCH
114
rcall Wait1
115
sbi PORTB,1
116
rcall Wait3
117
cbi PORTB, 1
118
119
  ;Linker Schwellwert--------------
120
  push r28 ;In diesem Register wird das Carry einer Addition geprüft, deswegen ist sicherung nötig
121
  clr r28  ;lösche registerinhalt in r28 zur neuen Anwendung
122
  rcall  StartADConChanel0_8bit
123
        in Messergebnisleft, ADCH   ;Messe LDRleft bei schwarzem Untergrund
124
        add  r25, Messergebnisleft  ;Addiere Weißen Wert mit Schwarzen Wert
125
        BRCC RechneWeiter0;Teste Carry Flag wegen Addition, wenn 1 dann war ein Überlauf und lade
126
        ;128 in ein Register weil nachher der Mittelwert gebildet wird und dafür 
127
        ;eine 9 Bit Zahl notwendig ist, dh: r27/2 + (Register mit Carry = 255/2)
128
        ;ergibt den richtigen Schwellwert
129
        
130
        ldi r28, 128  ;wenn Carry 1 dann lade 128 in carry-register
131
132
  RechneWeiter0:        ;wenn Carry 0 dann lasse carry-Register auf 0 (wenn Schwellwerte niedrig)
133
        mov r16, r25  ;Den Dividenten ins Register der Division kopieren
134
                ;Diese Register ist als Messergebnisleft definiert
135
                ;jedoch hats keine auswirkung, denn dies wird hier nicht verwendet
136
        ldi r17, 2    ;Den Divisor ins Register der Division laden
137
                ;Dieses Register ist Messergebnismiddle, dass tört aber keinen
138
                ;da hier nicht verwendet
139
        rcall Division
140
                ;Ergebnis steht jetzt in Register Ergebnis (r30)
141
142
        add r28, Ergebnis  ;Korrektur falls Carry 1 war, dies dinet dazu, falls der Schwellwert
143
                  ;bei verschiedenen Linienfarben unterschiedlich, kann es sein
144
                  ;dass es kleinere Spannungen auch geben kann, daher muss
145
                  ;ein möglicher Überlauf berücksichtigt werden
146
        
147
        ;Endergebnis steht jetzt in r28
148
149
        mov Schwellwertleft, r28  ;Kopiere den Schwellwert in definiertes Register
150
                      ;für diesen Wert
151
  rcall Wait1  
152
  pop r28    
153
    ;--------------------------------
154
155
sbi PORTB, 1
156
sbi PORTB, 2                                      
157
rcall Wait3
158
cbi PORTB, 1
159
cbi PORTB, 2
160
161
    ;Mittlerer Schwellwert-----------
162
  push r28 ;In diesem Register wird das Carry einer Addition geprüft, deswegen ist sicherung nötig
163
  clr r28  ;lösche registerinhalt in r28 zur neuen Anwendung
164
  rcall  StartADConChanel1_8bit
165
        in Messergebnismiddle, ADCH   ;Messe LDRleft bei schwarzem Untergrund
166
        add  r26, Messergebnismiddle  ;Addiere Weißen Wert mit Schwarzen Wert
167
        BRCC RechneWeiter1;Teste Carry Flag wegen Addition, wenn 1 dann war ein Überlauf und lade
168
        ;128 in ein Register weil nachher der Mittelwert gebildet wird und dafür 
169
        ;eine 9 Bit Zahl notwendig ist, dh: r27/2 + (Register mit Carry = 255/2)
170
        ;ergibt den richtigen Schwellwert
171
        
172
        ldi r28, 128  ;wenn Carry 1 dann lade 128 in carry-register
173
174
  RechneWeiter1:        ;wenn Carry 0 dann lasse carry-Register auf 0 (wenn Schwellwerte niedrig)
175
        mov r16, r26  ;Den Dividenten ins Register der Division kopieren
176
                ;Diese Register ist als Messergebnisleft definiert
177
                ;jedoch hats keine auswirkung, denn dies wird hier nicht verwendet
178
        ldi r17, 2    ;Den Divisor ins Register der Division laden
179
                ;Dieses Register ist Messergebnismiddle, dass tört aber keinen
180
                ;da hier nicht verwendet
181
        rcall Division
182
                ;Ergebnis steht jetzt in Register Ergebnis (r30)
183
184
        add r28, Ergebnis  ;Korrektur falls Carry 1 war, dies dinet dazu, falls der Schwellwert
185
                  ;bei verschiedenen Linienfarben unterschiedlich, kann es sein
186
                  ;dass es kleinere Spannungen auch geben kann, daher muss
187
                  ;ein möglicher Überlauf berücksichtigt werden
188
        
189
        ;Endergebnis steht jetzt in r28
190
191
        mov Schwellwertmiddle, r28  ;Kopiere den Schwellwert in definiertes Register
192
                      ;für diesen Wert
193
  rcall Wait1  
194
  pop r28    
195
    ;--------------------------------
196
197
sbi PORTB, 2 
198
rcall Wait3
199
cbi PORTB, 2
200
201
    ;Rechter Schwellwert-------------
202
   push r28 ;In diesem Register wird das Carry einer Addition geprüft, deswegen ist sicherung nötig
203
  clr r28  ;lösche registerinhalt in r28 zur neuen Anwendung
204
  rcall  StartADConChanel2_8bit
205
        in Messergebnisright, ADCH   ;Messe LDRleft bei schwarzem Untergrund
206
        add  r27, Messergebnisright  ;Addiere Weißen Wert mit Schwarzen Wert
207
        BRCC RechneWeiter2;Teste Carry Flag wegen Addition, wenn 1 dann war ein Überlauf und lade
208
        ;128 in ein Register weil nachher der Mittelwert gebildet wird und dafür 
209
        ;eine 9 Bit Zahl notwendig ist, dh: r27/2 + (Register mit Carry = 255/2)
210
        ;ergibt den richtigen Schwellwert
211
212
        ldi r28, 128  ;wenn Carry 1 dann lade 128 in carry-register
213
214
  RechneWeiter2:        ;wenn Carry 0 dann lasse carry-Register auf 0 (wenn Schwellwerte niedrig)
215
        mov r16, r27  ;Den Dividenten ins Register der Division kopieren
216
                ;Diese Register ist als Messergebnisleft definiert
217
                ;jedoch hats keine auswirkung, denn dies wird hier nicht verwendet
218
        ldi r17, 2    ;Den Divisor ins Register der Division laden
219
                ;Dieses Register ist Messergebnismiddle, dass tört aber keinen
220
                ;da hier nicht verwendet
221
        rcall Division
222
                ;Ergebnis steht jetzt in Register Ergebnis (r30)
223
224
        add r28, Ergebnis  ;Korrektur falls Carry 1 war, dies dinet dazu, falls der Schwellwert
225
                  ;bei verschiedenen Linienfarben unterschiedlich, kann es sein
226
                  ;dass es kleinere Spannungen auch geben kann, daher muss
227
                  ;ein möglicher Überlauf berücksichtigt werden
228
        
229
        ;Endergebnis steht jetzt in r28
230
231
        mov Schwellwertright, r28  ;Kopiere den Schwellwert in definiertes Register
232
                      ;für diesen Wert
233
  rcall Wait1  
234
  pop r28    
235
    ;--------------------------------
236
237
ret
238
;*************************************
239
;*************************************
240
241
242
;################################################################################
243
.include "Division8Bit+Rest.asm"   ;8 Bit division    //call division
244
.include "wait1.asm"
245
.include "wait3.asm"
246
.include "ReadEEPROM.asm"      ;        //call Read_EEPROM
247
.include "WriteEEPROM.asm"      ;        //call Write_EEPROM
248
.include "StartADConCHANEL0_8bit.asm"
249
.include "StartADConCHANEL1_8bit.asm"
250
.include "StartADConCHANEL2_8bit.asm"
251
;################################################################################

von Andy11 (Gast)


Angehängte Dateien:

Lesenswert?

ok, da es anscheinend wirklich unübersichtlich ist habe ich das ganze 
verbessert:
1
;**********************************Header**************************************
2
;* Projektname:  Roboter-Linienverfolgung                    *
3
;* Name des Erstellers: Shamoon Andy                      *
4
;* Zuletzt aktualisiert: 7.4.2010                        *
5
;* Beschreibung: Ein ROboter, der einer ca1,5-2cm breiten Linie nachfaährt    *                                      
6
;******************************************************************************
7
8
9
;*****************************Initialisierungen********************************
10
.include "m8def.inc" ;Definitionsdatei des Mega8
11
12
;Stackpointer-init***********
13
  ldi r16, High(Ramend)
14
  out SPH, r16
15
16
  ldi r16, Low(Ramend)
17
  out SPL, r16
18
19
;ADC-init***********
20
  sbi ADCSRA, ADEN  ;ADC erlauben
21
  cbi ADCSRA, ADPS0  
22
  sbi ADCSRA, ADPS1  
23
  sbi ADCSRA, ADPS2  ;PRESCALER 64 
24
25
;*************************Variablendeklarationen*******************************
26
.def Messergebnisleft = r16
27
.def Messergebnisright = r17
28
.def Messergebnismiddle = r18
29
30
.def Schwellwertleft = r19
31
.def Schwellwertmiddle = r20
32
.def Schwellwertright = r21
33
34
.def Linksaus = r22
35
.def Mitteaus = r23
36
.def Rechtsaus = r24
37
38
.def Linienerkennung = r29
39
40
;*****************************Ein-Ausgänge*************************************
41
  sbi DDRB, 1    ;PORTB.1 als Ausgabeport
42
  sbi DDRB, 2    ;PORTB.2 als Ausgabeport
43
44
  cbi DDRD, 2    ;PORTD.2 als Eingabeport
45
  sbi PORTD, 2  ;Pullups aktivieren
46
47
  
48
;*****************************Hauptprogramm************************************
49
Hauptprogramm:
50
clr Linienerkennung ;Virbereitung auf neue Messung
51
52
    
53
;TEIL1...................START.......................Messe aktuelle Werte der Linie aus
54
rcall  StartADConChanel0_8bit      
55
      in Messergebnisleft, ADCH
56
rcall  StartADConChanel1_8bit      
57
      in Messergebnismiddle, ADCH
58
rcall  StartADConChanel2_8bit      
59
      in Messergebnisright, ADCH    
60
61
;TEIL2...................START.......................Erstelle aktuelle Werte für Linienerkennung
62
    cp Messergebnisleft, Schwellwertleft  ;Vergleiche LDR links aktuell mit vorher ausgerechnetem
63
                        ;Schwellwert
64
    brlo FahreFort0                  
65
    ldi Linienerkennung, 0b00000100        ;Wenn nicht kleiner, sprich wenn größer dann setze Bit auf 1
66
                        
67
FahreFort0:
68
69
70
71
    cp Messergebnismiddle, Schwellwertmiddle  ;Vergleiche LDR mitte aktuell mit vorher ausgerechnetem
72
                          ;Schwellwert
73
    brlo FahreFort1                  
74
    ldi Linienerkennung, 0b00000010        ;Wenn nicht kleiner, sprich wenn größer dann setze Bit auf 1
75
                        
76
FahreFort1:                    ;wenn kleiner dann lass es auf Null
77
    
78
79
80
    cp Messergebnisright, Schwellwertright  ;Vergleiche LDR rechts aktuell mit vorher ausgerechnetem
81
                        ;Schwellwert
82
    brlo FahreFort2                  
83
    ldi Linienerkennung, 0b00000001        ;Wenn nicht kleiner, sprich wenn größer dann setze Bit auf 1
84
                        
85
FahreFort2:                    ;wenn kleiner dann lass es auf Null  
86
87
;TEIL3...................START.......................Auswertung-->Motorsteuerung
88
    
89
    sbrc Linienerkennung, 2  
90
      ldi r28, 0b00000010    ;Motor = Rechts
91
      out PORTB, r28
92
    sbrc Linienerkennung, 1    
93
      ldi r28, 0b00000110    ;Motor = Beide
94
      out PORTB, r28
95
    sbrc Linienerkennung, 0    
96
      ldi r28, 0b00000100    ;Motor = Links
97
      out PORTB, r28
98
;TEIL4...................START.......................Falls neie Messung vorgesehen dann mache sie zuerst
99
    sbis PIND, 2        ;Überprüfe PIND.0
100
    rcall Messeschwellwert     ;Wenn PIND.0 = 0 (Taster betätigt)--> Messung
101
rjmp Hauptprogramm          ;ansosnten wieder von vorne
102
;*********************************************************************************
103
104
105
106
;***********************Unterprogramme/Funktionen******************************
107
Messeschwellwert:
108
rcall  StartADConChanel0_8bit      ;Messe linken LDR bei weißem Untergrund
109
      in r25, ADCH
110
rcall  StartADConChanel1_8bit      ;Messe mittleren LDR bei weißem Untergrund
111
      in r26, ADCH
112
rcall  StartADConChanel2_8bit      ;Messe rechten LDR bei weißem Untergrund
113
      in r27, ADCH
114
rcall Wait1
115
sbi PORTB,1
116
rcall Wait3
117
cbi PORTB, 1
118
119
  ;Linker Schwellwert--------------
120
  push r28 ;In diesem Register wird das Carry einer Addition geprüft, deswegen ist sicherung nötig
121
  clr r28  ;lösche registerinhalt in r28 zur neuen Anwendung
122
  rcall  StartADConChanel0_8bit
123
        in Messergebnisleft, ADCH   ;Messe LDRleft bei schwarzem Untergrund
124
        add  r25, Messergebnisleft  ;Addiere Weißen Wert mit Schwarzen Wert
125
        BRCC RechneWeiter0;Teste Carry Flag wegen Addition, wenn 1 dann war ein Überlauf und lade
126
        ;128 in ein Register weil nachher der Mittelwert gebildet wird und dafür 
127
        ;eine 9 Bit Zahl notwendig ist, dh: r27/2 + (Register mit Carry = 255/2)
128
        ;ergibt den richtigen Schwellwert
129
        
130
        ldi r28, 128  ;wenn Carry 1 dann lade 128 in carry-register
131
132
  RechneWeiter0:        ;wenn Carry 0 dann lasse carry-Register auf 0 (wenn Schwellwerte niedrig)
133
        mov r16, r25  ;Den Dividenten ins Register der Division kopieren
134
                ;Diese Register ist als Messergebnisleft definiert
135
                ;jedoch hats keine auswirkung, denn dies wird hier nicht verwendet
136
        ldi r17, 2    ;Den Divisor ins Register der Division laden
137
                ;Dieses Register ist Messergebnismiddle, dass tört aber keinen
138
                ;da hier nicht verwendet
139
        rcall Division
140
                ;Ergebnis steht jetzt in Register Ergebnis (r30)
141
142
        add r28, Ergebnis  ;Korrektur falls Carry 1 war, dies dinet dazu, falls der Schwellwert
143
                  ;bei verschiedenen Linienfarben unterschiedlich, kann es sein
144
                  ;dass es kleinere Spannungen auch geben kann, daher muss
145
                  ;ein möglicher Überlauf berücksichtigt werden
146
        
147
        ;Endergebnis steht jetzt in r28
148
149
        mov Schwellwertleft, r28  ;Kopiere den Schwellwert in definiertes Register
150
                      ;für diesen Wert
151
  rcall Wait1  
152
  pop r28    
153
    ;--------------------------------
154
155
sbi PORTB, 1
156
sbi PORTB, 2                                      
157
rcall Wait3
158
cbi PORTB, 1
159
cbi PORTB, 2
160
161
    ;Mittlerer Schwellwert-----------
162
  push r28 ;In diesem Register wird das Carry einer Addition geprüft, deswegen ist sicherung nötig
163
  clr r28  ;lösche registerinhalt in r28 zur neuen Anwendung
164
  rcall  StartADConChanel1_8bit
165
        in Messergebnismiddle, ADCH   ;Messe LDRleft bei schwarzem Untergrund
166
        add  r26, Messergebnismiddle  ;Addiere Weißen Wert mit Schwarzen Wert
167
        BRCC RechneWeiter1;Teste Carry Flag wegen Addition, wenn 1 dann war ein Überlauf und lade
168
        ;128 in ein Register weil nachher der Mittelwert gebildet wird und dafür 
169
        ;eine 9 Bit Zahl notwendig ist, dh: r27/2 + (Register mit Carry = 255/2)
170
        ;ergibt den richtigen Schwellwert
171
        
172
        ldi r28, 128  ;wenn Carry 1 dann lade 128 in carry-register
173
174
  RechneWeiter1:        ;wenn Carry 0 dann lasse carry-Register auf 0 (wenn Schwellwerte niedrig)
175
        mov r16, r26  ;Den Dividenten ins Register der Division kopieren
176
                ;Diese Register ist als Messergebnisleft definiert
177
                ;jedoch hats keine auswirkung, denn dies wird hier nicht verwendet
178
        ldi r17, 2    ;Den Divisor ins Register der Division laden
179
                ;Dieses Register ist Messergebnismiddle, dass tört aber keinen
180
                ;da hier nicht verwendet
181
        rcall Division
182
                ;Ergebnis steht jetzt in Register Ergebnis (r30)
183
184
        add r28, Ergebnis  ;Korrektur falls Carry 1 war, dies dinet dazu, falls der Schwellwert
185
                  ;bei verschiedenen Linienfarben unterschiedlich, kann es sein
186
                  ;dass es kleinere Spannungen auch geben kann, daher muss
187
                  ;ein möglicher Überlauf berücksichtigt werden
188
        
189
        ;Endergebnis steht jetzt in r28
190
191
        mov Schwellwertmiddle, r28  ;Kopiere den Schwellwert in definiertes Register
192
                      ;für diesen Wert
193
  rcall Wait1  
194
  pop r28    
195
    ;--------------------------------
196
197
sbi PORTB, 2 
198
rcall Wait3
199
cbi PORTB, 2
200
201
    ;Rechter Schwellwert-------------
202
   push r28 ;In diesem Register wird das Carry einer Addition geprüft, deswegen ist sicherung nötig
203
  clr r28  ;lösche registerinhalt in r28 zur neuen Anwendung
204
  rcall  StartADConChanel2_8bit
205
        in Messergebnisright, ADCH   ;Messe LDRleft bei schwarzem Untergrund
206
        add  r27, Messergebnisright  ;Addiere Weißen Wert mit Schwarzen Wert
207
        BRCC RechneWeiter2;Teste Carry Flag wegen Addition, wenn 1 dann war ein Überlauf und lade
208
        ;128 in ein Register weil nachher der Mittelwert gebildet wird und dafür 
209
        ;eine 9 Bit Zahl notwendig ist, dh: r27/2 + (Register mit Carry = 255/2)
210
        ;ergibt den richtigen Schwellwert
211
212
        ldi r28, 128  ;wenn Carry 1 dann lade 128 in carry-register
213
214
  RechneWeiter2:        ;wenn Carry 0 dann lasse carry-Register auf 0 (wenn Schwellwerte niedrig)
215
        mov r16, r27  ;Den Dividenten ins Register der Division kopieren
216
                ;Diese Register ist als Messergebnisleft definiert
217
                ;jedoch hats keine auswirkung, denn dies wird hier nicht verwendet
218
        ldi r17, 2    ;Den Divisor ins Register der Division laden
219
                ;Dieses Register ist Messergebnismiddle, dass tört aber keinen
220
                ;da hier nicht verwendet
221
        rcall Division
222
                ;Ergebnis steht jetzt in Register Ergebnis (r30)
223
224
        add r28, Ergebnis  ;Korrektur falls Carry 1 war, dies dinet dazu, falls der Schwellwert
225
                  ;bei verschiedenen Linienfarben unterschiedlich, kann es sein
226
                  ;dass es kleinere Spannungen auch geben kann, daher muss
227
                  ;ein möglicher Überlauf berücksichtigt werden
228
        
229
        ;Endergebnis steht jetzt in r28
230
231
        mov Schwellwertright, r28  ;Kopiere den Schwellwert in definiertes Register
232
                      ;für diesen Wert
233
  rcall Wait1  
234
  pop r28    
235
    ;--------------------------------
236
237
ret
238
;*************************************
239
;*************************************
240
241
242
;################################################################################
243
.include "Division8Bit+Rest.asm"   ;8 Bit division    //call division
244
.include "wait1.asm"
245
.include "wait3.asm"
246
.include "ReadEEPROM.asm"      ;        //call Read_EEPROM
247
.include "WriteEEPROM.asm"      ;        //call Write_EEPROM
248
.include "StartADConCHANEL0_8bit.asm"
249
.include "StartADConCHANEL1_8bit.asm"
250
.include "StartADConCHANEL2_8bit.asm"
251
;################################################################################

Problem ist jetzt: Portb, 1 ist immer 1 nach der Messung

von Andy11 (Gast)


Lesenswert?

sry fürs 2mal posten is mir unabsichtlich passiert

von Hannes L. (hannes)


Lesenswert?

Andy11 schrieb:
> sry fürs 2mal posten is mir unabsichtlich passiert

Ich habe (nach Lesen des Anhangs) den Eindruck, Du operierst hier an 
etwas herum, was Du nicht selbst ausgedacht hast und was Du auch nicht 
verstehst.

Ich traue mich zu behaupten, dass ich AVR-ASM halbwegs verstehe, mir 
gelingt es aber nicht, den Sinn Deines Programms bzw. Deiner Algorithmen 
zu erschließen. Gut, ich könnte mir mehr Mühe geben, Dein Programm zu 
analysieren. Aber einige Dinge sind dermaßen unsinnig, dass sich in mir 
etwas wehrt, weiterzumachen.

Wenn Dir einer helfen soll, dann wirf das Programm weg und beginne von 
vorn. Aber nicht gleich mit Programmcode, sondern erstmal mit dem 
Konzept, also mit einer klaren und eindeutigen Beschreibung der zu 
erledigenden Aufgaben in deutscher Sprache. Es muss ja nicht unbedingt 
ein genormter Programmablaufplan oder Struktogramm sein, aber man sollte 
die Gesamtaufgabe und die Aufteilung in einzelne Jobs (und deren 
Abhängigkeiten voneinander) klar und unmissverständlich erkennen können.

Es schadet auch nicht, im ersten Schritt eine Auflistung zu machen, 
welche verschiedenen Aufgaben das Programm erledigen soll/muss.

...

von spess53 (Gast)


Lesenswert?

Hi

>Wenn Dir einer helfen soll, dann wirf das Programm weg und beginne von
>vorn.

Dein Wort in Gottes Ohr.

MfG Spess

von Andy11 (Gast)


Lesenswert?

Hannes Lux schrieb:
> Ich habe (nach Lesen des Anhangs) den Eindruck, Du operierst hier an
> etwas herum, was Du nicht selbst ausgedacht hast und was Du auch nicht
> verstehst.

den Eindruck bekomme ich bei deinem Schreiben allerdings auch schon!!

>Ich traue mich zu behaupten, dass ich AVR-ASM halbwegs verstehe,
scheinbar tust du es nicht!


>Gut, ich könnte mir mehr Mühe geben, Dein Programm zu
>analysieren.

hättest du vielleicht zuerst machen müssen und dann posten

>Aber einige Dinge sind dermaßen unsinnig, dass sich in mir
>etwas wehrt, weiterzumachen.

argumente?!!?


>Wenn Dir einer helfen soll, dann wirf das Programm weg und beginne von
>vorn.
das habe ich mit dem vorigen schon gemacht: Das erkennt man auch daran 
das ich viel weniger code verbrauche und fast alle unterprogramme 
optimiert habe


>Aber nicht gleich mit Programmcode, sondern erstmal mit dem
>Konzept, also mit einer klaren und eindeutigen Beschreibung der zu
>erledigenden Aufgaben in deutscher Sprache.
Meiner MEinung nach ist das neue coding, das allerdings ich geschrieben 
habe, viel lesbarer als das ältere und mehr Kommentare passen erstens 
mal nicht rein und zweitens sind sie nicht notwendig.
Ich habe alles was spess gesagt hat gemacht ohne noch zu wissen, dass er 
es gesagt hat. Erst als ich es gepostet habe ist es mir aufgefallen.

>Es schadet auch nicht, im ersten Schritt eine Auflistung zu machen,
>welche verschiedenen Aufgaben das Programm erledigen soll/muss.
Wenn du meinst, dass ich das noch nicht gemacht habe, dann nehme ich das 
in Kenntniss

spess53 schrieb:
> Dein Wort in Gottes Ohr.
anscheinend hast du mein neues coding auch noch nicht wirklich 
durchgeschaut, daher die Bemerkung wahrscheinlich.

Ich erwarte mir jetzt sicher keine Antworten mehr, ich wollte lediglich 
manche Dinge klarstellen.

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.