Problemy z nadawaniem podczerwieni w Attiny26

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
Jasam
Użytkownik
Posty: 422
Rejestracja: 27 mar 2007, 21:09

Problemy z nadawaniem podczerwieni w Attiny26

Post autor: Jasam » 14 sty 2008, 18:32

Chciałem zbudować nadajnik kodu rc5 (odbiornik już dawno śmiga) na procesorze attiny26. Niestety w pomocy do Bascoma wszystko jest opisane na przykładzie procesora attiny2313. Instrukcja rc5send której chcę użyć według noty jako wyjście wykorzystuje końcówkę oc1A. Pisze tamn też aby zlokalizować ją w odniesieniu do odpowiedniego mikroprocesora. Tak też zrobiłem. Diodę nadawczą ired podłączyłem (poprzez tranzystor oczywiście) do końcówki pb1 attiny26 (ponieważ własnie w tym procesorze na tej końcówce wystepuje oc1a). I tu jest mój kłopot. Przy kompilacji programu wystąpił błąd: Error 46 Assingment error [COMPARE1A:0 55:112]. Nie wiem co to znaczy. Przy kompi9lacji tego samego programu dla attiny2313 nie występują żadne problemy.

Kod: Zaznacz cały

$regfile = "attiny26.dat"
$crystal = 4000000

Dim Togbit As Byte , Command As Byte , Address As Byte
Command = 12
Togbit = 0
Address = 0

Do

  Waitms 500
  Rc5send Togbit , Address , Command
Loop
proszę o pomoc....
Ostatnio zmieniony 14 sty 2008, 18:43 przez Jasam, łącznie zmieniany 1 raz.

ZbeeGin

Post autor: ZbeeGin » 14 sty 2008, 18:41

Jasam pisze:Przy kompilacji programu wystąpił błąd: Error 46 Assingment error [COMPARE1A:0 55:112]. Nie wiem co to znaczy.
Po prostu w definicji specjalnych zmiennych w kompilatorze dla procesora ATTiny26 nie ma zdefiniowanej specjalnej zmiennej typu Word: COMPARE1A (czyli odniesienia do rejestrów OCR1AH+OCR1AL w 2313). I trudno będzie taką definicję zbudować "na zewnątrz".

Jasam
Użytkownik
Posty: 422
Rejestracja: 27 mar 2007, 21:09

Post autor: Jasam » 14 sty 2008, 18:50

Proszę jednak o radę jak to zrobić. Bardzo zależy mi na wykorzystaniu w tym projekcie tego procesora.

[ Dodano: 2008-01-14, 18:55 ]
Nie można czegoś po prostu dopisać do tego pliku konfiguracyjnego od attiny26?

[ Dodano: 2008-01-14, 19:00 ]
Jestem otwarty na wszelkie pomysły. Naprawde to powinien być akurat ten procesor.

ZbeeGin

Post autor: ZbeeGin » 14 sty 2008, 19:01

Niestety nie jest to fizycznie możliwe. Na przeszkodzie stoi sprzęt. Licznik TIMER1 układów Classic (90s2313 i jego następcy Tiny2313) to 16-to bitowy licznik z 16-to bitowymi rejestrami porównania. Zaś licznik TIMER1 w układzie Tiny26 jest tylko 8-bitowy.

Nawet zdefiniowanie zmiennej COMPARE1A jako:

Kod: Zaznacz cały

Dim COMPARE1A As Byte At &H4D 
w niczym nie pomoże, gdyż nazwa ta jest zastrzeżona. Zatem użycie RC5SEND jest niemożliwe w tym procesorze.

Musiałbyś poszukać kodu, który całkowicie zastąpi to polecenie.

Jasam
Użytkownik
Posty: 422
Rejestracja: 27 mar 2007, 21:09

Post autor: Jasam » 14 sty 2008, 19:06

Więc może ktoś wie jak napisać coś podobnego do tej funkcji? naprawdę jest mi to potrzebne a na chwilę teraźniejszą nie wiem jak się do tego zabrać. Pomocy...

[ Dodano: 2008-01-15, 11:31 ]
naprawdę nikt z was nie potrafi mi pomoc?

Znowuja
-
Posty: 4
Rejestracja: 17 gru 2007, 19:18
Lokalizacja: Stąd

Post autor: Znowuja » 15 sty 2008, 19:14

Na pewno się znajdzie ktos kto pomoże.

ZbeeGin

Post autor: ZbeeGin » 15 sty 2008, 19:33

Poczytaj tą notę aplikacyjną: http://www.mcselec.com/index.php?option ... &Itemid=57
Tam jest wsztstko "na piechotę" z wykorzystaniem licznika TIMER1.

Jasam
Użytkownik
Posty: 422
Rejestracja: 27 mar 2007, 21:09

Post autor: Jasam » 15 sty 2008, 19:53

Ale jak przerobić ten pierwszy listing żeby działał z licznikiem 8-bitowym...Sam sobie nie poradzę...

ZbeeGin

Post autor: ZbeeGin » 15 sty 2008, 20:04

Postaraj się przeanalizować ten program jak działa dokładnie, co ustawia, co zeruje. Przelicz wartości wg danych opisujących licznik (są pewne wzory w danych katalogowych) i gotowe.

Jasam
Użytkownik
Posty: 422
Rejestracja: 27 mar 2007, 21:09

Post autor: Jasam » 15 sty 2008, 20:10

Proszę o dalsze i dokładniejsze wskazówki. Na pewno nie tylko mnie się one przydadzą. ZbeeGin jesli wiesz dokładnie jak to zrobić to powiedz mi proszę.

[ Dodano: 2008-01-15, 20:13 ]
Chodzi mi tylko o coś w stylu procedury. Że podam jej wartośc adresu i komendy i ona to wysle w rc5... Ta obsługa przycisków (która tam jest i jest niezrozumiała dla mnie) nie jest mi potrzebna.

ZbeeGin

Post autor: ZbeeGin » 16 sty 2008, 21:04

Sama procedura będzie mniej więcej wyglądać tak:

Kod: Zaznacz cały

'- procedury RC5
Sub Sentrc5(byval Rc5_address As Byte , Byval Rc5_command As Byte , Byval Rc5_togglebit As Byte)
  Local Rc5_bit_nr As Byte
'---[ transmit Address and Command as 14 bit RC-5 code ]------------------------
  Ddrb.1 = 1 'set OC1 (Pb.1) = IR carrier output
  Logic_1 'first start bit
  Logic_1 'second start bit
  If Rc5_ToggleBit = 0 Then Logic_0 Else Logic_1 'toggle bit

  For Rc5_bit_nr = 4 To 0 STEP -1 '5 bit address, msb first
    If Rc5_address.rc5_bit_nr = 0 Then Logic_0 Else Logic_1
  Next

  For Rc5_bit_nr = 5 To 0 STEP -1 '6 bit command, msb first
    If Rc5_command.rc5_bit_nr = 0 Then Logic_0 Else Logic_1
  Next

  Tccr1a = Carrier_off
  Waitms 87 'frame gap delay
End Sub
Ostatnio zmieniony 16 sty 2008, 21:38 przez ZbeeGin, łącznie zmieniany 1 raz.

Jasam
Użytkownik
Posty: 422
Rejestracja: 27 mar 2007, 21:09

Post autor: Jasam » 16 sty 2008, 21:12

A reszta? Ustawienia liczników i komparatora?

[ Dodano: 2008-01-16, 21:14 ]
Proszę o przykład zastosowania tej procedury.

ZbeeGin

Post autor: ZbeeGin » 16 sty 2008, 21:43

A reszta? Ustawienia liczników i komparatora?
Proszę o przykład zastosowania tej procedury.
Tak trudno przejrzeć helpa, dane katalogowe Tiny26L i ruszyć szarymi komórkami. Nic nie potraficie już sami zrobić? :twisted:

Jasam
Użytkownik
Posty: 422
Rejestracja: 27 mar 2007, 21:09

Post autor: Jasam » 16 sty 2008, 21:49

Może coś potrafię. Ale akurat tego ugryźć za nic nie potrafię. Siedzę nad tym godzinami i do niczego nie mogę dojść. Gdybym potrafił, albo widział jakiś choćby początek to bym nie przeszkadzał nikomu tymi pytaniami.

ZbeeGin

Post autor: ZbeeGin » 16 sty 2008, 22:19

Kod: Zaznacz cały

$regfile = "attiny26.dat"
$crystal = 8000000
$hwstack = 32                                               'default use 32 for the hardware stack
$swstack = 10                                               'default use 10 for the SW stack
$framesize = 40                                             'default use 40 for the frame space

'liczby skracające licznika Timer1 dla generacji sygnału 36KHz
#if _xtal = 4000000
 Const T_oc1 = 55                                           'wartosć dla 4MHz
#endif
#if _xtal = 8000000
 Const T_oc1 = 110                                          'wartość dla 8MHz
#endif
#if _xtal = 10000000
 Const T_oc1 = 138                                          'wartość dla 10MHz
#endif
Const Carrier_on = &B01000000                               'włączona nośna IR 36kHz
Const Carrier_off = &B11000000                              'wyłączona nośna IR 36kHz


Config Timer1 = Timer , Prescale = 1 , Compare A = Toggle , Clear Timer = 1       'licznik jako generator sygnału prostąkątnego
Timer1 = 0                                                  'zeruj licznik
Ocr1a = T_oc1                                               'załaduj rejestr porównawczy
Tccr1a = Carrier_off                                        'wyłącz nośną


Declare Sub Sentrc5(byval Rc5_address As Byte , Byval Rc5_command As Byte , Byval Rc5_togglebit As Byte)
Declare Sub Logic_0
Declare Sub Logic_1


' - ( program główny ) - - - - - - - - - - - - - - - - - - -
Do
  Sentrc5 0 , 12 , 0                                        'wysyła komendę o nr.12 do urządzenia o adresie 0 (TV) bez sterowania ToggleBit
  Wait 1
  Sentrc5 0 , 0 , 0
  Wait 1
Loop



' - ( procedury RC5 ) - - - - - - - - - - - - - - - - - - - -

Sub Sentrc5(byval Rc5_address As Byte , Byval Rc5_command As Byte , Byval Rc5_togglebit As Byte)
'-[ transmituje Address oraz Command jako 14 bitowy kod RC-5 ]-
  Local Rc5_bit_nr As Byte
  Ddrb.1 = 1                                                'ustaw OC1 (Pb.1) jako wyjście IR
  Logic_1                                                   'pierwszy bit start
  Logic_1                                                   'drugi bit start
  If Rc5_togglebit = 0 Then Logic_0 Else Logic_1            'sterowanie ToggleBit
  For Rc5_bit_nr = 4 To 0 Step -1                           '5 bitów adresu, msb najpierw
    If Rc5_address.rc5_bit_nr = 0 Then Logic_0 Else Logic_1
  Next
  For Rc5_bit_nr = 5 To 0 Step -1                           '6 bitów rozkazu, msb najpierw
    If Rc5_command.rc5_bit_nr = 0 Then Logic_0 Else Logic_1
  Next
  Tccr1a = Carrier_off
  Waitms 87                                                 'wyagana przerwa pomiędzy ramkami
End Sub

Sub Logic_0
 Tccr1a = Carrier_on
 Waitus 883
 Tccr1a = Carrier_off
 Waitus 884
End Sub

Sub Logic_1
 Tccr1a = Carrier_off
 Waitus 883
 Tccr1a = Carrier_on
 Waitus 884
End Sub
Niestety dalej radzisz sobie sam. Nie sprawdzałem czy działa w realu.

ODPOWIEDZ