Forum: Mikrocontroller und Digitale Elektronik Bascom code probleme


von Bastelui (Gast)


Lesenswert?

Hallo!

Ich Arbeite mir einem ATmega8. Dieser soll 2 Motoren mit PWM ansteuern. 
Dabei soll die Drehzahl mit Lichtschranken erfasst werden, mit einem 
Sollwert verglichen Werden und dementsprechen dann auch Nachgeregelt 
werden.

Für einen Motor habe ich das Bascom-Programm soweit fertig. Allerdings 
scheint es so, als ob sich der µC beim jedem Start den Stack voll 
schreibt und sich selbst resettet. Warum das so ist, habe ich noch nicht 
raus. Vielleicht kann sich ja mal jemand erbarmen und meinen Code 
anschauen?

Hier ist ersteinmal das, was ich im Terminal zu sehen bekomme:
1
The System is online!
2
Sollwerta = 500
3
Nor/Err Pwm1a#Istwert
4
E0#0
5
Th\<\n>E#<\n>Sollwerta = 500
6
E2#0
7
E3#0
8
Nor/Err Pwm1a#IstwertE4#0
9
10
E5#0
11
E6#0
12
E7#0
13
E8#0
14
E9#0

Der Wert hinter dem E erhöt sich dann noch weiter

Und hier ist mein Code:
1
$regfile = "m8def.dat"
2
$crystal = 8000000
3
$baud = 4800
4
5
Dim Istwerta As Word : Istwerta = 0
6
'Dim Istwertb As Word : Istwertb = 0
7
Dim Sollwerta As Word : Sollwerta = 500
8
'Dim Sollwertb As Word : Sollwertb = 0
9
Dim Gueltig As Bit : Gueltig = 0
10
'Dim Gueltigb as Bit : Gueltigb = 0
11
12
On Int0 Sensora
13
On Int1 Sensorb
14
On Ovf0 Ovf0a
15
On Ovf2 Ovf2b
16
17
Config Int0 = Rising
18
Config Int1 = Rising
19
Config Portb = Output
20
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1
21
Config Timer0 = Timer , Prescale = 1024
22
Config Timer2 = Timer , Prescale = 64
23
Config Com1 = Dummy , Synchrone = 0 , Parity = Disabled , Stopbits = 1 , Databits = 8 , Clockpol = 1
24
'Config Serialout = Buffered , Size = 100
25
'Config Serialin = Buffered , Size = 50
26
27
28
29
30
Enable Interrupts
31
32
33
Print "The System is online!"
34
Waitms 300
35
Print "Sollwerta = " ; Sollwerta
36
waitms 300
37
Print "Nor/Err Pwm1a#Istwert"
38
Waitms 300
39
40
Enable Int0
41
'Enable Int1
42
Enable Ovf0
43
'Enable Ovf2
44
45
Do
46
47
Loop
48
49
50
Sensora:
51
      Disable Int0
52
      Disable Int1
53
      Disable Ovf1
54
      Disable Ovf2
55
      If Gueltig = 1 Then
56
        Istwerta = Istwerta + Timer0
57
        If Istwerta < Sollwerta Then
58
           Incr Pwm1a
59
        End If
60
61
        If Istwerta > Sollwerta Then
62
           Decr Pwm1a
63
        End If
64
65
        Print "N" ; Pwm1a ; ; "#" ; Istwerta
66
      Else
67
         Set Gueltig
68
      End If
69
70
      Istwerta = 0
71
      Timer0 = 0
72
      Enable Int0
73
      'Enable Int1
74
      Enable Ovf0
75
      'Enable Ovf2
76
Return
77
78
79
80
Ovf0a:
81
   Disable Int0
82
   Disable Int1
83
   Disable Ovf1
84
   Disable Ovf2
85
   Istwerta = Istwerta + 255
86
   If Istwerta > 1020 Then
87
      Istwerta = 0
88
      Reset Gueltig
89
      Print "E" ; Pwm1a ; "#" ; Istwerta
90
      Incr Pwm1a
91
   End If
92
   Enable Int0
93
   'Enable Int1
94
   Enable Ovf0
95
   'Enable Ovf2
96
Return
97
98
Ovf2b:
99
Return
100
101
Sensorb:
102
Return
103
End                                                         'end program

Vielen Dank für jede Hilfe im vorraus!

Lui

von Karl H. (kbuchegg)


Lesenswert?

Was du da mit deinen Istwert Variablen veranstaltest, ist für mich so 
ziemlich undurchschaubar

Hier
        Istwerta = Istwerta + Timer0
erhöhst du ihn mit dem Timer Wert (wozu auch immer das gut sein soll)
Dann
       If Istwerta < Sollwerta Then
           Incr Pwm1a
        End If

        If Istwerta > Sollwerta Then
wird er abgefragt
um gleich darauf
      Istwerta = 0
wieder auf 0 gesetzt zu werden.

Ich würde mal sagen, dein Istwert wird die meiste Zeit 0 (oder +Timer0) 
sein, damit kleiner als der Sollwert und damit wird Pwm1a erhöht.

Räum den Code erst mal auf.
Überleg dir wie die Zusammenhänge sind
und hör auf, aufs Gratewohl Unmengen von Code reinzuhacken. Das geht 
nämlich meistens schief.

von Pascal H. (pase-h)


Lesenswert?

Korrigiert mich bitte, fals ich falsch liege:
Bei dir heißt es hier:
> Th\<\n>E#<\n>Sollwerta = 500
was ja bedeuten soll, dass der PWM-Sollwert 500 ist.
Doch wenn ich jetzt nicht falsch liege, dann definierst du ja mit PWM = 
8 eine 8bit PWM - Also max. 255.
> Config Timer1 = Pwm , Pwm = 8 ...
Wenn du jetzt schreibst : "Pwm = 10" dann müsste die Pwm als 10bit
(max. 1023) konfiguriert sein.
Probiers mal aus!

Mfg Pase

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.