PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : GETKBD() und RC5Send mit Tiny2313



stefan_Z
08.12.2007, 17:55
Hi!

Ich habe ein kleines Problem mit der Kombination aus GETKBD() und RC5Send beim Tin2313.

1: Ich lese eine 4x7 Matrix-Tastatur aus. - Das geht super.
2: Ich sende mit RC5Send RC5-Codes - Das geht auch super.

1+2: Ich kann die eingelesenen Codes verarbeiten und auch versenden, aber da PinB.3 (OC1a) ja zwingend für das Senden benutzt werden muss, macht er Probleme mit seiner Keyboard-Spalte.
Ich bekomme auf allen Tasten dieser Spalte immer nur 27 als Wert.
Es sollten eigentlich 23, 19, 15, 11 und 7 sein

Jetzt ist das Auslesen der Matrix ja keine große Sache, man kann die Pins anderweitig einsetzen. Nur gelingt mir das nicht wirklich. Input/Output und auch 0/1 umschalten führen nicht weiter. Oder ich finde die richtige Kombination nicht.
Wer weiß was?



$regfile = "attiny2313.dat"
$crystal = 8000000
$hwstack = 64
$swstack = 16
$framesize = 21
$baud = 9600

Config Kbd = Portb , Debounce = 100 , Rows = 6 , Row5 = Pind.5 , Row6 = Pind.4

Declare Sub Rc5_senden(key_code As Byte)

Dim Key_scan As Byte

Do
Key_scan = Getkbd()
If Key_scan <> 24 Then
Call Rc5_senden(key_scan)
End If
Waitms 40
Loop

End


Sub Rc5_senden:
Local Togbit As Byte , Address As Byte
Togbit = 0
Address = 0
Config Pinb.3 = Output
Rc5send Togbit , Address , Key_code
End Sub Rc5_senden

stefan_Z
08.12.2007, 19:12
OK, ich hab die Matrix-Abfrage jetzt noch auf Interrupts umgestellt...
Funktioniert sehr gut, ist sicherlich die sauberere Lösung. Denn auch wenn der AVR nicht anderes als ne Fernbedienung sein soll, kann man so ja später noch prima den Stromspar-Modus zuschalten...

Den Code habe ich modifiziert von hier übernommen:
http://www.mcselec.com/index.php?option=com_content&task=view&id=175&Itemid=41
(SourceCodes -> EDBexperiment10.bas)

Verwendet wird der PinChange-Interrupt (sehr praktisch, kannte ich noch garnicht ;-) )

Dummerweise kommt immer noch 27 - klar, im Prinzip hat sich ja auch nix geändert...
Irgendwelche Ideen?


$regfile = "attiny2313.dat" ' specify the used micro
$crystal = 8000000 ' used crystal frequency
$hwstack = 64
$swstack = 16
$framesize = 21

$baud = 9600

Config Kbd = Portb , Debounce = 100 , Rows = 6 , Row5 = Pind.5 , Row6 = Pind.4

Dim Key_scan As Byte
Dim Togbit As Byte , Address As Byte

Pcmsk = &B00001111 'This sets the interrupt mask

On Pcint Matrixinput 'On interrupt goto MATRIXINPUT
Enable Pcint 'Enable interrupts
Enable Interrupts

Do
'HIER DER PROGRAMMCODE
Loop

End


Matrixinput: 'If we do not disable the interrupts
Disable Interrupts 'GetKBD would generate interrupts
Waitms 2 'That we cannot use
Key_scan = Getkbd() 'Look in the help file on how to connect the matrix keyboard
Waitms 2 'Waitms anti bounce

If Key_scan <> 24 Then
Goto Rc5_senden
Print "Keynr.: " ; Key_scan ; " received" '24 is no key pressed, so if 24 do nothing
End If

Return_from_interrupt:
Enable Interrupts

Return



Wait_for_matrix_24:
'Will wait until no key is pressed before enableing the interrupts
Key_scan = Getkbd()
If Key_scan = 24 Then Goto Return_from_interrupt
Goto Wait_for_matrix_24


Rc5_senden:
Togbit = 0
Address = 0
Config Pinb.3 = Output
Rc5send Togbit , Address , Key_scan