Commit 60d4e811 authored by Diedrich Wolter's avatar Diedrich Wolter
Browse files

added support for RC-5 type IR remote control

parent cf2bf208
......@@ -19,7 +19,7 @@
CLOCK = 32000000UL
TARGET = main
SRC = $(TARGET).c twi.c usart.c
AVRDUDE_PORT = /dev/cu.usbmodem14141
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
......
......@@ -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, "\nLos geht's!\n");
usart_puts_P(&USART_data, "\nLos 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 = 0b10101010;
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 = 0b00000011; // 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 = 0b00000011; // 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 = 0b00000000; // 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++;
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment