Nochmal hallo
Weil mich das Thema "asuro als Fernbedienung" selbst auch sehr interessiert habe ich mal eine Art Grundgerüst gebastelt:
In diesem 803Bytes (14 Pages) großen Programm habe ich die wichtigsten Funktionen aus der asuro-Library zusammenkopiert:Code:#include <avr/io.h> #include <avr/interrupt.h> #define OFF 0 #define ON 1 volatile unsigned char count72kHz; /* uses 72kHz timer => Sleep(x) = x/72kHz [sec] */ void Sleep(unsigned char time72kHz) { count72kHz = 0; while (count72kHz < time72kHz); } /* function to read out switches */ unsigned char PollSwitch (void) { unsigned int i; DDRD |= (1 << PD3); // Switches as Output PORTD |= (1 << PD3); // Output HIGH for measurement ADMUX = (1 << REFS0) | (1 << MUX2); // AVCC reference with external capacitor Sleep(10); ADCSRA |= (1 << ADSC); // Start conversion while (!(ADCSRA & (1 << ADIF)));// wait for conversion complete ADCSRA |= (1 << ADIF); // clear ADCIF i = ADCL + (ADCH << 8); PORTD &= (1 << PD3); //return ((unsigned char) ((( 1024.0/(float)i - 1.0)) * 63.0 + 0.5)); return ((10240000L/(long)i-10000L)*63L+5000L)/10000; } /* function for serial communication */ void SerWrite(unsigned char *data,unsigned char length) { unsigned char i = 0; UCSRB = 0x08; // enable transmitter while (length > 0) { if (UCSRA & 0x20) { // wait for empty transmit buffer UDR = data[i++]; length --; } } while (!(UCSRA & 0x40)); for (i = 0; i < 0xFE; i++) for(length = 0; length < 0xFE; length++); } // aus: https://www.roboternetz.de/phpBB2/ze...=328394#328394 void PrintChar(unsigned int x) { char ergebnis[5] = {'0','0','0','0','0'}; while (x >=10000) { ergebnis[0]++; x -=10000; } while (x >= 1000) { ergebnis[1]++; x -= 1000; } while (x >= 100) { ergebnis[2]++; x -= 100; } while (x >= 10) { ergebnis[3]++; x -= 10; } ergebnis[4] +=x; SerWrite(ergebnis,5); } /* Front LED */ inline void FrontLED(unsigned char status) { PORTD = (PORTD &~(1 << PD6)) | (status << PD6); } /* Status LED (OFF,GREEN,YELLOW,RED)*/ inline void StatusLED(unsigned char color) { #define GREEN 1 #define RED 2 #define YELLOW 3 #define GREEN_LED (1 << PB0) #define RED_LED (1 << PD2) #define GREEN_LED_ON PORTB |= GREEN_LED #define GREEN_LED_OFF PORTB &= ~GREEN_LED #define RED_LED_ON PORTD |= RED_LED #define RED_LED_OFF PORTD &= ~RED_LED if (color == OFF) {GREEN_LED_OFF; RED_LED_OFF;} if (color == GREEN) {GREEN_LED_ON; RED_LED_OFF;} if (color == YELLOW) {GREEN_LED_ON; RED_LED_ON;} if (color == RED) {GREEN_LED_OFF; RED_LED_ON;} } void Msleep(int dauer) { int z; for(z=0;z<dauer;z++) Sleep(72); } int main(void) { //-------- seriell interface programmed in boot routine and already running ------- // prepare 36kHz for IR - Communication TCCR2 = (1 << WGM21) | (1 << COM20) | (1 << CS20); OCR2 = 0x6E; // 36kHz @8MHz TIMSK |= (1 << OCIE2); // 36kHz counter for sleep // prepare RS232 UCSRA = 0x00; UCSRB = 0x00; UCSRC = 0x86; // No Parity | 1 Stop Bit | 8 Data Bit UBRRL = 0xCF; // 2400bps @ 8.00MHz // I/O Ports DDRB = (1<<PB3) | (1<<PB0); // OC2 und GreenLED auf Ausgang DDRD = (1<<PD6) | (1<<PD2) | (1<<PD1); // FrontLED, RedLED und TXD auf Ausgang sei(); FrontLED(ON); while(1) { StatusLED(RED); SerWrite("Hallo\r\n", 7); PrintChar(12345); SerWrite("\n\r", 2); PrintChar(PollSwitch()); SerWrite("\n\n\r", 3); StatusLED(YELLOW); Msleep(500); } return(0); } /* uses timer2 (36kHz for IR communication */ /* counts falling and rising edge => 36kHz*2 = 72kHz */ SIGNAL (SIG_OUTPUT_COMPARE2) { count72kHz ++; }
72kHz-Timer mit OCR
USART
Tasten
einige LEDs
Jetzt fehlt nur noch der RC5-Teil in der ISR. Das kann ja nimmer schwer sein. Beteiligung anderer asuro-Spezialisten erwünscht :)
Gruß
mic







Zitieren

Lesezeichen