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