Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Diedrich Wolter
GhostCar Firmware
Commits
60d4e811
Commit
60d4e811
authored
Aug 26, 2015
by
Diedrich Wolter
Browse files
added support for RC-5 type IR remote control
parent
cf2bf208
Changes
2
Hide whitespace changes
Inline
Side-by-side
Makefile
View file @
60d4e811
...
...
@@ -19,7 +19,7 @@
CLOCK
=
32000000UL
TARGET
=
main
SRC
=
$(TARGET)
.c twi.c usart.c
AVRDUDE_PORT
=
/dev/cu.usbmodem141
4
1
AVRDUDE_PORT
=
usb
#
/dev/cu.usbmodem1411
### make targets:
###
...
...
@@ -103,8 +103,8 @@ LDFLAGS = $(EXTMEMOPTS) $(LDMAP) # $(PRINTF_LIB_MIN) $(SCANF_LIB_MIN)
# Programming support using avrdude. Settings and variables.
AVRDUDE_PROGRAMMER
=
avr109
AVRDUDE_XTRA_FLAGS
=
-b
57600
-e
AVRDUDE_PROGRAMMER
=
avrispmkII
#
avr109
AVRDUDE_XTRA_FLAGS
=
#
-b 57600 -e
AVRDUDE_WRITE_FLASH
=
-U
flash:w:
$(TARGET)
.hex
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
...
...
main.c
View file @
60d4e811
...
...
@@ -27,6 +27,18 @@
* wichtige Variablen:
* gRC5Ready = 1
*
* Codes für die Nokia-Fernbedienung:
* 1 -> 11176
* 2 -> 12072 / 12200
* 3 ->
* 4 ->
* 5 ->
* 6 ->
* 7 ->
* 8 ->
* 9 ->
* 0 -> 11176
*
* IR-Sender:
* ----------
* Ein IR-Signal von 37khz kann per Software durch PORTC, Bit 7 eingeschaltet werden.
...
...
@@ -52,6 +64,8 @@
uint8_t
gRC5SampleCount
,
gRC5Ready
;
unsigned
int
gRCC5Data
;
unsigned
int
gTimes
[
16
];
unsigned
int
gErr
=
0
;
int
__attribute__
((
OS_main
))
main
(
void
)
{
...
...
@@ -106,17 +120,36 @@ int __attribute__((OS_main)) main( void )
PMIC
.
CTRL
|=
PMIC_LOLVLEX_bm
|
PMIC_MEDLVLEX_bm
|
PMIC_HILVLEX_bm
;
sei
();
usart_puts_P
(
&
USART_data
,
"
\n
Los geht's!
\n
"
);
usart_puts_P
(
&
USART_data
,
"
\n
Los geht's!
\n
V0.0.1
\n
"
);
uint8_t
spdCnt
=
0
;
unsigned
int
speeds
[]
=
{
0
,
3000
,
6000
,
8191
};
LEDPORT
.
OUTSET
=
129
;
_delay_ms
(
500
);
TCD0
.
CCB
=
8000
;
LEDPORT
.
OUTSET
=
0
;
_delay_ms
(
200
);
TCD0
.
CCB
=
4500
;
LEDPORT
.
OUTSET
=
0
b10101010
;
while
(
1
)
{
// LEDPORT.OUT = (PORTC.IN & 64) ? 0 : 0xff;
if
(
gRC5Ready
)
{
gRC5Ready
=
0
;
usart_putDec
(
&
USART_data
,
gRCC5Data
);
usart_putc
(
&
USART_data
,
' '
);
usart_putc
(
&
USART_data
,
'['
);
int
i
;
for
(
i
=
0
;
i
<
14
;
i
++
)
{
usart_putDec
(
&
USART_data
,
gTimes
[
i
]);
usart_putc
(
&
USART_data
,
' '
);
}
usart_puts
(
&
USART_data
,
"] "
);
usart_putDec
(
&
USART_data
,
gErr
);
usart_puts
(
&
USART_data
,
"
\n
"
);
}
if
(
USART_RXBufferData_Available
(
&
USART_data
))
{
...
...
@@ -167,33 +200,34 @@ ISR(TCD1_OVF_vect) {
* Port C IRQ 0 wird beim Start einer IR-Übertragung ausgelöst
*/
ISR
(
PORTC_INT0_vect
){
PORTC
.
INT0MASK
=
0
;
// folgende IRQs unterdrücken
LEDPORT
.
OUTTGL
=
0xff
;
// DEBUG
gRC5SampleCount
=
14
+
1
;
// 14 Bit + 1 Bit "Müll", damit IR-Empfänger auf Ruhepegel zurückkehrt
gRCC5Data
=
0
;
/* Timer/Count C0 auf Überlauf alle 1778µs einstellen (= 56896 Taktzyklen @ 32Mhz) */
TCC0
.
CTRLA
=
TC_CLKSEL_DIV4_gc
;
TCC0
.
CTRLB
=
0x00
;
// normaler Zählmodus
TCC0
.
PER
=
14224
+
3556
;
// Zähler Top-Wert in Zyklen @ 32Mhz = 1788µs + 1/4 Zyklus
TCC0
.
CNT
=
0x00
;
// Zähler zurücksetzen
TCC0
.
INTCTRLA
=
0
b00000011
;
// Interrupt mit hoher Priorität
if
(
!
gRC5SampleCount
)
{
gRC5SampleCount
=
13
;
// 13 Bits
TCC0
.
CTRLA
=
TC_CLKSEL_DIV64_gc
;
TCC0
.
CTRLB
=
0x00
;
// normaler Zählmodus
TCC0
.
PER
=
56000
;
// Time-Out bei 112ms
TCC0
.
CNT
=
0x00
;
// Zähler zurücksetzen
TCC0
.
INTCTRLA
=
0
b00000011
;
// Interrupt mit hoher Priorität
TCC0
.
INTFLAGS
=
1
;
// IRQs zurücksetzen
}
else
{
unsigned
int
ti
=
TCC0
.
CNT
;
TCC0
.
CNT
=
0
;
gRC5SampleCount
--
;
gRCC5Data
<<=
1
;
gTimes
[
gRC5SampleCount
]
=
ti
;
if
(
ti
>
3000
)
{
gRCC5Data
|=
1
;
}
if
(
!
gRC5SampleCount
)
gRC5Ready
=
1
;
}
}
/*
* Port C Timer/Counter 0
tastet die IR-Übertragung ab
* Port C Timer/Counter 0
zündet bei Zählerüberlauf = Fehler
*/
ISR
(
TCC0_OVF_vect
)
{
TCC0
.
PER
=
14224
;
// ab nun: Zähler Top-Wert 3556 Zyklen = 1788µs
gRCC5Data
<<=
1
;
// nächstes Bit reinschieben
if
(
PORTC
.
IN
&
64
)
gRCC5Data
|=
1
;
gRC5SampleCount
--
;
if
(
!
gRC5SampleCount
)
{
// alle Bits gesampelt?
TCC0
.
INTCTRLA
=
0
b00000000
;
// Timer-Interrupt ausschalten
gRCC5Data
>>=
1
;
// "Müll"-Bit entfernen
gRC5Ready
=
1
;
LEDPORT
.
OUTTGL
=
0xff
;
// DEBUG
PORTC
.
INT0MASK
=
64
;
// neue IR-Übertragungen zulassen
}
gRC5SampleCount
=
0
;
gErr
++
;
}
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment