Forum: Mikrocontroller und Digitale Elektronik ATMega 8 Wert springt über


von Simon R. (simon_r44)


Lesenswert?

Hallo,

ich bin gerade dabei beim Bau einer PWM Schaltung mit ATMega 8 als 
Steurung. Das Programm sieht so aus.

1
$regfile "m8adef.dat"
2
$crystal = 1000000
3
4
Config Portb.1 = Output
5
6
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1
7
8
Compare1a = 1
9
10
Config Portd.0 = Input
11
Config Portd.1 = Input
12
13
Do
14
15
If Pind.0 = 0 Then
16
      Compare1a = Compare1a + 1
17
      If Compare1a > 255 Then Compare1a = 255
18
      Waitms 200
19
   End If
20
   If Pind.1 = 0 Then
21
      Compare1a = Compare1a - 1
22
      If Compare1a < 1 Then Compare1a = 1
23
      Waitms 200
24
   End If
25
26
Loop

Das Problem ist, das wenn ich an Portd.0 ein Dauerhaftes Signal habe, 
und der Wert 255 ereicht hat, das er wieder bei 1 anfängt.

Umgekehrt wenn ich zurück gehe und ich bei 1 angelange, bleibt er dann 
auch bei eins und wechselt nicht wieder zu 255.

Nun, suche ich den passenden Befehl, dass wenn Compare1a über 255 
ist, das es nicht weiter geht.

Danke für Antworten!

von Peter II (Gast)


Lesenswert?

geht so nicht.

Compare1a = Compare1a + 1
If Compare1a > 255 Then Compare1a = 255

255+1 ist nunmal 0, damit ist klar das das If nichts mehr machen kann.


if Compare1a < 255 Then  Compare1a + 1

von Simon R. (simon_r44)


Lesenswert?

Peter II schrieb:
> if Compare1a < 255 Then  Compare1a + 1

Ja, aber so geht das ja auch nicht.

Ich habs jetzt so gelöst:
1
If Pind.0 = 0 Then
2
      Compare1a = Compare1a + 1
3
      If Compare1a > 255 Then Compare1a = 0
4
      If Compare1a = 0 Then Compare1a = 255
5
      Waitms 200
6
   End If

von Peter II (Gast)


Lesenswert?

Simon R. schrieb:
> Peter II schrieb:
>> if Compare1a < 255 Then  Compare1a + 1
>
> Ja, aber so geht das ja auch nicht.

das ist aber nicht logisch.

von Chris L. (kingkernel)


Lesenswert?

Das klappt so nicht. Compare1a kann NIEMALS > 255 sein!! 255 ist sein 
größtmöglicher Wert, also kannst du die if-Bedingen auf > 255 auch 
gleich weg lassen.

von Floppy (Gast)


Lesenswert?

Simon R. schrieb:

> Ich habs jetzt so gelöst:
> If Pind.0 = 0 Then
>       Compare1a = Compare1a + 1
>       If Compare1a > 255 Then Compare1a = 0
>       If Compare1a = 0 Then Compare1a = 255
>       Waitms 200
>    End If

Geht nicht!

Sobald der Wert 255 erreicht ist schluss! 256 ist 0 also macht if > 255 
kein sinn! Zudem wenn 1a auf 0 gesetzt wird, so kommt

>       If Compare1a = 0 Then Compare1a = 255

und setzt es wieder auf 255!

von Peter II (Gast)


Lesenswert?

Floppy schrieb:
> und setzt es wieder auf 255!

das will er ja

von MWS (Gast)


Lesenswert?

Peter II schrieb:
> 255+1 ist nunmal 0, damit ist klar das das If nichts mehr machen kann.

Das Compare-Register des Timer1 ist ein 16Bit-Register.

Simon R. schrieb:
> Ich habs jetzt so gelöst:
> If Pind.0 = 0 Then
>       Compare1a = Compare1a + 1
>       If Compare1a > 255 Then Compare1a = 0
>       If Compare1a = 0 Then Compare1a = 255
>       Waitms 200
>    End If

Das ist Krampf, der Wurm ist woanders. Prinzipiell war Peter II's 
Beispiel richtig, bis auf die falsche Syntax.
Man prüft also vorher und erhöht nur, wenn man mit der Erhöhung 
innerhalb des zulässigen Bereichs liegt.

von Chris L. (kingkernel)


Lesenswert?

Bedeutet aber das der wert immer 255 bleiben wird. die Funktion wird 
einmla hochzählen und dann nie wieder was machen.
Was genau mächte der TO denn haben, dann kann man ihm vielleicht ein 
paar tipps geben als hier an baustellen zu arbeiten, die schon einen 
denkfehler an sich birgen

von Simon R. (simon_r44)


Lesenswert?

Peter II schrieb:
> Floppy schrieb:
>> und setzt es wieder auf 255!
>
> das will er ja

Ja, das will ich. Wenn ich über den Wert kommme oder bei 255 soll 
Schluss sein. Und dann soll es nur noch zurück gehen 255=>254.. 0 und 
nicht 255=>0

MWS schrieb:
> Das ist Krampf, der Wurm ist woanders. Prinzipiell war Peter II's
> Beispiel richtig, bis auf die falsche Syntax.
> Man prüft also vorher und erhöht nur, wenn man mit der Erhöhung
> innerhalb des zulässigen Bereichs liegt.

Natürlich ist es ein Krampf, ich bekomme es aber nicht anders hin.

von Chris L. (kingkernel)


Lesenswert?

Spontan hätte ich jetzt so gesagt
1
If Pind.0 = 0 Then
2
  If Compare1a < 255 Then Compare1a = Compare1a + 1
3
  Waitms 200
4
End If
5
If Pind.1 = 0 Then
6
  If Compare1a > 0 Then Compare1a = Compare1a - 1
7
  Waitms 200
8
End If

von MWS (Gast)


Lesenswert?

Simon R. schrieb:
> Natürlich ist es ein Krampf, ich bekomme es aber nicht anders hin.
1
If Compare1a < 255 Then Incr Compare1a

von Simon R. (simon_r44)


Lesenswert?

Chris L. schrieb:
> Spontan hätte ich jetzt so gesagt
>
> [code]
> If Pind.0 = 0 Then
>   If Compare1a < 255 Then Compare1a = Compare1a + 1
>   Waitms 200
> End If
> If Pind.1 = 0 Then
>   If Compare1a > 0 Then Compare1a = Compare1a - 1
>   Waitms 200
> End If
> [/code}

Danke! So funktioniert es auch und ich komme mit Pind.1 auch auf 
Comapre1a = 0

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.