Hi nochmals vielen Dank für die super Erklärungen!
Also das mit dem extrem hohen Frame hat mich auch sehr verwundert. Ich habe auch meinen Denkfehler dabei gefunden. Wenn man die Lib "stackchek" von Bascom verwendet bekommt man nicht den belegten Frame angezeigt, sondern den Speicher der noch frei ist!!!!!
Ich habe inzwischen die Stack-Werte wieder auf ein normales Level heruntergeschraubt.
Und ich habe endlich die Zeit gefunden und mein Programm nochmal vernünftig auf das wesentliche mit allen Deklarationen zu reduzieren.
Code:
$regfile = "M1284pdef.dat"
' In den Fusebits wurde der externe Oszillator für 18,432MHz ausgewählt
$crystal = 18432000
$hwstack = 100 ' Standard 42
$swstack = 100 ' Standard 40
$framesize = 200 ' Standard 40
Const _my_framesize = 200
$lib "stackcheck.lib"
$hwcheck ' hw stack check ein
$framecheck ' frame check ein
$softcheck ' sw stack check ein
' Baudrate für den ersten seriellen Port
$baud = 9600
' Baudrate für den zweitern seriellen Port
$baud1 = 9600
' Analog Comparator ausschalten ACSR.ACD = 1
Stop Ac
' Watchdog ausschalten
Stop Watchdog
' Echo aus
Echo Off
' Interrupts global zulassen
Enable Interrupts
' KONFIGURATION
' Com1 auf 8 Bit Modus konfigurieren
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
' Com2 auf 8 Bit Modus konfigurieren
Config Com2 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
' Öffnen der ersten Com-Schnittstelle
Open "COM1:" For Binary As #1
' Öffnen der zweiten Com-Schnittstelle
Open "COM2:" For Binary As #2
' Empfangspuffer UART
Config Serialin = Buffered , Size = 100
' Sendepuffer UART
Config Serialout = Buffered , Size = 100
' Empfangspuffer UART1
Config Serialin1 = Buffered , Size = 100
' Sendepuffer UART1
Config Serialout1 = Buffered , Size = 100
Const Adc_multi = 0.0025 ' = 2,56V / 1024bit
Config Adc = Single , Prescaler = Auto , Reference = Internal_2.56 ' Es wird die interne Referenzspannung von 2,56V ausgewählt
Start Adc
' TIMER KONFIGURIEREN
'Const Timsk = Timsk0
Config Timer0 = Timer , Prescale = 1024 ' Timer konfigurieren
On Timer0 Timerroutine0 ' Timerinterrupt Subroutine zuweisen
Enable Timer0 ' Timer aktivieren
Stop Timer0 ' Timer stoppen
Config Timer1 = Timer , Prescale = 1024 ' Timer konfigurieren
On Timer1 Timerroutine1 ' Timerinterrupt Subroutine zuweisen
Enable Timer1 ' Timer aktivieren
Stop Timer1 ' Timer stoppen
Config Timer2 = Timer , Prescale = 1024 ' Timer konfigurieren
On Timer2 Timerroutine2 ' Timerinterrupt Subroutine zuweisen
Enable Timer2 ' Timer aktivieren
Stop Timer2 ' Timer stoppen
Config Timer3 = Timer , Prescale = 1024 ' Timer konfigurieren
On Timer3 Timerroutine3 ' Timerinterrupt Subroutine zuweisen
Enable Timer3 ' Timer aktivieren
Stop Timer3 ' Timer stoppen
' SUB'S DEKLARIEREN
Declare Sub Zykluszeitmessung
Declare Sub R_bus_kommunikation
Declare Sub Timerueberlauf0
Declare Sub Timerueberlauf1
Declare Sub Timerueberlauf2
Declare Sub Timerueberlauf3
Declare Sub Stackbelegungmessung
' VARIABLENDEKLARATION
' Schleifenzähler
Dim I As Byte
Dim I1 As Byte
Dim I2 As Byte
Dim Kartenadresse As Byte
Dim Pruef_kartenadresse As Byte
Dim Anzahl_karten As Integer
Anzahl_karten = 2
Dim Aktuelle_karte As Integer
Aktuelle_karte = 1
' Teilnehmer/Karten Speicherbereiche
Dim R_bus_empfangsarray(5) As Byte
Dim R_bus_sendearray(5) As Byte
Dim R_bus_empfangene_zieladresse As Byte
Dim R_bus_empfangene_quelladresse As Byte
Dim R_bus_status As Byte
Dim R_bus_schritt As Byte
R_bus_schritt = 1
Dim R_bus_fehlertyp As Integer
Dim R_bus_diagnosemodus As Bit
Dim R_bus_gesperrt As Bit
Dim R_bus_kein_teilnehmer As Bit
Dim R_bus_fehler As Bit
Dim R_bus_karten_fehler As Bit
Dim R_bus_konfig_fehler As Bit
Dim R_bus_konfig_fehler_position As Integer
Dim Err_falscher_teilnehmer As Bit
Dim Err_fehlende_antwort As Bit
Dim Err_falsche_protokolllaenge As Bit
Dim Err_falscher_telegrammkopf As Bit
Dim Err_falsche_checksumme As Bit
' Timer Reloadwerte festlegen (für 16Bit Timer1 u. 3 mit Prescaler 1024 bei 18,432MHz)
Dim Reload_1s As Word
Reload_1s = 47536
Dim Reload_500ms As Word
Reload_500ms = 56536
Dim Reload_250ms As Word
Reload_250ms = 61036
Dim Reload_150ms As Word
Reload_150ms = 62836
' Zykluszeit Messung
'Const Zeitmessung_divident = 18000 ' 18432000 MHz / 1024 Prescaler
'Dim Zeitmessung_zeit As Single
Dim Zeitmessung_timer_ueberlauf As Bit
Dim Zeitmessung_reloadwert As Word
Dim Zeitmessung_ticks_start As Integer
Dim Zeitmessung_ticks_ende As Integer
Dim Zeitmessung_letzter_ueberlauf As Bit
Dim Zeitmessung_vergangene_ticks As Integer
Dim Zeitmessung_aktiv As Bit
' Timerflags
Dim Timerflag0 As Bit
Dim Timerstatus0 As Bit
Dim Timerflag1 As Bit
Dim Timerstatus1 As Bit
Dim Timerflag2 As Bit
Dim Timerstatus2 As Bit
Dim Timerflag3 As Bit
Dim Timerstatus3 As Bit
' Stackbelegung Messung
Dim Hwstack_belegung As Word
Dim Swstack_belegung As Word
Dim Frame_belegung As Word
' Zu beginn S-Bus / R-Bus Eingangs- / Ausgangspuffer leeren
Clear Serialin
Clear Serialout
Clear Serialin1
Clear Serialout1
' HAUPTSCHLEIFE
Do
' R-BUS KOMMUNIKATION
Call R_bus_kommunikation
' ZYKLUSZEIT MESSEN
Call Zykluszeitmessung
'STACKBELEGUNG MESSEN
Call Stackbelegungmessung
' TIMER0
If Timerflag0 = 1 Then
Timerflag0 = 0
' Call Timerueberlauf0
End If
' TIMER1
If Timerflag1 = 1 Then
Timerflag1 = 0
' Call Timerueberlauf1
End If
' TIMER2
If Timerflag2 = 1 Then
Timerflag2 = 0
' Call Timerueberlauf2
End If
' TIMER3
If Timerflag3 = 1 Then
Timerflag3 = 0
' Call Timerueberlauf3
End If
Loop
' R-BUS KOMMUNIKATION
Sub R_bus_kommunikation
' RINGABFRAGE DER TEILNEHMER
Select Case R_bus_schritt
Case 1: ' KARTE ANSPRECHEN
' Eingangs- / Ausgangspuffer löschen
Clear Serialin1
Clear Serialout1
' Timer zurücksetzen bzw. auf neuen Startwert einstellen (1s)
Timer1 = Reload_1s
Timerflag1 = 0
Timerstatus1 = 1
' Watchdogtimer starten
Start Timer1
' Sendedaten und Kartenadresse zuordnen
Select Case Aktuelle_karte
Case 1 :
Kartenadresse = 255
R_bus_sendearray(3) = 10
R_bus_sendearray(4) = 20
Case 2 :
Kartenadresse = 254
R_bus_sendearray(3) = 11
R_bus_sendearray(4) = 21
End Select
R_bus_sendearray(1) = Kartenadresse
R_bus_sendearray(2) = 0
R_bus_sendearray(5) = Crc8(r_bus_sendearray(1) , 4)
Pruef_kartenadresse = Kartenadresse
R_bus_empfangene_zieladresse = 0
R_bus_empfangene_quelladresse = 0
Waitus 500
' Telegramm an Teilnehmer senden
Printbin #2 , R_bus_sendearray(1) , 5 ;
' In Schritt 2 schalten
R_bus_schritt = 2
Case 2: ' AUF RÜCKMELDUNG DER KARTE WARTEN
' Daten im Empfangspuffer
If _rs_bufcountr1 > 0 Then
Err_fehlende_antwort = 0
' Telegramm vollständig empfangen
If _rs_bufcountr1 >= 5 Then
Err_falsche_protokolllaenge = 0
' Telegramm einlesen
Inputbin #2 , R_bus_empfangsarray(1) , 5
R_bus_empfangene_zieladresse = R_bus_empfangsarray(1)
R_bus_empfangene_quelladresse = R_bus_empfangsarray(2)
' Zieladresse einlesen und mit eigener Adresse vergleichen
If R_bus_empfangene_zieladresse = 0 Then
Err_falscher_telegrammkopf = 0
' HIER PASSIERT DER FEHLER!!!!!!!!!!!!!!
' Quelladresse mit erwarteter vergleichen
If R_bus_empfangene_quelladresse = Pruef_kartenadresse Then
Err_falscher_teilnehmer = 0
' Empfangene Checksumme mit errechneter vergleichen
If R_bus_empfangsarray(5) = Crc8(r_bus_empfangsarray(1) , 4) Then
Err_falsche_checksumme = 0
' Aktuellen Teilnehmer um eins erhöhen
Incr Aktuelle_karte
' Alle Teilnehmer durchgelaufen, wieder von vorne beginnen
If Aktuelle_karte > Anzahl_karten Then
Aktuelle_karte = 1
End If
' WatchdogTimer zurücksetzen bzw. auf neuen Startwert einstellen (1s)
Timer1 = Reload_1s
Timerflag1 = 0
' Zurück zu Schritt 1
R_bus_schritt = 1
Else
' R-bus-fehler
' Timer1 stoppen
Stop Timer1
Timerflag1 = 0
Timerstatus1 = 0
' Zur Fehlerüberprüfung springen
R_bus_schritt = 3
Err_falsche_checksumme = 1
End If
Else
' R-bus-fehler
' Timer1 stoppen
Stop Timer1
Timerflag1 = 0
Timerstatus1 = 0
' Zur Fehlerüberprüfung springen
R_bus_schritt = 3
Err_falscher_teilnehmer = 1
End If
Else
Err_falscher_telegrammkopf = 1
End If
Else
Err_falsche_protokolllaenge = 1
End If
Else
Err_fehlende_antwort = 1
End If
Case 3: ' WATCHDOG / FEHLERÜBERPRÜFUNG WARTEZEIT
End Select
End Sub
' ZYKLUSZEITMESSUNG
Sub Zykluszeitmessung
If Zeitmessung_aktiv = 1 Then
' Timer Ticks ende
Zeitmessung_ticks_ende = Timer3
' Letzten abgeschlossenen Messzyklus auswerten
' gab es seit dem beginn der Zeitmessung einen Timerüberlauf
Zeitmessung_letzter_ueberlauf = Zeitmessung_timer_ueberlauf
If Zeitmessung_letzter_ueberlauf = 0 Then
Zeitmessung_vergangene_ticks = Zeitmessung_ticks_ende - Zeitmessung_ticks_start
Else
' Start bis Überlauf
Zeitmessung_ticks_start = 65536 - Zeitmessung_ticks_start
' Überlauf bis Ende
Zeitmessung_ticks_ende = Zeitmessung_ticks_ende - Zeitmessung_reloadwert
' Summe der Ticks
Zeitmessung_vergangene_ticks = Zeitmessung_ticks_start + Zeitmessung_ticks_ende
End If
' Zeit berechnen
'Zeitmessung_zeit = Zeitmessung_timerticks / Zeitmessung_divident
End If
' Neue Zeitmessung beginnen
' Timer Ticks start
Zeitmessung_ticks_start = Timer3
Zeitmessung_timer_ueberlauf = 0
Zeitmessung_aktiv = 1
End Sub
' STACKBELEGUNG MESSUNG
Sub Stackbelegungmessung
Hwstack_belegung = _hwstackstart - _hw_lowest
Swstack_belegung = _hwstack_low - _sw_lowest
If _fw_highest > 0 Then
Frame_belegung = _frame_high - _fw_highest
' Korrektur bei der Berechnung des belegten Platzes
Frame_belegung = _my_framesize - Frame_belegung ' ohne Korrektur wird verbleibender Platz angezeigt...
End If
End Sub
Timerroutine0:
Timerflag0 = 1
Return
Timerroutine1:
Timerflag1 = 1
Return
Timerroutine2:
Timerflag2 = 1
Return
Timerroutine3:
Timerflag3 = 1
Return
' UART1 schließen
Close #1
' UART2 schließen
Close #2
End
Ich hoffe Ihr könnt da jetzt besser was rauslesen?
Und bezüglich Overlays, das verwende ich aktuell nicht in meinem Code.
Viele Grüße
Lesezeichen