PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : "komplexes" Programm läuft nicht



BlaueLed
28.04.2008, 22:15
Hi,

wenn ich folgendes Programm brenne, dann läuft das Programm nicht.



'### Controller Definition ###
$regfile = "m32def.dat"
$crystal = 16000000
$baud = 4800
$hwstack = 32
$swstack = 8
$framesize = 24

'### Dim Variablen ###
Dim Ein As Bit ' Startvariable
Dim I As Byte
Dim B As Byte 'Nachfolgende Dims sind für Temperatur
Dim W As Word
Dim Dg As Integer
Dim Min1 As Integer
Dim Min2 As Integer
Dim Max1 As Integer
Dim Max2 As Integer
Dim Dsid1(8) As Byte
Dim Sc(9) As Byte
Dim Temp_$ As String * 6
Dim Temp_$2 As String * 10
Dim Tempsend As String * 10
Dim Temp1mal As Bit
Dim Ttlwert As Bit ' TTL Variable 1 Bit
Dim Zaehlerirq0 As Long
Dim Impulseprosekunde As Long ' Variable für Drehzahl
Dim Zeitwert As Long
Dim Drehzahl As Long
Dim Drehzahlanzeige As Long
Dim Drehzahlsend As String * 3
Dim Drehzahlformat As String * 4
Dim Drehzahlformat1 As String * 4
Dim Backlight As Byte
Dim Zeitmessung As Word ' Ab hier Variablen für abstand
Dim Entfernung As Word
Dim Text As String * 10
Dim Entfernungneu As Word
Dim Entfernungsend As String * 3

'### Declare Subs ###
Declare Sub Init
Declare Sub Convallt
Declare Sub Tempmodul
Declare Function Decigrades(byval Sc(9) As Byte ) As Integer
Declare Sub Fullstand

'### Grafikroutine ###
$lib "glcdks108.lib"
Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Porta , Ce = 1 , Ce2 = 0 , Cd = 2 , Rd = 3 , Reset = 4 , Enable = 5
Cls

'### Portkonfiguration ###
Config Portb.0 = Output
Config Pinb.2 = Input
Config Portb.3 = Input
Config Portb.4 = Output
Ledpower Alias Portb.0
Resetbutton Alias Pinb.3
Lcdpower Alias Portb.4
Config 1wire = Portd.6

Ledpower = 1
'Ocr2 = 255


'### Interrupts ###
Config Int2 = Falling
Config Int0 = Change
Config Int1 = Rising
Enable Interrupts
Enable Int2
On Int2 Powerbutton
'Enable Int0
On Int0 Ttl
'Enable Int1
On Int1 Irq0

'### Timer ###
Config Timer0 = Timer , Prescale = 1024
Config Timer1 = Timer , Prescale = 256
Config Timer2 = Pwm , Compare Pwm = Clear Up , Pwm = On , Prescale = 8

On Timer1 Timer_irq
Const Timervorgabe = 3036

'### Boot ###
Ein = 0
Temp1mal = 0
Zeitwert = 0
Drehzahl = 0
Drehzahlanzeige = 0
Zaehlerirq0 = 0
Impulseprosekunde = 0



'Glcdcmd &H3E , 1 : Glcdcmd &H3E , 2 ' Display ausschalten

'### Start ###
Starting:
If Ein = 1 Then Goto Systemstart
Goto Starting

'### Main ###
Main:
Debounce Resetbutton , 0 , Resetmachen , Sub
If Ein = 0 Then Goto Systemend
Wait 1
Call Tempmodul
Wait 1
Call Fullstand
Goto Main

'### Powerbutton Int2 ###
Powerbutton:
Toggle Ledpower

Return

'### Include Dateien ###
$include "system.bas"
$include "kay.font"

Lcdmain:
$bgf "lcdmain.bgf"

Lcdsplash:
$bgf "splash.bgf"

Lcdreset:
$bgf "reset.bgf"

Ende:
$bgf "end.bgf"


hier die dazugehörige System.bas :



'### Systemstart ###
Systemstart:

Ledpower = 1
Waitms 500
Ledpower = 0
Waitms 500
Ledpower = 1
Waitms 500
Ledpower = 0
Waitms 500
Ledpower = 1
Waitms 500
Ledpower = 0
Waitms 500
Ledpower = 1

Drehzahlanzeige = 0
Lcdpower = 1
Portd.7 = 1


Waitms 100
Glcdcmd &H3F , 1 : Glcdcmd &H3F , 2 ' Display einschalten
Cls
Showpic 0 , 0 , Lcdsplash
For Backlight = 0 To 255
Ocr2 = Backlight
Waitms 25
Next Backlight
Showpic 0 , 0 , Lcdmain
Setfont Kay
Lcdat 2 , 11 , "'C"
Lcdat 2 , 41 , "mm"
Lcdat 2 , 72 , "Upm"
Lcdat 2 , 102 , "0/1"

'Lcdat 3 , 38 , "100"
Lcdat 3 , 73 , " 0"
'Lcdat 3 , 106 , "1"

Enable Timer1


Enable Int0
Enable Int1

Dsid1(1) = 1wsearchfirst()

If Pind.2 = 1 Then
Lcdat 3 , 106 , "1"
Ttlwert = 1
Else
If Pind.2 = 0 Then
Lcdat 3 , 106 , "0"
Ttlwert = 0
End If
End If

Goto Main

'### Systemend ###
Systemend:

Disable Int0
Disable Int1
Disable Timer1


Ein = 0
Temp1mal = 0
Zeitwert = 0
Drehzahl = 0
Drehzahlanzeige = 0
Zaehlerirq0 = 0
Impulseprosekunde = 0


Ledpower = 0
Waitms 500
Ledpower = 1
Waitms 500
Ledpower = 0
Waitms 500
Ledpower = 1
Waitms 500
Ledpower = 0
Waitms 500
Ledpower = 1
Waitms 500
Ledpower = 0

Showpic 0 , 0 , Ende

For Backlight = 255 To 0 Step -1
Ocr2 = Backlight
Waitms 15
Next Backlight
Cls
Glcdcmd &H3E , 1 : Glcdcmd &H3E , 2 ' Display ausschalten
Waitms 100
Lcdpower = 0
Portd.7 = 0

Goto 0

'--- Temperaturmodul --
Sub Tempmodul

Call Convallt ' "Convert ALL T on the 1w-bus"
Waitus 200 : Waitus 200 : Waitus 200 : Waitus 200 'if you use 2-wire, could be reduced to 200us

1wverify Dsid1(1) 'Issues the "Match ROM "
'Locate 1 , 1
'If Err = 1 Then
' Lcdat 3 , 4 , "Err " 'Err = 1 if something is wrong
'Elseif Err = 0 Then 'lcd " Sensor found"
1wwrite &HBE
Sc(1) = 1wread(9) 'read bytes into array
If Sc(9) = Crc8(sc(1) , 8) Then
Dg = Decigrades(sc(9))

Temp_$ = Str(dg)
Temp_$ = Format(temp_$ , "+#0.0")
Tempsend = Str(dg)
Tempsend = Format(tempsend , "+#00.0")
Temp_$2 = Temp_$ + " "

If Temp1mal = 0 Then
Lcdat 3 , 4 , "Check"
Temp1mal = 1
Else
If Temp1mal = 1 Then
Lcdat 3 , 4 , Temp_$2
End If
End If

End If


Waitms 500

End Sub

'--- Temperatur konvertieren ---
Sub Convallt
1wreset ' reset the bus
1wwrite &HCC ' skip rom
1wwrite &H44 ' Convert T

End Sub

'--- Funktion zum auslesen des Temperatursensors ---
Function Decigrades(byval Sc(9) As Byte)
Dim Tmp As Byte , T As Integer , T1 As Integer

Tmp = Sc(1) And 1 ' 0.1C precision
If Tmp = 1 Then Decr Sc(1)
T = Makeint(sc(1) , Sc(2))
'Print Hex(t)
'Print T

T = T * 50 'here we calculate the 1/10 precision like
T = T - 25 'DS18S20 data sheet
T1 = Sc(8) - Sc(7)
T1 = T1 * 100
T1 = T1 / Sc(8)
T = T + T1
Decigrades = T / 10


End Function

'--- TTL abfragen ---
Ttl:

If Pind.2 = 1 Then
Lcdat 3 , 106 , "1"
Ttlwert = 1
Else
If Pind.2 = 0 Then
Lcdat 3 , 106 , "0"
Ttlwert = 0
End If
End If

Return

'--- Irq für drehzahlsensor ---
Irq0:
Incr Zaehlerirq0
Incr Drehzahl
Return

'--- Timer irq für Drehzahlsensor ---
Timer_irq:
Timer1 = Timervorgabe
Impulseprosekunde = Zaehlerirq0
Zaehlerirq0 = 0
Incr Zeitwert


Drehzahlformat = Str(drehzahlanzeige)
Drehzahlsend = Format(drehzahlformat , "000")


'Lcdat 3 , 38 , Zeitwert

If Zeitwert = 10 Then Print Tempsend ; ";" ; Entfernungsend ; ";" ; Drehzahlsend ; ";" ; Ttlwert
If Zeitwert = 20 Then Print Tempsend ; ";" ; Entfernungsend ; ";" ; Drehzahlsend ; ";" ; Ttlwert
If Zeitwert = 30 Then Print Tempsend ; ";" ; Entfernungsend ; ";" ; Drehzahlsend ; ";" ; Ttlwert
If Zeitwert = 40 Then Print Tempsend ; ";" ; Entfernungsend ; ";" ; Drehzahlsend ; ";" ; Ttlwert
If Zeitwert = 50 Then Print Tempsend ; ";" ; Entfernungsend ; ";" ; Drehzahlsend ; ";" ; Ttlwert

If Zeitwert = 60 Then

Drehzahlanzeige = Drehzahl
Drehzahlformat = Str(drehzahlanzeige)
Drehzahlsend = Format(drehzahlformat , "000")

Print Tempsend ; ";" ; Entfernungsend ; ";" ; Drehzahlsend ; ";" ; Ttlwert



If Drehzahlanzeige < 9 Then
Drehzahlformat = " " + Drehzahlformat
Lcdat 3 , 73 , Drehzahlformat
End If

If Drehzahlanzeige > 9 And Drehzahlanzeige < 99 Then
Drehzahlformat = " " + Drehzahlformat
Lcdat 3 , 73 , Drehzahlformat
End If

If Drehzahlanzeige > 99 Then
Lcdat 3 , 73 , Drehzahlformat
End If

'Lcdat 3 , 72 , Drehzahlformat


Zeitwert = 0
Drehzahl = 0

End If
Return

'--- Resetmachen ---
Resetmachen:
Disable Timer1
Disable Int0
Disable Int1

Cls
Showpic 0 , 0 , Lcdreset
Setfont Kay
Wait 1
Lcdat 4 , 15 , "TemperatUr"
Waitms 500
Lcdat 4 , 80 , "OK"
Wait 1
Lcdat 5 , 15 , "Fullstand"
Waitms 500
Lcdat 5 , 80 , "OK"
Wait 1
Lcdat 6 , 15 , "Drehzahl"
Waitms 500
Lcdat 6 , 80 , "OK"
Wait 1
Lcdat 7 , 15 , "TTL"
Waitms 500
Lcdat 7 , 80 , "OK"
Wait 2

Zeitwert = 0
Drehzahl = 0
Drehzahlanzeige = 0
Zaehlerirq0 = 0
Impulseprosekunde = 0


Cls
Showpic 0 , 0 , Lcdmain

Lcdat 2 , 11 , "'C"
Lcdat 2 , 41 , "mm"
Lcdat 2 , 72 , "Upm"
Lcdat 2 , 102 , "0/1"
Lcdat 3 , 73 , " 0"
'Lcdat 3 , 37 , "0"

If Pind.2 = 1 Then
Lcdat 3 , 106 , "1"
Ttlwert = 1
Else
If Pind.2 = 0 Then
Lcdat 3 , 106 , "0"
Ttlwert = 0
End If
End If
Enable Timer1
Enable Int0
Enable Int1


Return

'--- Sub für Füllstand ---
Sub Fullstand

Portd.5 = 0
Pulseout Portd , 5 , 40
Pulsein Zeitmessung , Pind , 5 , 1
Zeitmessung = Zeitmessung * 10
Entfernung = Zeitmessung / 5.8
Entfernungneu = 181 - Entfernung

If Entfernungneu > 3000 Then
Entfernungneu = 0
End If

Text = Str(entfernungneu)
Entfernungsend = Format(text , "000")

If Entfernungneu < 9 Then
Text = " " + Text
Lcdat 3 , 37 , Text
End If

If Entfernungneu > 9 And Entfernungneu < 99 Then
Text = " " + Text + " "
Lcdat 3 , 37 , Text
End If

If Entfernungneu > 99 Then
Lcdat 3 , 37 , Text
End If


End Sub


Brenne ich aber ein kleines Programm, wie z.B. das hier dann läuft das kleine programm.




'### Controller Definition ###
$regfile = "m32def.dat"
$crystal = 16000000
$baud = 4800
$hwstack = 32
$swstack = 10
$framesize = 40

Config Int2 = Falling
On Int2 Blinken
Enable Int2
Enable Interrupts

'--- Ports ---
Config Portb.0 = Output


Do
nop
Loop


Blinken:
Toggle Portb.0
Return


Im großen Programm warte ich, bis Int2 auf 0 geht und dann kommt der Systemstart. Vor 2 Wochen hat noch alles geklappt und nun garnichts mehr. Ich bin am verzweifeln.

Sitze daran schon mehr als 6 Stunden und find den Fehler nicht. Wo liegt denn mein Fehler ? Wäre nett, wenn mir jemand helfen könnte. Danke

mfg Kay

for_ro
28.04.2008, 22:48
Korrigier mich, falls ich nicht alles gesehen habe.
Ich denke das Programm läuft so:

Die Variable Ein ist immer 0, also kommt er nie über die Befehle


Starting:
If Ein = 1 Then Goto Systemstart
Goto Starting

Höchstens durch einen Interrupt.
Von den externen ist nur INT2 enabled. Der springt nach


Powerbutton:
Toggle Ledpower
Return
INT1 und INT0 würden nur enabled, falls er nach main: kommen könnte, ich sehe aber nicht wie.
Die Timer sind nicht enabled, also tragen sie auch nicht zum Programm bei.
Wenn dein Programm mal läuft, musst du bestimmt die Stacks vergrößern.

Gruß

Rolf

BlaueLed
28.04.2008, 22:57
Hallo Rolf,

also an Int2 hängt ein Taster. Zum testen lasse ich den Int2 nach Powerbutton springen. Da soll er die Led Toggeln. Das macht er aber nicht. Drücke ich den Taster, passiert nichts. Ich habe nachgemessen und der Int2 geht auf 0 wenn ich drücke.

mfg Kay

for_ro
28.04.2008, 23:03
An PinB.2 hast du den pull-up nicht aktiv. Hast du extern einen dran?

BlaueLed
28.04.2008, 23:09
ja hängt an 5V. Was mich nur wundert ist folgendes:

lass ich den code im simulator laufen, bleibt der simulator bei Config lcd ... stehen. Ach ich dreh noch durch :-)

mfg Kay

for_ro
28.04.2008, 23:14
Für den Simulator gibst du besser

$sim ein.

Nachher aber dran denken, zu löschen.

BlaueLed
28.04.2008, 23:23
danke für den Tip. mit $sim gehts im simulator. aber es geht leider net in der "wirklichkeit"

mfg Kay

peterfido
29.04.2008, 19:20
Ich habe mir den Code jetzt nicht angesehen. Wenn vor 2 Wochen genau der selbe Code lief, dann ist evtl. etwas mit dem AVR. Hast Du auf einem Anderen getestet? Hast Du evtl den Watchdog mal genutzt, sodass er noch enabled ist?

Vitis
29.04.2008, 20:33
Deine Werte für Stack und Frame sind auch n bissl knapp