Forum: Mikrocontroller und Digitale Elektronik Reset bei UART Empfang in einer SUB


von Benjamin K. (benkly)


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.

von Niels K. (niels-k)


Lesenswert?

Bei mir kommen, da zwei Fehlermeldungen. Das erste ist der Chip, da muss 
das p weg. Das zweite ist der auskommentierte declare sub. In der 
Simulation ging es dann auch mit dem Interrupt gut.

von Benjamin K. (benkly)


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.

von Niels K. (niels-k)


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?

von Benjamin K. (benkly)


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.

von Niels K. (niels-k)


Angehängte Dateien:

Lesenswert?

Ich habe den geposteten Code mit meiner Bascomversion compiliert. Dort 
läuft es ja anscheinend. Ich habe den m644 verwendet.

Ziehe das HEX-File doch einfach auf Deinen Chip und überprüfe, ob es 
dann läuft.

von Benjamin K. (benkly)


Lesenswert?

Hi,

hab das schon mal probiert, habe ja auch den Mega644 hier rumliegen, mit 
dem gibt es das selbe Problem. Beide sind davon betroffen, der Mega644 
und der Mega644p. Aber sobald ich den Sub-Aufruf entferne -> alles ok.

Gruß, Benny.

von Benjamin K. (benkly)


Lesenswert?


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.