Reset bei UART Empfang in einer SUB

#1331444
Lesenswert?

Hallo,

ich habe ein Problem mit meinem Bascom Code. Und zwar möchte ich Daten 
vom PC empfangen und an die Hardware PWMs ausgeben. Das funktioniert 
soweit ganz gut. Aber sobald ich in der Mainloop eine Sub aufrufe, hängt 
sich der µC auf und macht nen Reset.
Dabei ist es egal ob in der Sub überhaupt was gemacht wird oder nicht.

Hier mal der Code:
1
C-Code[c]
2
'#####################################################################################
3
'####################################Konfiguration####################################
4
'#####################################################################################
5

6
'###################
7
'Grundeinstellungen#
8
'###################
9
$regfile = "m644pdef.dat"                                   'Den verwendeten µC nennen
10
$crystal = 20000000                                         'Angeben mit welcher Frequenz der µC arbeitet
11
$hwstack = 256
12
$swstack = 256
13
$framesize = 256
14
$baud = 19200
15

16
'######################################
17
'IOs einstellen und Pullups aktivieren#
18
'######################################
19
Ddra = &B00000000                                           'IO Pins von PortA einstellen
20
Ddrb = &B01110000                                           'IO Pins von PortB einstellen
21
Ddrc = &B11111111                                           'IO Pins von PortC einstellen
22
Ddrd = &B11111000                                           'IO Pins von PortD einstellen
23
Porta = &B11111111                                          'Pullup Widerstände der Pins von PortA einstellen
24
Portb = &B10001111                                          'Pullup Widerstände der Pins von PortA einstellen
25
Portc = &B00000000                                          'Pullup Widerstände der Pins von PortA einstellen
26
Portd = &B00000111                                          'Pullup Widerstände der Pins von PortA einstellen
27

28
'###############################
29
'Hardwarekomponenten definieren#
30
'###############################
31

32
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
33

34
Config Timer2 = Pwm , Pwm = On , Prescale = 256 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down       'PWMs einstellen
35
Config Timer1 = Pwm , Pwm = 8 , Prescale = 256 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down       'PWMs einstellen
36
Pwm3 Alias Pwm2b                                            'PWM Kanal einer LED zuweisen
37
Pwm2 Alias Pwm1a                                            'PWM Kanal einer LED zuweisen
38
Pwm1 Alias Pwm1b                                            'PWM Kanal einer LED zuweisen
39
Pwm4 Alias Pwm2a
40
Pwm1 = 0
41
Pwm2 = 0
42
Pwm3 = 0
43
Pwm4 = 0
44

45
'##############################
46
'Interruptsroutinen definieren#
47
'##############################
48

49
On Urxc Rs232_in
50

51
'#####################
52
'Variablen einstellen#
53
'#####################
54

55
Dim Fn_var As Word
56
Dim Dmx_kanal As Word
57
Dim Dmx_wert As Byte
58
Dim Prog_12_kanal_werte(512) As Byte
59
Dim Rs232_pointer As Byte
60
Dim Rs232_data As Byte
61
Dim Rs232_wert As Byte
62
Dim Rs232_kanal As Word
63

64
'#######################
65
'Subroutinen definieren#
66
'#######################
67

68
'Declare Sub Dmx_transceive
69

70
'#####################
71
'Interrupts freigeben#
72
'#####################
73

74
Enable Urxc
75
Enable Interrupts
76

77

78
Waitms 500                                               'um zu sehen wann und ob sich der µC resettet
79

80

81
'#####################################################################################
82
'####################################Hauptprogramm####################################
83
'#####################################################################################
84

85
Do
86

87
Pwm1 = Prog_12_kanal_werte(1)
88
Pwm2 = Prog_12_kanal_werte(2)
89
Pwm3 = Prog_12_kanal_werte(3)
90
Pwm4 = Prog_12_kanal_werte(4)
91

92
'Dmx_transceive
93

94
Loop
95
End
96

97

98

99
'#####################################################################################
100
'##################################Interruptroutinen##################################
101
'#####################################################################################
102

103
Rs232_in:
104

105
Incr Rs232_pointer
106

107
Rs232_data = Udr0
108

109
If Rs232_pointer = 1 Then
110
   If Rs232_data = 255 Then
111
      Rs232_pointer = 0
112
   Else
113
      Rs232_kanal = Rs232_data
114
   End If
115
End If
116

117
If Rs232_pointer = 2 Then
118
   If Rs232_data = 255 Then
119
      Rs232_pointer = 0
120
   Else
121
      Rs232_kanal = Rs232_kanal + Rs232_data
122
   End If
123
End If
124

125
If Rs232_pointer = 3 Then
126
   If Rs232_data = 255 Then
127
      Rs232_pointer = 0
128
   Else
129
      Rs232_kanal = Rs232_kanal + Rs232_data
130
      If Rs232_kanal = 0 Then Rs232_pointer = 0
131
      If Rs232_kanal > 512 Then Rs232_pointer = 0
132
   End If
133
End If
134

135
If Rs232_pointer = 4 Then Rs232_wert = Rs232_data
136

137
If Rs232_pointer = 5 Then
138
   If Rs232_data = 255 Then
139
      Prog_12_kanal_werte(rs232_kanal) = Rs232_wert
140
      Rs232_pointer = 0
141
   End If
142
End If
143

144
If Rs232_pointer = 6 Then Rs232_pointer = 0
145

146
Return
147

148

149
'#####################################################################################
150
'#####################################Subroutinen#####################################
151
'#####################################################################################
152

153

154
Sub Dmx_transceive:
155
NOP
156
End Sub
157
[c]C-Code

Dieser Code funktioniert, zumindest solange man die Sub in der Mainloop 
nicht aufruft. Kann sich das einer Erklären? Oder hat eventuell Tips für 
mich?
Ich hab den Sub-Aufruf auch schon mit Call und Gosub versucht, brachte 
alles nix.

Wäre über jeden Tipp dankbar!

Gruß, Benny.
#1331487
Lesenswert?

Hi,

ok, das mit dem Declare ist klar. Ist in meinem Testcode auch richtig, 
habe es nur vergessen hier im Forum auszuklammern.

Aber das mit dem "P" im Chip müsste passen. Warum soll das falsch sein? 
Ich benutze ja auch einen ATMEGA644P. Der mit dem "P" hat nämlich 2 
UARTs und die 2. brauche ich dann später für den DMX-Transceiver.

Ich habs aber trotzdem mal ohne das "P" versucht, geht auch nicht.

Gruß, Benny.
#1331573
Lesenswert?

Benjamin Klyeisen schrieb:

> Ich habs aber trotzdem mal ohne das "P" versucht, geht auch nicht.


Ja klar. Ich habe für den nur keine Lib. Daher hatte ich es mit einem 
m644 versucht. Finde ich aber trotzdem seltsam. In der Simulation ging 
alles fehlerfrei ohne Reset von sich. Ich verwende Bascom in Version 
1.11.9.2 und habe die SUB auch dekommentiert. Wie läuft die Simulation?
#1331793
Lesenswert?

Hi,

die Simulation habe ich noch nicht getestet. Aber wenn die bei Dir 
durchläuft dann wäre das wieder ein Fehlerfall der in der Simulation 
nicht auffällt.

Sub-Aufruf entfernt -> läuft. Sub-Aufruf vorhanden -> Reset. Keine 
Ahnung was das sein kann. Aso, wenn der Sub-Aufruf vorhanden ist, gibts 
erst nen Reset wenn serielle Daten kommen, vorher nicht.

Gruß, Benny.

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