yair99

tinyWall

May 17th, 2014
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.96 KB | None | 0 0
  1. // ATMEL ATTINY85 running @ 8MHz / ARDUINO **Zvi Schneider 12-May-2014**
  2. //                   +----\/---+
  3. //  ADC0,  PB5,     1|*           |8    VCC
  4. //  ADC3,  PB3, 2|             |7   PB2,  ADC1
  5. //  ADC2,  PB4, 3|             |6   PB1,
  6. //  GND         4|             |5   PB0,
  7. //                       +---------+
  8.  
  9. #define my_milisec  76 // 76 interrupts equal 1 mili-sec (approximatly)
  10. #define interval  100 //100 mili-sec interval between repetetive code transmitions
  11. volatile long interrups_counter = 0;
  12. byte virtual_wall = B10100010; // ROOMAs virtual wall code
  13. int one_milisec = my_milisec;
  14. int three_milisec = my_milisec * 3;
  15.  
  16. ISR (TIM0_COMPA_vect) { // interrupt service routine
  17.   interrups_counter +=1;
  18. }
  19.  
  20. void setup(){
  21.   TCNT0 = 0; //initialize timer0 registers
  22.   TCCR0A=0;
  23.   TCCR0B=0;
  24.   TCCR0A |=(1<<COM0A0); //Timer0 in toggle mode (Table 11-2)
  25.   TCCR0A |=(1<<WGM01); //Timer0 in CTC mode (Table 11.5)
  26.   TCCR0B |= (1 << CS00);// Prescaler (table 11.6, no prescaling)
  27.   OCR0A=105-1; //CTC Compare value. with 8MHz clock and no prescaling this value will give interrupt every 13.125 micro-sec
  28.   TIMSK |= 1<<OCIE0A; //enable timer0 OCR0A interrups
  29.   SREG |= B10000000; //enable interrups
  30. }
  31.  
  32. void loop(){
  33.   while (interrups_counter < my_milisec*interval){ //wait interval miliseconds
  34.   }
  35.   interrups_counter = 0;
  36.   xmitbyte(virtual_wall); //send one byte command to the ROOMBA
  37. }
  38.  
  39. void xmitbyte(byte xmitdata){
  40.   int i;
  41.   int mark;
  42.   int space;
  43.   byte shift_one = B10000000;
  44.   for (i = 0; i < 8; i++){
  45.     if (xmitdata & shift_one){
  46.       mark = three_milisec;
  47.       space = one_milisec;
  48.     }
  49.     else {
  50.       mark = one_milisec;
  51.       space = three_milisec;
  52.     }
  53.     pinMode(PB0, OUTPUT); // mark, transmit IR pulses
  54.     while (interrups_counter < mark){
  55.     }
  56.     interrups_counter = 0;
  57.     pinMode(PB0, INPUT); // space, do not transmit IR pulses
  58.     while (interrups_counter < space){
  59.     }
  60.     interrups_counter = 0;
  61.     shift_one = shift_one >> 1;
  62.   }
  63. }
Advertisement
Add Comment
Please, Sign In to add comment