mikrocontroller.net

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


Autor: Benjamin Klyeisen (benkly)
Datum:

Bewertung
0 lesenswert
nicht 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:
C-Code[c]
'#####################################################################################
'####################################Konfiguration####################################
'#####################################################################################

'###################
'Grundeinstellungen#
'###################
$regfile = "m644pdef.dat"                                   'Den verwendeten µC nennen
$crystal = 20000000                                         'Angeben mit welcher Frequenz der µC arbeitet
$hwstack = 256
$swstack = 256
$framesize = 256
$baud = 19200

'######################################
'IOs einstellen und Pullups aktivieren#
'######################################
Ddra = &B00000000                                           'IO Pins von PortA einstellen
Ddrb = &B01110000                                           'IO Pins von PortB einstellen
Ddrc = &B11111111                                           'IO Pins von PortC einstellen
Ddrd = &B11111000                                           'IO Pins von PortD einstellen
Porta = &B11111111                                          'Pullup Widerstände der Pins von PortA einstellen
Portb = &B10001111                                          'Pullup Widerstände der Pins von PortA einstellen
Portc = &B00000000                                          'Pullup Widerstände der Pins von PortA einstellen
Portd = &B00000111                                          'Pullup Widerstände der Pins von PortA einstellen

'###############################
'Hardwarekomponenten definieren#
'###############################

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

Config Timer2 = Pwm , Pwm = On , Prescale = 256 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down       'PWMs einstellen
Config Timer1 = Pwm , Pwm = 8 , Prescale = 256 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down       'PWMs einstellen
Pwm3 Alias Pwm2b                                            'PWM Kanal einer LED zuweisen
Pwm2 Alias Pwm1a                                            'PWM Kanal einer LED zuweisen
Pwm1 Alias Pwm1b                                            'PWM Kanal einer LED zuweisen
Pwm4 Alias Pwm2a
Pwm1 = 0
Pwm2 = 0
Pwm3 = 0
Pwm4 = 0

'##############################
'Interruptsroutinen definieren#
'##############################

On Urxc Rs232_in

'#####################
'Variablen einstellen#
'#####################

Dim Fn_var As Word
Dim Dmx_kanal As Word
Dim Dmx_wert As Byte
Dim Prog_12_kanal_werte(512) As Byte
Dim Rs232_pointer As Byte
Dim Rs232_data As Byte
Dim Rs232_wert As Byte
Dim Rs232_kanal As Word

'#######################
'Subroutinen definieren#
'#######################

'Declare Sub Dmx_transceive

'#####################
'Interrupts freigeben#
'#####################

Enable Urxc
Enable Interrupts


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


'#####################################################################################
'####################################Hauptprogramm####################################
'#####################################################################################

Do

Pwm1 = Prog_12_kanal_werte(1)
Pwm2 = Prog_12_kanal_werte(2)
Pwm3 = Prog_12_kanal_werte(3)
Pwm4 = Prog_12_kanal_werte(4)

'Dmx_transceive

Loop
End



'#####################################################################################
'##################################Interruptroutinen##################################
'#####################################################################################

Rs232_in:

Incr Rs232_pointer

Rs232_data = Udr0

If Rs232_pointer = 1 Then
   If Rs232_data = 255 Then
      Rs232_pointer = 0
   Else
      Rs232_kanal = Rs232_data
   End If
End If

If Rs232_pointer = 2 Then
   If Rs232_data = 255 Then
      Rs232_pointer = 0
   Else
      Rs232_kanal = Rs232_kanal + Rs232_data
   End If
End If

If Rs232_pointer = 3 Then
   If Rs232_data = 255 Then
      Rs232_pointer = 0
   Else
      Rs232_kanal = Rs232_kanal + Rs232_data
      If Rs232_kanal = 0 Then Rs232_pointer = 0
      If Rs232_kanal > 512 Then Rs232_pointer = 0
   End If
End If

If Rs232_pointer = 4 Then Rs232_wert = Rs232_data

If Rs232_pointer = 5 Then
   If Rs232_data = 255 Then
      Prog_12_kanal_werte(rs232_kanal) = Rs232_wert
      Rs232_pointer = 0
   End If
End If

If Rs232_pointer = 6 Then Rs232_pointer = 0

Return


'#####################################################################################
'#####################################Subroutinen#####################################
'#####################################################################################


Sub Dmx_transceive:
NOP
End Sub
[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.

Autor: Niels Keller (niels-k)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Benjamin Klyeisen (benkly)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Niels Keller (niels-k)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Benjamin Klyeisen (benkly)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Niels Keller (niels-k)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Benjamin Klyeisen (benkly)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Benjamin Klyeisen (benkly)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Fehler gefunden, siehe hier:

http://www.avrfreaks.net/index.php?name=PNphpBB2&f...

Gruß, Benny.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.