Go Down

Topic: Arduino Timer Question (Read 660 times) previous topic - next topic

mitko

Nov 01, 2012, 09:35 pm Last Edit: Nov 01, 2012, 09:39 pm by mitko Reason: 1
Hi guys I am using two rf devices to transmit data, the transmitter is attiny85 and receiver is atmega328p, but now I am trying to execute another code while the receiver is reading data when I  do it I get request time out in my c# application.
I am using MANCHESTER library to transmit the number data :)
Is there a way to use delegate or something to interupt the manchester 1 minute delay and execute the code for turning on my TV ?

Code
Code: [Select]

#include <MANCHESTER.h>

#define RxPin 4

void setup()
{
MANCHESTER.SetRxPin(RxPin); //user sets rx pin default 4
MANCHESTER.SetTimeOut(1000); //user sets timeout default blocks
Serial.begin(9600); // Debugging only
}//end of setup

void loop()
{
unsigned int data = MANCHESTER.Receive();
Serial.println(data);
}//end of loop



After Serial.println(data);
Code: [Select]

char c = Serial.read();
if(c == 'p')
{
//this method just send a special IR impulse in order to control the mp3 player at home
PlayMedia();
}

robtillaart

Not familiar with the manchester library, can you post a link?
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

mitko


Not familiar with the manchester library, can you post a link?

Manchester.cpp - http://dox.bg/files/dw?a=14b160bdf3

Nick Gammon

I wrote a Manchester library (not the one you posted) which uses pin change interrupts and thus keeps going while you do other things.

It is described here:

http://www.gammon.com.au/forum/?id=11506

The library is on that page, a fairly small download, plus example code in the car receiver.

Scroll down to: "Manchester receiving library".
Please post technical questions on the forum, not by personal message. Thanks!

More info:
http://www.gammon.com.au/electronics

mitko


I wrote a Manchester library (not the one you posted) which uses pin change interrupts and thus keeps going while you do other things.

It is described here:

http://www.gammon.com.au/forum/?id=11506

The library is on that page, a fairly small download, plus example code in the car receiver.

Scroll down to: "Manchester receiving library".

Ok I found receiver and send library and I downloaded them both but I have one question is it possibble to upload the transmiter sketch to attiny85 with arduino UNO AS ISP and then upload the receiver to my arduino uno ?
I presume that ManchesterSend is the same as ManchesterTransmiter

Nick Gammon

I presume it is the same protocol. The send library uses Timer 2, you may have to rework it slightly for the Attiny.
Please post technical questions on the forum, not by personal message. Thanks!

More info:
http://www.gammon.com.au/electronics

mitko

#6
Nov 02, 2012, 10:27 am Last Edit: Nov 02, 2012, 10:38 am by mitko Reason: 1

I presume it is the same protocol. The send library uses Timer 2, you may have to rework it slightly for the Attiny.

so as far as I know from assembler the attiny85 dont have timer2 and I have to use Timer1 , and in order tgo sync it with the atmega328p receive programm I have to use attiny internal 8MHz.
I changed the code this way :
Code: [Select]

//
//  ManchesterSend.cpp
//  
//
//  Created by Nick Gammon on 22/01/12.
//  Copyright 2012 __MyCompanyName__. All rights reserved.
//

#include <ManchesterSend.h>

namespace ManchesterSend {
 
 // which pin to send on
 byte sendPin;

 // current bits yet to be sent
 volatile unsigned long outData;
 
 // how many bits
 volatile byte bitsToGo;
 
 // the current bit
 byte currentBit;
 
 // have we sent the first of the two pulses?
 boolean sentFirst;


// initialize by setting send pin to output
//   also configure Timer 2 to interrupt us every 500 uS
void begin (const byte pin)
{
 
 sendPin = pin;
 
 digitalWrite (sendPin, HIGH);
 pinMode (sendPin, OUTPUT);
 
 bitsToGo = 0;
 
 // reset Timer 2
 TCCR1A = 0;
 TCCR1B = 0;
 
 // Timer 2 - gives us our 500 uS counting interval
 // 16 MHz clock (62.5 nS per tick) - prescaled by 64
 //  counter increments every 4 uS.
 
 // So we count 125 of them, giving exactly 500 uS (1 mS)
 TCCR1A = _BV (WGM21) ;   // CTC mode
 OCR1A  = 124;            // count up to 125  (zero relative!!!!)
 
 // Timer 2 - interrupt on match
 TIMSK1 = _BV (OCIE1A);   // enable Timer2 Interrupt
 TCNT1 = 0;    
 
 // Reset prescalers
 GTCCR = _BV (PSRASY);        // reset prescaler now
 // start Timer 2
 TCCR1B =   _BV (CS22) ;  // prescaler of 64

} // end of ManchesterSend::begin

// write one byte (blocking)
void write (const byte data)
 {
 
 outData = (((unsigned long) data) << SYNC_BITS) | (1UL << (SYNC_BITS - 1));  
 bitsToGo = SYNC_BITS + 8;
 
 // wait for data to go                            
 while (bitsToGo)
   {}  // block until ISR pulls bits out

 delay (1);  // give last pulse time to go in case it was a LOW
 } // end of ManchesterSend::write

// Timer 2 interrupt here:
 
// a 1 is 01
// a 0 is 10

void isr ()
 {
 
 // if out of bits, set line to high and exit  
 if (bitsToGo == 0)
   {
   digitalWrite (sendPin, HIGH);
   return;
   }  // end of nothing to do
 
 // second pulse is the right way around
 if (sentFirst)
   {
   if (currentBit == 0)
     digitalWrite (sendPin, LOW);        
   else    
     digitalWrite (sendPin, HIGH);      
   
   // read for next one
   sentFirst = false;
   // one less bit
   bitsToGo--;  // that bit has been sent
   return;
   }  // end of done second bit
 
 // get low-order bit
 currentBit = outData & 1;
 // ready for next time
 outData = outData >> 1;
 // send inverse of bit
 if (currentBit == 0)
   digitalWrite (sendPin, HIGH);        
 else    
   digitalWrite (sendPin, LOW);  
 // next time we sent other way around
 sentFirst = true;    
 
 } // end of ManchesterSend::isr

 
} // end namespace ManchesterSend


// Timer 2 compare: call our ISR
ISR (TIMER1_COMPA_vect)
{
 ManchesterSend::isr ();
}  // end of TIMER2_COMPA_vect


Please tell me if I changed correct the code to work with Timer1, the code compile for atmega328 :)
but when I try for attiny85 I get:
Code: [Select]
C:\Users\XaKeRa\Desktop\arduino-0023\libraries\ManchesterSend\ManchesterSend.cpp: In function 'void ManchesterSend::begin(byte)':
C:\Users\XaKeRa\Desktop\arduino-0023\libraries\ManchesterSend\ManchesterSend.cpp:42: error: 'TCCR1A' was not declared in this scope
C:\Users\XaKeRa\Desktop\arduino-0023\libraries\ManchesterSend\ManchesterSend.cpp:43: error: 'TCCR1B' was not declared in this scope
C:\Users\XaKeRa\Desktop\arduino-0023\libraries\ManchesterSend\ManchesterSend.cpp:50: error: 'WGM21' was not declared in this scope
C:\Users\XaKeRa\Desktop\arduino-0023\libraries\ManchesterSend\ManchesterSend.cpp:54: error: 'TIMSK1' was not declared in this scope
C:\Users\XaKeRa\Desktop\arduino-0023\libraries\ManchesterSend\ManchesterSend.cpp:58: error: 'PSRASY' was not declared in this scope
C:\Users\XaKeRa\Desktop\arduino-0023\libraries\ManchesterSend\ManchesterSend.cpp:60: error: 'CS22' was not declared in this scope

Go Up