attiny85 VirtualWire till Mega2560

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
torkel
Inlägg: 5
Blev medlem: 7 april 2011, 11:23:26

attiny85 VirtualWire till Mega2560

Inlägg av torkel »

Hej!

Jag håller på att bygga ihop ett litet sensorsystem hemma som ska ge mig mer eller mindre intressant data (magnetkontakter, temperaturer m.m.). Mikroprocessorerna som jag använder är ATtiny25 och ATtiny85 (beroende på hur mycket minne som behövs). Dessa ska kommunicera över 433MHz-bandet till en Arduino Mega 2560 som är kopplad till servern.

Bootloader till Arduino är inprogrammerad i varje ATtiny och programmeras med en AVR-ISP500. De kör på i 16MHz med extern kristall och har fuses (Low/High/Extended) 0xFF/0xD7/0xFF. VirtualWire (http://www.pjrc.com/teensy/td_libs_VirtualWire.html) används på båda sidor.

EDIT: Mega 2560 kör i 16MHz, därför valde jag en sån kristall till ATtiny:n för att undvika timingproblem. ATtiny:n matas med 5V via en switchad nätadapter.

Nu till problemet då, en ATtiny kan inte kommunicera med min Mega 2560. Den kan dock kommunicera med en annan ATtiny och samma gäller för två Mega 2560. Eftersom jag inte ännu äger ett oscilloskop testade jag att koppla en LED till sändarporten på respektive enhet och jag ser där att ATtiny:n skickar data betydligt långsammare än Megan. Det som tar ett par millisekunder (om ens det) på Megan tar nästan en sekund på ATtiny:n, vilket får mig att misstänka problem med timers eller att den inte går i 16MHz som den ska.

Jag fick ändra två rader i VirtualWire för att få det att kompilera till ATtiny:n

Kod: Markera allt

#ifndef TEST
    // Set up timer1 for a tick every 62.50 microseconds 
    // for 2000 bits per sec
    TCCR0A = 0; <--- Ändrade TCCR1A till TCCR0A
    TCCR0B = _BV(WGM02) | _BV(CS10); <--- Ändrade TCCR1B till TCCR0B och WGM12 till WGM02[/b]
    // Caution: special procedures for setting 16 bit regs
    OCR1A = ocr1a;
    // Enable interrupt
#ifdef TIMSK1
    // atmega168
    TIMSK1 |= _BV(OCIE1A);
#else
    // others
    TIMSK |= _BV(OCIE1A);
#endif

#endif
boards.txt

Kod: Markera allt

attiny85at16.bootloader.low_fuses=0xFF
attiny85at16.bootloader.high_fuses=0xD7
attiny85at16.bootloader.extended_fuses=0xFF
attiny85at16.bootloader.path=empty
attiny85at16.bootloader.file=empty85at8.hex

attiny85at16.bootloader.unlock_bits=0xFF
attiny85at16.bootloader.lock_bits=0xFF

attiny85at16.build.mcu=attiny85
attiny85at16.build.f_cpu=16000000L
attiny85at16.build.core=tiny
Vad gör jag gör fel här?
torkel
Inlägg: 5
Blev medlem: 7 april 2011, 11:23:26

Re: attiny85 VirtualWire till Mega2560

Inlägg av torkel »

Jag har klurat fram och tillbaka lite till nu men kan inte komma fram till en lösning (annat än att byta ut mot någon med motsvarande timer, typ en Mega328P)

Hittade en nedbantad version av VirtualWire avsedd för attiny, dock endast för mottagning av data. Men nedanstående kod styr ju bara timern och det verkar fungera bra.

Kod: Markera allt

TCCR1 = 0x82;
	OCR1A = 125;
    // Enable interrupt
	TIMSK |= 0x40;
och min LED som får agera statusindikator visar att trafiken når mottagaren på Megan men troligen med lite annan tidsuppfattning än sändaren och tolkar datan som skräp.

Har ni någon teori om vad jag kan hitta på?
Johanb
Inlägg: 3406
Blev medlem: 26 mars 2006, 22:26:12
Ort: Smedjebacken

Re: attiny85 VirtualWire till Mega2560

Inlägg av Johanb »

Har du kollat så att registren som används gör samma sak i attiny och atmega? Har timern samma upplösning på båda?
ToPNoTCH
Inlägg: 4914
Blev medlem: 21 december 2009, 17:59:48

Re: attiny85 VirtualWire till Mega2560

Inlägg av ToPNoTCH »

Det låter som om du skapat koden i Arduino.

Om så är fallet så undrar jag vad du "låtsas" att din ATTiny är för Arduino kort i IDE't ? (det finns inget med Tiny på vad jag vet).

Efterssom kompilatorn sköter kompensationer för olika modeller av "Äkta" Arduino så är det säkert här problemet ligger.

Det kan nog gå att fixa men då måste du nog kompilera mot en Arduino som har en processor med samma register som en Tiny har.
Det vill säga lite som Johanb är inne på här ovan.
torkel
Inlägg: 5
Blev medlem: 7 april 2011, 11:23:26

Re: attiny85 VirtualWire till Mega2560

Inlägg av torkel »

Johanb skrev:Har du kollat så att registren som används gör samma sak i attiny och atmega? Har timern samma upplösning på båda?
Har försökt så bra jag har kunnat :) Noterade dock att den timern som används i Megan har 16 bitars upplösning medans ATtiny endast har 8 bitar. Antar att detta kan skapa lite problem?
ToPNoTCH skrev:Det låter som om du skapat koden i Arduino.

Om så är fallet så undrar jag vad du "låtsas" att din ATTiny är för Arduino kort i IDE't ? (det finns inget med Tiny på vad jag vet).

Efterssom kompilatorn sköter kompensationer för olika modeller av "Äkta" Arduino så är det säkert här problemet ligger.

Det kan nog gå att fixa men då måste du nog kompilera mot en Arduino som har en processor med samma register som en Tiny har.
Det vill säga lite som Johanb är inne på här ovan.
Jag använder Arduino-tiny (http://code.google.com/p/arduino-tiny/) direkt i IDE't. I boards.txt inkluderas attiny25, 45, 85 och en hel del andra tiny-modeller. Standard attiny85 har samma fuses som från fabrik, intern 8MHz/8 och ger 1MHz effektiv klockfrekvens. Denna har jag ändrat till att matcha min 16MHz externa kristall och tagit bort CKDIV8 vilket borde ge mig 16MHz klockfrekvens.

Kod: Markera allt

TCCR1 = 0x82;
   OCR1A = 125;
    // Enable interrupt
   TIMSK |= 0x40;
Jag funderade på en liten sak här. 0x82 i HEX är ju 1000 0010 och då sätts
Bit 7 – CTC1 : Clear Timer/Counter on Compare Match
When the CTC1 control bit is set (one), Timer/Counter1 is reset to $00 in the CPU clock cycle
after a compare match with OCR1C register value. If the control bit is cleared, Timer/Counter1
continues counting and is unaffected by a compare match
samt prescaling till CPU-frekvens / 2

Om jag läser rätt så borde det vara OCR1C som ska sättas till 125 och inte OCR1A. Sen för att aktivera interrupt ändrar den bit 6 i TIMSK till 1. Men enligt databladet är den låst (OCIE1A), bit 4 däremot (OCIE0A) får ändras.

Misstänker att jag får titta igenom databladet och koden några gånger till. Men har ni några andra idéer så tveka inte att skriva :) Återkommer när jag får klarhet i detta (alternativt byter till en annan modell)
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43205
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: attiny85 VirtualWire till Mega2560

Inlägg av sodjan »

> Jag funderade på en liten sak här. 0x82 i HEX är ju 1000 0010 och då sätts

Inte för att den kanske löser problemet, men sätt dina konstanter binärt
direkt i koden så slipper du konvertera hex/bin och det går snabbare att
se vilka bitar som är på/av. Detta gäller generellt för alla register som inte
bara har ett värde utan har bitar med olika och delvis oberoende funktion.
Skriv svar