Nochmal hallo
Weil mich das Thema "asuro als Fernbedienung" selbst auch sehr interessiert habe ich mal eine Art Grundgerüst gebastelt:
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 ++;
}
In diesem 803Bytes (14 Pages) großen Programm habe ich die wichtigsten Funktionen aus der asuro-Library zusammenkopiert:
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
Lesezeichen