PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : GETRC5 über Int1 ???



spatz2222
01.11.2005, 18:52
hallo

ich muß das GetRC5 über einen Interrupt auslösen - da ein polling mit GETRC5 zu lange dauert ...
dafür habe ich folgendes programm genommen :


$crystal = 10000000
$regfile = "m8def.dat"
$baud = 19200



Config Pinc.0 = Output ' IR Sensor sitzt mit GND an Pinc.0
Reset Portc.0 ' und mit +5V an Pinc.1
Config Pinc.1 = Output ' und mit Sign. an Pinc.2
Set Portc.1


Config Pind.4 = Output ' kontroll LED
Config Pind.5 = Output 'kontroll led

Gruen Alias Portd.4
Rot Alias Portd.5


Config Rc5 = Pinc.2

Config Pind.3 = Input 'int1 als Eingang

Config Int1 = Falling



On Int1 Int1_isr


Enable Interrupts
Enable Int1

Dim A As Byte , C As Byte


Print "Waiting for RC5..."


Do
Reset Rot
Waitms 100
Set Rot
Waitms 1
Print C
Loop

End


Int1_isr:
Disable Int1
Getrc5(a , C)
Enable Int1
Return


pinc.2 (RC5 Eingang) und Pind.3 (int1 Eingang habe ich mit einem drähtchen verbunden


jedoch funkt. das ganze leider nicht ...
nachdem der in die In1_isr gesprungen ist blinkt nichtmehr die rote kontroll led
also der hängt sich irgendwie in der Int1_isr auf ....

wer hat schonmal das ganze mit dem RC5 und interrupts gelöst ?


Gruß Tobias

01.11.2005, 19:12
ich habe das mit fastavr-basic gelöst.
--------------------------------------------------
$Device= m16
$Stack = 32
$Clock = 8
$Baud = 19200
$RC5=PORTD.2

Dim ir_adr As Byte, ir_Command As Byte

Declare Interrupt Int0()

Int0 Falling
Enable Int0
Enable Ovf0
Enable Interrupts

Do
Wait 100
Loop

End

Interrupt Int0(), Save 2
Disable Int0
Enable Interrupts
RC5(ir_adr, ir_Command)
Print ir_command
Reset Int0
Enable Int0
End Interrupt
-------------------------------------------

mfg psf

spatz2222
05.11.2005, 10:35
tja sieht ja auch fast wie meine Code in Bascom aus ... nur leider funkt. es eben nicht ganz so wie bei Deinem fastavr-Basic

na ja da werde ich halt noch ein bischen rumbasteln müssen !

gruß Tobias

05.11.2005, 16:13
bascom nimmt für diese rc5-routine eine interrupt:
Connect to input to PIND.2 for this example
'The GETRC5 function uses TIMER0 and the TIMER0 interrupt.
'The TIMER0 settings are restored however so only the interrupt can not
'be used anymore for other tasks

da liegt der haken bei bascom. kann dir nicht mehr weiterhelfen.

Marco78
05.11.2005, 16:52
Aber Timer0 wird im Programm doch garnicht verwendet?!?

spatz2222
05.11.2005, 17:05
doch die das getrc5(...,...) nimmt intern den Timer0
mh... dann also wieder einen 2. Controller der getrc5 --> rs232
und im hauptcontroller einen Interrupt bei Rx

na ja habe ich mir schon fast so gedacht ...

aber es wäre totzdem schon wenn einer mal das Beispiel von der u.g. Version hätte !!!


"GETRC5 supports extended RC5 code form version 1.11.6.9 thanks to Gert Boer who implemented the extended RC5..."

gruß Tobias

Marco78
05.11.2005, 17:26
Ja, geht GETRC5 nimmt den Timer0 um die Pulslängen zu erkennen.
Aber:

$crystal = 10000000
$regfile = "m8def.dat"
$baud = 19200



Config Pinc.0 = Output ' IR Sensor sitzt mit GND an Pinc.0
Reset Portc.0 ' und mit +5V an Pinc.1
Config Pinc.1 = Output ' und mit Sign. an Pinc.2
Set Portc.1


Config Pind.4 = Output ' kontroll LED
Config Pind.5 = Output 'kontroll led

Gruen Alias Portd.4
Rot Alias Portd.5


Config Rc5 = Pinc.2

Config Pind.3 = Input 'int1 als Eingang

Config Int1 = Falling



On Int1 Int1_isr


Enable Interrupts
Enable Int1

Dim A As Byte , C As Byte


Print "Waiting for RC5..."


Do
Reset Rot
Waitms 100
Set Rot
Waitms 1
Print C
Loop

End


Int1_isr:
Disable Int1
Getrc5(a , C)
Enable Int1
Return

Wo ist hier von Timer0 die Rede? Niergendwo. Brauch ja auchnicht. Das erledigt GETRC5() ja von alleine.

Warum sollte also INT1 gesperrt sein, wenn Timer0 angewendet wird???

Ich verstehe nicht, warum Gast die Hilfe bezüglich GETRC5() zitiert in der von Timer0 die Rede ist, wenn INT1 verwendet werden soll.

spatz2222
05.11.2005, 17:51
deshalb wäre es schön zu sehen wie das Getrc5 in Bascom arbeitet

gehen tut das bestimmt irgendwie und wenn es auch assembler ist ...


was ist gemeint das auch der interrupt von Tomer0 verwendet wird ?
bei einem Überlauf ? im Fehlerfall ? also wenn kein RC5 signal da ist ?

Marco78
05.11.2005, 18:27
INT1 wird überhaupt nicht verwendet für GETRC5()! Er ist frei. Du kannst damit machen was du willst. Von daher ist es egal das GETRC5() den Timer0 braucht. Timer0 und INT1 haben nicht miteinander zu tun.

Davon rede ich doch die ganze Zeit.


'The GETRC5 function uses TIMER0 and the TIMER0 interrupt.
'The TIMER0 settings are restored however so only the interrupt can not
'be used anymore for other tasks

da liegt der haken bei bascom. kann dir nicht mehr weiterhelfen.

INT1 <> Timer0!

Probier es doch mal so. Mal schauen was passiert.

Int1_isr:
Set Rot
Disable Int1
Set Gruen
Getrc5(a , C)
Enable Int1
Reset Rot
Return

stupsi
05.11.2005, 18:49
ich glaub, spatz hat das gleiche verständnisproblem wie ich:
Ich hab den Timer0 für eine PWM verwendet; nur Timer1 wäre für GETRC5 frei. Wenn ich jetzt lese:

>> The GETRC5 function uses TIMER0 and the TIMER0 interrupt.
tritt doch das problem auf, oder?

Gruß Stupsi

spatz2222
05.11.2005, 19:02
stupsi - ich weiß nicht genau wie Du das meinst ... ich möchte ja eigentlich nur aus der Int1_isr das Getrc5 aufrufen !
stimmt schon man muß verstehen wie das getrc5 funkt.

marco78 - habe das mal probiert ... beide LED's leuchten !
auch von ich das -- reset rot -- vor das Enable Int1 schreibe !!!

der µC hängt sich irgendwie in dem Getrc5 auf !?

das ganze funkt. auch schon mit Kunstlicht aus einer Leuchtstoffröhre !

wenn ich die Zeile getrc5 entferne und auf der Fernb. eine Taste drücke sehe ich die LED ganz ganz schwach aufblitzen !


gruß Tobias

spatz2222
05.11.2005, 19:15
ich werde mal folgendes in der Praxis probieren !

dim b as bit

Do
If b = 1 Then
Getrc5(a , C) 'Reset Rot
Toggle Gruen
reset b
End If

Loop

End

Int1_isr:
Set B
Return

Marco78
05.11.2005, 19:30
Es mag ja sein, das bis der TSOP auf low ist und der INT soweit ist das GETRC5() aufgerufen wird, zuviel Zeit vergangen ist.

Kann ich mir aber nicht vorstellen.

Nochmal zum debuggen. Das mit den LEDs war wohl ne blöde Idee von mir. Die rote z.b. würde ja nur flackern.
Du kannst ja in der ISR vor jeder Zeile ein Print "sonstwas" einfügen. So siehst du, an welcher Stelle er stoppt.
Sonstwas sollte aber für jede Zeile anders sein ;)

spatz2222
05.11.2005, 20:07
weiß ich ja - er stopt an der getrc5 zeile in der isr

stupsi
05.11.2005, 20:19
na, ich hatte was misverstanden >> The GETRC5 function uses TIMER0 and the TIMER0 interrupt. ich dachte, "TIMER0 interrupt" ist INT0; das ist wohl nicht richtig.

Weil es aber so schön in diesen Thread passt, die Zusatzfrage:
Was bedeutet: >> The GETRC5 function uses TIMER0 and the TIMER0 interrupt. ?? Ist GETRC5 ohne TIMER0 nutzbar?

Gruß Stupsi

spatz2222
05.11.2005, 20:26
ich denke nein !
das ganze wird ja intern über Timer0 realisiert !
für was der interrup von Timer0 ? warscheilnich beim Überlauf im Fehlerfall ...

spatz2222
05.11.2005, 20:53
danke an rudi

hier : https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=14024&highlight=rc5


folgendes geht :


Do
Print A ; " " ; C
Waitms 300
Loop

End

Int1_isr:

Disable Int1
ENABLE INTERRUPTS
Getrc5(a , C)
Print A ; " " ; C
Enable Int1
Return


nur funkt. nur das print aus der isr herraus

irgendwie übernimmt der das a und c nicht in's hauptprogramm ...

aber ich glaube das hat sich fast gelöst der problem ... da der bei jedem Lichtblitz etc. in die int1_isr springt

da geht mit zuviel zeit dahin !


vielen Dank an alle

Gruß Tobias

05.11.2005, 23:37
ENABLE INTERRUPTS ...

also hast du doch nicht mein code von fastavr übernommen. es fehlte bei dir
..Enable...
ihr müsst das nächste mal besser prüfen und nicht über die hilfe meckern.

spatz2222
05.11.2005, 23:54
sorry - die eine Zeile habe ich leider Übersehen !!!

aber wie gesagt Danke den vielen Helfern !!!