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.
Ich hoffe Ihr könnt da jetzt besser was rauslesen?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
Und bezüglich Overlays, das verwende ich aktuell nicht in meinem Code.
Viele Grüße







Zitieren

Lesezeichen