Facebook
From BERsoft, 7 Years ago, written in C++.
Embed
Download Paste or View Raw
Hits: 264
  1. #define bit_set(p,m) ((p) |= (1<<m))
  2. #define bit_clear(p,m) ((p) &= ~(1<<m))
  3.  
  4. volatile byte ramka[21];
  5.  
  6.  
  7. void zrob_ramke () {
  8.   ramka[1] = 0x7E;  // początek pakietu
  9.   ramka[2] = 0; // RX nr
  10.   ramka[3] = 0; // FLAG1
  11.   ramka[4] = 0; // FLAG2
  12.   // 5-16 - kanały 1-8
  13.   ramka[17] = 0; // stała
  14.   // 18,19 CRC16 lowByte(x); highByte(x);
  15.   ramka[20] = 0x7E; // koniec pakietu
  16. }
  17.  
  18.  
  19.  
  20. void setup() {
  21.   zrob_ramke();
  22.   init_timer1();
  23. }
  24.  
  25.  
  26. void loop() {}
  27.  
  28.  
  29.  
  30. void init_timer1() {
  31.   cli();
  32.   TCCR1A = 0; // set entire TCCR1 register to 0
  33.   TCCR1B = 0;
  34.  
  35.   OCR1A = 100;  // compare match register, change this
  36.   TCCR1B |= (1 << WGM12);  // turn on CTC mode
  37.   TCCR1B |= (1 << CS11);  // 8 prescaler: 0,5 microseconds at 16mhz
  38.  
  39.   TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt
  40.   sei();
  41. }
  42.  
  43.  
  44. ISR(TIMER1_COMPA_vect) { // ---------------------------------------- nadawanie PXX - pin 13 (PB5) --------------------------------------------
  45.  
  46. static byte cykl = 0;
  47. static byte ile_1 = 0;
  48. static byte _bit=0, nr_bit=7, nr_byte=1;
  49.  
  50.   TCNT1 = 0;  OCR1A = 8 * 2;
  51.  
  52.   if ( ramka[ nr_byte ] & 1 << nr_bit ) { _bit=1; } else { _bit=0; ile_1=0; } // jaki bit teraz wysyłany
  53.   if ( ( ile_1 == 5 ) && ( cykl == 0 ) ) { cykl = 10; ile_1=0; } // jeżeli jest pięć jedynek wyślij 0
  54.  
  55.   switch (cykl++) {
  56.       case 0:
  57.           if ( nr_bit == 0 ) {  nr_bit=8;    nr_byte++;  if ( nr_byte == 21 ) { nr_byte=1; }         }
  58.           nr_bit--;  // kolejny bit do obróbki
  59.           if ( _bit) { cykl=5; } else { cykl=6; }
  60.       case 5: bit_clear(PORTB,PB5);
  61.          if ( ( nr_byte > 1 ) && ( nr_byte < 20 ) )  { ile_1++; }  // licz ile bitów 1 z rzędu
  62.       break;
  63.  
  64.       case 6: bit_clear(PORTB,PB5);  break;
  65.       case 7: bit_set(PORTB,PB5);  cykl=0;  break;
  66.       case 10: bit_clear(PORTB,PB5); break;  //10,11 - dodatkowy bit 0 po pięciu 1
  67.       case 11: bit_set(PORTB,PB5); cykl=0;  break;
  68.   }
  69.  
  70. }
  71.