@Harry (X1CR),
hier der Code, war aber für nen' Tiny26 statt dem angegebenen Tiny2313
Ist eine kleine Tastatur von Pollin dran, und läuft mit internem Oszi 4Mhz.
Zwischen PB3 und PB1 hängen 2 IR-Dioden in Reihe (mehr Licht) mit einem Widerstand, das ist alles.
Mit einer Taste kann das Ding abgeschaltet werden, eine andere Taste macht nen Reset und startet die Fernsteuerung wieder. So läufts auch mit 4 Batterien recht lang.
Prg. ist nicht elegant, aber mußte auch auf die schnelle gemacht werden,
da die alte Steuerung kaputt war und Sohnemann nicht mit Geduld gesegnet ist.
Könnte man natürlich eleganter und effizienter machen, aber..[-(
GrüßeCode:/* Title: RC5-Sender Hardware: ATtiny26 ******************************************************************************************************* * Ein- Ausgänge * PA0 (20) - ADC0 Fahrlicht S1 PB0 ( 1) - MOSI/OC1A (6,16) - GND * PA1 (19) - ADC1 Blinker li S2 PB1 ( 2) - MISO LED (5,15) - VCC,AVCC * PA2 (18) - ADC2 Blinker re S3 PB2 ( 3) - SCK * PA3 (17) - AREF Arbeitslicht1 S4 PB3 ( 4) - OCB1 * PA4 (14) - ADC3 Blitzlicht PB4 ( 7) - XTAL1 Oszi * PA5 (13) - ADC4 Rundum PB5 ( 8) - XTAL2 LED * PA6 (12) - AIN0 Sel_1 PB6 ( 9) - INT0 Einschalter * PA7 (11) - AIN1 Sel_2 PB7 (10) - RESET * ******************************************************************************************************* * RC5-Code * 1 Takt ca. 889µs, "1" -> Low/High, "0" -> High/Low -> 1 Bit = 2x889µs = 1,778ms * Zustand "1" "0" * __ __ * __| | | |__ * Takt: 0 1 0 1 * * Kompletes Telegramm beinhaltet 14 Bit = 24,889ms * 1.Startbit immer "1" * 2.Startbit immer "1", bei extd. kann dies "0" sein * Toggel normal "0", bei Tastenrepeat "1" * 5 Bit Adresse * 6 Bit Kommando * Bei Tastenwiederholung wird neues Telegramm nach 113,78ms (64Bitzeiten) gesendet. ******************************************************************************************************* */ #include <avr/io.h> #include <avr/interrupt.h> #include <avr/sleep.h> volatile unsigned char ms, buf_ptr, ms1; // ms Zeitgeber volatile damit auch in IRQ bearbeitet wird. unsigned char txbuffer[28]; // Sendbuffer halbnibbles #define tcnt_val 200 // 889µs @ Teiler 64 @ 4MHz //#define INTERNAL_TESTS 1 #define SET_BIT(PORT, BITNUM) ((PORT) |= (1<<(BITNUM))) #define CLEAR_BIT(PORT, BITNUM) ((PORT) &= ~(1<<(BITNUM))) #define TOGGLE_BIT(PORT, BITNUM) ((PORT) ^= (1<<(BITNUM))) /************************************************************** Init Description: Initalisieren des µC In : Out: ms ************************************************************/ void init() { cli(); // Disable IRQ's // Port konfigurieren PORTA = 0x0F; // Pullup aktiv PORTB = 0x0; // PORTx Outputs DDRA = 0b11000000; // PA6+7 Output DDRB = 0b00001010; // PB1+3 Output, PB3 Led ON/OFF RC5; PB1 LED ON/OFF Trägerfreq. TCNT0 = 0; // reset TCNT0 TCCR0 = 3; // count with cpu clock/8 TIMSK = 1<<TOIE0; // enable TCNT0 overflow AND Timer1 CompA match TCCR1A = 1<<COM1A0; // Toggel at match TCCR1B = 1<<CS10 | 1<<CTC1; // Timer1 count with cpu clock OCR1C = 55; // Reloadwert = 72kHz GIMSK = 0; // INT0 IRQ sperren } /************************************************************** ISR (TIMER0_OVF_vect) Description: Timer 0 Overflow IRQ In : Out: alle ,5 ms ************************************************************/ ISR (TIMER0_OVF0_vect) { unsigned char sreg; sreg = SREG; TCNT0 = TCNT0 + tcnt_val; // Zähler neusetzen if ( ms==200 ){ // Startkennung ? if (txbuffer[buf_ptr]) SET_BIT(PORTB,3); else CLEAR_BIT(PORTB,3); buf_ptr++; if (buf_ptr == 28) // Ende erreicht ms = 168; // Wartezeit starten ca. 155ms } else if (ms > 0){ ms--;} // counter -- if (ms1 > 0) ms1--; // counter -- SREG=sreg; } /************************************************************** ************************************************************/ int main( void ) { unsigned char i, j, newstatus, oldstatus, command; init(); // Initialisierung sei(); // IRQ freigeben oldstatus = 0; ms = 0; for (i=0;i<4;i++) txbuffer[i] = i & 1; // Startbits setzen for (i=5;i<29;i++) txbuffer[i-1] = i & 1; // Rest des Telegramm mit "0" beschreiben /* txbuffer[ 0] = 0; // Startbit = "1" txbuffer[ 1] = 1; txbuffer[ 2] = 0; // Startbit = "1" txbuffer[ 3] = 1; txbuffer[ 4] = 1; // Toggle txbuffer[ 5] = 0; txbuffer[ 6] = 0; // Adr 4 txbuffer[ 7] = 0; txbuffer[ 8] = 0; // Adr 3 txbuffer[ 9] = 0; txbuffer[10] = 0; // Adr 2 txbuffer[11] = 0; txbuffer[12] = 0; // Adr 1 txbuffer[13] = 0; txbuffer[14] = 0; // Adr 0 txbuffer[15] = 0; txbuffer[16] = 0; // Command 5 txbuffer[17] = 0; txbuffer[18] = 0; // Command 4 txbuffer[19] = 0; txbuffer[20] = 0; // Command 3 txbuffer[21] = 0; txbuffer[22] = 0; // Command 2 txbuffer[23] = 0; txbuffer[24] = 0; // Command 1 txbuffer[25] = 0; txbuffer[26] = 0; // Command 0 txbuffer[27] = 0; */ CLEAR_BIT(PORTA,PA6); // Select 1 schalten for (;;) { if (ms == 0){ // Aktuellen Status holen SET_BIT(PORTA,PA6); // Select 1 ausschalten CLEAR_BIT(PORTA,PA7); // Select 2 schalten ms1=10; // Wartezeit vor Auswertung while (ms1!=0); newstatus = ~PINA & 0x0F; // Eingänge holen SET_BIT(PORTA,PA7); // Select 2 schalten CLEAR_BIT(PORTA,PA6); // Select 1 schalten ms=10; // Wartezeit vor Auswertung while (ms1!=0); newstatus |= (~PINA & 0x0F) << 4; // Eingänge holen // Eingänge checken i = 0; j = 1; command = 255; while ((i < 8) && (command == 255)){ // Alle Bits durchlaufen // Abfrage auf wiederholte Tasten if (((newstatus & j) == j) && ((oldstatus & j) == j)){ txbuffer[ 4] = 0; // Togglebit = "1" txbuffer[ 5] = 1; command = i; // Ein des Ausgangs } // Abfrage auf geänderte Tasten if (((newstatus & j) == j) && ((oldstatus & j) != j)){ txbuffer[ 4] = 1; // Togglebit = "0" txbuffer[ 5] = 0; command = i; // Ein des Ausgangs } j = j << 1; i++; } // Commando-Auswertung derzeit bis 7 if (command != 0xff){ for (i=22;i<28;i++) txbuffer[i] = 0; // alle Commands löschen if(command == 0){ txbuffer[22] = 1; txbuffer[24] = 1; txbuffer[26] = 1; } if(command == 1){ txbuffer[23] = 1; txbuffer[24] = 1; txbuffer[26] = 1; } if(command == 2){ txbuffer[22] = 1; txbuffer[25] = 1; txbuffer[26] = 1; } if(command == 3){ txbuffer[23] = 1; txbuffer[25] = 1; txbuffer[26] = 1; } if(command == 4){ txbuffer[22] = 1; txbuffer[24] = 1; txbuffer[27] = 1; } if(command == 5){ txbuffer[23] = 1; txbuffer[24] = 1; txbuffer[27] = 1; } if(command == 6){ txbuffer[22] = 1; txbuffer[25] = 1; txbuffer[27] = 1; } if(command == 7){ txbuffer[23] = 1; txbuffer[25] = 1; txbuffer[27] = 1; } buf_ptr = 0; // Pointer an Anfang setzen ms = 200; // Start senden } oldstatus = newstatus; // aktueller Status merken if((PINB & 1<<PB6) == 0){ // Ausschalter betätigt loop_until_bit_is_set(PINB, 6); // Warte bis Ausschalter losgelassen wurde ms1=255; while (ms1!=0); ms1=255; while (ms1!=0); ms1=255; while (ms1!=0); ms1=255; while (ms1!=0); TCCR0 = 0; // Stop counter 0 TCCR1B = 0; // Stop Counter 1 set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Set Sleep enable sleep_mode(); } } } }
Hans-Josef







Zitieren

Lesezeichen