pilot.rar

Emulator pilota do radii blaupunkt

http://obrazki.elektroda.pl/7046612000_1408899950_thumb.jpg Witam, oto moja pierwsza konstrukcja którą postanowiłem podzielić się ze światem. Myśl o sterowaniu radiem z kierownicy chodziła mi po głowie już daaaawno, niestety (głównie z powodu notorycznego braku czasu) pomysł wiecznie był dla mnie zbyt trudny do zrealizowania (wtedy programowanie mikroprocesorów to była dla mnie czarna magia). Miałem chęć kupić gotowy emulator pod kierownice z opla ale cena 150zł skutecznie mnie odstraszyła. Potem powstał pomysł kupienia pilota rc-10 i wykorzystanie bebechów. Już prawie powstał "emulator" ale znowu brak czasu i chęci do wieczornego lutowania zabiły projekt. Gdzieś kiedyś znalazłem dokładny opis czasów do sterowania blaupunktem i wtedy zaczęło się. Zaczęło sie poszukiwanie kursu AVR aby nauczyć się programować. Zakupiłem ATMege8, podstawową drobnicę elektryczną potrzebną do startu i zbudowany własnoręcznie najbardziej prymitywny programator LPT złożony z paru rezystorów. Początkowo szło mi mizernie, wręcz tragicznie. Ciężko przebijałem się przez kolejne zagadnienia, proste programy wogóle mi nie wychodziły. Szukałem rybki której nie znalazłem. Nikt nie udostępniał kodu tylko wszyscy schemat który był debilnie prosty :) . Aż pewnego dnia nastąpił przełom dzięki któremu powstał ten magiczny "emulator". Niestety mój komputer miał awarie i zmieniłem na inny który nie ma LPT. Musiałem kupić USBASP. Potem kupiłem analizator stanów logicznych aby sprawdzić czy mój program spełnia czasy. Przetestowałem na 1Mhz i czasy były zadowalające mnie ale moje radio już nie. Przetaktowałem na wewnętrzne 8Mhz i radio przyjmowało już moje rozkazy. Ponieważ mam tylko 6 przycisków na kierownicy musiałem wybrać 6 rozkazów. Padło na Vol+, Vol-, next, back, SRC, Ok i mute. Tak wiem, rozkazów wyszło 7 ale dlatego że mute uzyskałem poprzez wciśnięcie vol+ i vol-. Działa zacnie i jestem dumny :) . Interfejs działa po chamsku czyli zmasowanie któregoś z 6 pinów wysyła odpowiedni rozkaz, odczekuje 100ms (po tym czasie można wysłać dopiero kolejny) i wysyła następny jeżeli dany pin nadal jest zmasowany. Dlaczego nie ADC i pomiar napięcia na drabince rezystorowej ? Dlatego że nie ogarniam jeszcze ADC. Projekt jest w rozwoju tak jak będę się uczył programowania. Aktualnie emulator wygląda tak: http://obrazki.elektroda.pl/9066422800_1408901484_thumb.jpg http://obrazki.elektroda.pl/6593876000_1408901489_thumb.jpg Koszty: -programator = 15zł -płytka stykowa = 40zł -drobnica elektryczna = ~20zł -ATMega8 = 7zł suma = 82zł :D niby dużo ale wiedza bezcenna. W załączniku rybka dla ludzi niechcących nauczyć się programować :)

  • pilot.rar
    • pilot.hex
    • Array
    • pilot.lst
    • pilot.sym
    • pilot.o
    • pilot.c
    • Makefile
    • pilot.map
    • pilot.lss
    • pilot.elf
    • pilot.eep


Pobierz plik - link do postu

pilot.rar > pilot.c

/* " led.c " - programik do testowania œrodowiska WinAVR */
/* uk?ad ATmega 1MHz */
/* PB0,PB1 - diody LED; PD0 - przycisk */

#define F_CPU 8000000L
#include & lt; avr/io.h & gt;
#include & lt; util/delay.h & gt;

int main(void)
{
DDRC = 0x00;
PORTC = 0xff;

DDRB = 0x01;
PORTB = 0x01;

while (1)
{
if(PINC & 0xFF)
{
PORTB = 0x01;
_delay_ms(100);
}

while(!(PINC & 0x03))
{
_delay_ms(100);
PORTB = 0x00;
_delay_ms(5);
PORTB = 0x01;
_delay_ms(5);
PORTB = 0x00;
_delay_us(660);
PORTB = 0x01;
}

if(!(PINC & 0x01))
{
_delay_ms(80);
PORTB = 0x00;
_delay_us(2600);
PORTB = 0x01;
_delay_us(2600);
PORTB = 0x00;
_delay_us(660);
}


if(!(PINC & 0x02))
{
_delay_ms(80);
PORTB = 0x00;
_delay_us(3200);
PORTB = 0x01;
_delay_us(3200);
PORTB = 0x00;
_delay_us(660);

}

if(!(PINC & 0x04))
{
_delay_ms(80);
PORTB = 0x00;
_delay_us(3800);
PORTB = 0x01;
_delay_us(3800);
PORTB = 0x00;
_delay_us(660);
}

if(!(PINC & 0x08))
{
_delay_ms(80);
PORTB = 0x00;
_delay_us(4400);
PORTB = 0x01;
_delay_us(4400);
PORTB = 0x00;
_delay_us(660);
}

if(!(PINC & 0x10))
{
_delay_ms(80);
PORTB = 0x00;
_delay_us(6800);
PORTB = 0x01;
_delay_us(6800);
PORTB = 0x00;
_delay_us(660);
}

if(!(PINC & 0x20))
{
_delay_ms(80);
PORTB = 0x00;
_delay_us(7400);
PORTB = 0x01;
_delay_us(7400);
PORTB = 0x00;
_delay_us(660);
}




}
}