ATMega 8 Wert springt über

#4024023
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!
Gast #4024071
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!
Gast #4024081
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.
#4024092
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.
#4024103
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren