PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wer findet den Programmfehler? ..



Lenox
24.02.2007, 16:44
Hallo zusammen,
mein Projekt ist nun fast abgeschlossen.
Bis auf die Programmierung steht alles, aber wie es immer so ist, als Anfänger, gibt es immer irgentwo ein Problem.

Das folgende Programm funktionierte einwandfrei.
Jetzt wollte ich noch einen Interrupt einbauen, der dann per Subroutine einen RC5 Command emfängt, und dann eine Variable hochzählt!

Leider bekomm ich nichts per RS232 geschickt, und das Hauptprogramm wird auch nicht durchgearbeitet.

Der Interrupt für den RC5 Emfang benutzt Timer1, und die PWM für die RGBs Timer0.

Der TSOP ist auch an Int1 angeschlossen.



$regfile = "m16def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600

Waitms 50 'Einschwingzeit

'//////////Ports Konfigurieren\\\\\\\\\\
Config Porta = Output 'M1
Config Portc = Output 'M2
Config Rc5 = Pind.3 'TSOP
Portd.3 = 1
Config Portd.6 = Output 'RGB-Rot

Porta.4 = 1 'Enable1 active = low
Portc.4 = 1
Enable1 Alias Porta.4
Enable2 Alias Portc.4

Portd.6 = 1 'RGB Led ausschalten
Portc.7 = 1
Portc.6 = 1

'//////////Timer konfigurieren, Vorteiler auf 1\\\\\\\\\\
Config Timer0 = Timer , Prescale = 1

'//////////Definiere den Interrupthandler\\\\\\\\\\
On Ovf0 Tim0_isr
Config Int1 = Low Level 'IR

Enable Timer0 'Timer einschalten
Enable Interrupts
Enable Int1 'IR
On Int1 Ir_sub

Dim R1 As Byte ' In diese Variablen muss man
Dim G1 As Byte ' im Hauptprogram die gewünschten
Dim B1 As Byte ' Ausgabewerte laden

Dim Z As Word 'Zähler

Dim Ri1 As Byte ' Hilfsregister
Dim Gi1 As Byte
Dim Bi1 As Byte

'//////////Variablen für Hauptprogramm\\\\\\\\\\
Dim A As Byte 'Schleifenvariable RGBs

Z = 0

G1 = 0
R1 = 0
B1 = 0

Dim Addresse As Byte , Kommando As Byte 'RC5 Hilfsvariablen
Dim Flag As Bit

Flag = 1

Dim I As Byte 'Schleifenvariable Lauflicht
Dim Time As Integer

Dim Programm As Byte 'Programmauswahl
Programm = 0

'//////////Einstellungen\\\\\\\\\\
Time = 100 'Lauflicht Freilaufzeit

'//////////Hauptprogramm <Start>\\\\\\\\\\
Print "Starte Hauptprogramm"

Do

If Programm = 1 Then

'Rot
For A = 0 To 254
R1 = R1 + 1
Waitms 1
Next
Waitms 10
For A = 0 To 254
R1 = R1 - 1
Waitms 1
Next

'Grün
For A = 0 To 254
G1 = G1 + 1
Waitms 1
Next
Waitms 10
For A = 0 To 254
G1 = G1 - 1
Waitms 1
Next

'Blau
For A = 0 To 254
B1 = B1 + 1
Waitms 1
Next
Waitms 10
For A = 0 To 254
B1 = B1 - 1
Waitms 1
Next

'Blau/Grün
For A = 0 To 254
B1 = B1 + 1
G1 = G1 + 1
Waitms 1
Next
Waitms 10
For A = 0 To 254
B1 = B1 - 1
G1 = G1 - 1
Waitms 1
Next

'Blau/Rot
For A = 0 To 254
B1 = B1 + 1
R1 = R1 + 1
Waitms 1
Next
Waitms 10
For A = 0 To 254
B1 = B1 - 1
R1 = R1 - 1
Waitms 1
Next

'Grün/Rot
For A = 0 To 254
G1 = G1 + 1
R1 = R1 + 1
Waitms 1
Next
Waitms 10
For A = 0 To 254
G1 = G1 - 1
R1 = R1 - 1
Waitms 1
Next

'Grün/Rot/Blau
For A = 0 To 254
G1 = G1 + 1
R1 = R1 + 1
B1 = B1 + 1
Waitms 1
Next
Waitms 10
For A = 0 To 254
G1 = G1 - 1
R1 = R1 - 1
B1 = B1 - 1
Waitms 1
Next

End If

If Programm = 2 Then

For I = 0 To 15
Porta = I
Enable1 = 0
Waitms Time
Enable1 = 1
Next I

For I = 0 To 11
Portc = I
Enable2 = 0
Waitms Time
Enable2 = 1
Next I

End If

Loop

'//////////Hauptprogramm <Ende>\\\\\\\\\\


'//////////Interupthandler Timer0 <Start>\\\\\\\\\\
Tim0_isr:

If Z = 0 Then 'Gewünschte Ausgabewerte an
Ri1 = R1 'Hilfsregister übergeben
Gi1 = G1
Bi1 = B1
Z = 255
End If

Z = Z - 1

'PWM Kanäle

'RGB LEDs
If Ri1 > 0 Then
Portd.6 = 0
Else
Portd.6 = 1
End If
Ri1 = Ri1 - 1
If Ri1 = 255 Then Ri1 = 0

If Gi1 > 0 Then
Portc.7 = 0
Else
Portc.7 = 1
End If
Gi1 = Gi1 - 1
If Gi1 = 255 Then Gi1 = 0

If Bi1 > 0 Then
Portc.6 = 0
Else
Portc.6 = 1
End If
Bi1 = Bi1 - 1
If Bi1 = 255 Then Bi1 = 0

Return
'//////////Interupthandler Timer0 <Ende>\\\\\\\\\\

'//////////Interupthandler Timer1 <Start>\\\\\\\\\\
Ir_sub:

Getrc5(addresse , Kommando)
If Flag = 1 Then
Print "Fehlerhaftes Kommando"
Flag = 0
End If

If Addresse <> 255 Then
Reset Kommando.7 ' Togglebit zurücksetzen
Cls
Print "Addresse: " ; Addresse ; " Kommando: " ; Kommando
Flag = 1
Programm = Programm + 1 'Programm auswahl
End If

Return
'//////////Interupthandler Timer1 <Ende>\\\\\\\\\\

linux_80
24.02.2007, 17:34
Hallo,

wenn Du das Getrc5 in der Sub hast, blockiert Dir das solange den ganzen Programmablauf, bis etwas über den TSOP rein kommt !
Ausserdem wird für den RC5-Empfang der Timer0 verwendet, also wird das Deine Einstellung verwerfen.

magic33
24.02.2007, 19:41
hwstack ist doch 40 bei m16

und enable sind reservierte wörter die sollte man nicht benutzen enable1 alias

Lenox
24.02.2007, 21:34
Danke erstmal für die Antworten!
Sicher das Getrc5() das Programm an der Stelle anhält?
Wenn ja wie könnte ich das Problem lösen?

Das RC5 Timer0 benötigt wusste ich nicht, kann man das auch ändern?
Ansonsten mach ich halt die PWM über Timer1.

linux_80
25.02.2007, 00:06
Getrc5 bleibt nicht ewig stehen, wenns zulange dauert (ms) gibts 255 als Ergebnis, oder so die Richtung.

Du könntest im Hauptprogramm einmal pro durchlauf einen Getrc5 machen.

Man kann auch Timer2 verwenden, wenn man das bei Config Rc5 mit angibt.

Interrupts müssen immer aktiviert sein eim RC5 einlesen. (Ist bei Dir schon)
Deshalb geht das nicht von einer ISR aus, da dort die IRQs solange gesperrt sind, wie man sich in der ISR befindet.

Lenox
25.02.2007, 01:40
Im Hauptprogramm?
Das RGB Programm dauert bestimmt 30 sek so lang soll man doch nicht den Taster am Sender drücken.
Hmm aber das mit dem Low Level ist so oky, oder?

linux_80
25.02.2007, 02:09
Welchen Low Level ?
Von Int1, das geht so nicht, siehe letzter Post !
Die Sache mit dem Int1 kannst du weglassen, denn dadurch wird ja schon die erste Flanke des RC5-Signals abgeschnitten, die dann dem GetRC5 fehlt !

Wenn der Durchlauf solange dauert, kann man doch am Anfang oder Ende oder bei jedem Waitms 10 oder vor jeder If-Abfrage ein GetRC5 einbauen (und den Rest der Überprüfung), vorher wird das sowieso nicht mehr geprüft !

Und wie magic33 schon gemeint hat, den hwstack mal etwas grösser machen, die 32 sind das minimum, wenn man ISRs verwendet.

skg-rob
25.02.2007, 12:05
Ich würde mal sagen, der der am besten in dieser Programmiersprache zurechtkommt findet denn Fehler :lol:

Wäre vielleicht nicht schlecht, wenn du die Art der Programmiersprache in den
Titel schreiben würdest.

Lenox
25.02.2007, 13:03
Sorry, hatte ich vergessen ;)
war aber eig. auch mehr ironisch gemeint :lol:

Naja zurück zum Thema, die Methode mit Getrc5 immer in regelmäßigen Abstände zu prüfen gefällt mir nicht wirklich, so kann man nicht einfach mal schnell durchschalten.

Das muss doch über einen Interrupt lösbar sein, ohne die erste Flange zu verschlucken (wäre ja dann Falling, da er ja ohne Signal immer high am Ausgang ist, der TSOP)

Und den RC5 Emfang kann man doch mit Timer = 2 eifnach auf den 2. Timer legen, dass dürfte ja auch kein Problem sein.