Printbin w Bascom AVR

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!
ODPOWIEDZ
slawek55
Użytkownik
Posty: 475
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Printbin w Bascom AVR

Post autor: slawek55 » 27 lis 2010, 17:17

Powiedzcie mi jaka jest składnia instrukcji Prinbin w Bascom AVR.

W pliku pomocy jest napisane ze z instrukcją Printbin możliwe jest użycie tylko zmiennej.
Ja wpisałem Printbin &H01 ; &B10011111 ; &H81 ; &H04 i w symulacji wychodzi ze działa.

I nie wiem czy jest to poprawne? Jesli tak to dlaczego w helpie jest tak opisane?

Spotkał się ktoś z Was z tym?

Awatar użytkownika
Pikczu
Użytkownik
Posty: 754
Rejestracja: 18 lip 2005, 18:33
Lokalizacja: Dublin
Kontakt:

Post autor: Pikczu » 27 lis 2010, 20:41

To źle czytasz:
"Multiple variables may be sent. They must be separated by the ; sign."
Wsumie najlepiej sprawuje się przy wysyłaniu zmiennych tablicowych


"The number of bytes to send can be specified by an additional numeric parameter. This is convenient when sending the content of an array."

"Printbin ar(1) ; 3 ' will send 3 bytes from array ar()."
-Printbin ar(1);3' wysle 3 byte z tablicy ar()-

"Printbin ar(1) ; 2 ; ar(2) ; 4 ' will send 2 bytes from array ar() starting at index 1, then 4 "
-Printbin ar(1) ; 2 ; ar(2) ; 4 'wyśle 2 byte z tablicy ar() zaczynając od indexu 1 potem 4
"bytes from array ar() starting at index 4."(moim zdaniem 2 )
-byty z tablicy ar() zaczynając na index 4 (moim zdaniem tu jest błąd w helpie bo wyśle 4 byte zaczynając od indexu 2 )
|When you use Printbin ar(1) , the whole array will be printed."

"When you need to print the content of a big array(array with more then 255 elements) you need to use the CONFIG PRINTBIN option."

slawek55
Użytkownik
Posty: 475
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Post autor: slawek55 » 28 lis 2010, 16:11

Potrzebuję Waszej pomocy bo nie mam cierpliwości.
Coś jest nie tak i sam już nie wiem co?
Mam niby bardzo prosty kod:

Kod: Zaznacz cały

$regfile = "2313def.dat"
$crystal = 8000000
$baud = 9600
$hwstack = 32                                              
$swstack = 10                                              
$framesize = 40                                            

Config Rc5 = Pind.5
Config Pind.5 = Input

Dim Addres As Byte
Dim Command As Byte

Do

  Getrc5(addres , Command)

  If Addres <> 255 Then
   Command = Command And &B01111111

   Print Command
   addres=255
End If
Loop
Niby proste ale nie działa. Wygląda jakby wieszał się na funkcji Getrc5.
Próbowałem różnych kombinacji, tzn umieszczałem Printbin w różnch miejscach i jest tak że zanim dojdzie do getrc5 działa a po napotkaniu tej funkcji staje.
Doczytałem sie że getrc5 nie wstrzymuje programu, a jednak chyba tak.
Pilot jest na pewno w w tym standardzie

Awatar użytkownika
Pikczu
Użytkownik
Posty: 754
Rejestracja: 18 lip 2005, 18:33
Lokalizacja: Dublin
Kontakt:

Post autor: Pikczu » 28 lis 2010, 20:12

Brakuje Ci enable interrupts i end na końcu programu poza tym nie config pin tylko port.
i czy aby na pewno masz 2313 a nie czasem attiny2313.

Kod: Zaznacz cały

$regfile = "attiny2313.dat"
$Crystal=10000000
$hwstack=32
$swstack=8
$framesize=24
$baud = 9600
Enable Interrupts
Config Rc5 = Pind.5


Dim Addres As Byte
Dim Command As Byte
Wait 1
Print "dzialam"


Do

  Getrc5(addres , Command)

  If Addres = 0 Then
   Command = Command And &B01111111

   Print Addres ; "  " ; Command

End If
Loop
End
powinno działać ja nie mam jak sprawdzić bo nie mam odbiornika

slawek55
Użytkownik
Posty: 475
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Post autor: slawek55 » 29 lis 2010, 6:15

W międzyczasie dodałem Enable interrupts i tez nie działa.
W helpie jest Config pin.x=input/output jessli dotyczy jednego wyprowadzenia, a config port=input/output jeśli ma dotyczyć całego portu. Więc jest dobrze.
Powinno być $regfile = "2313def.dat" ponieważ nie mam Attiny tylko starszą wersję At90S2313.

A tak przy okazji, to czy nowa wersja Bascoma ma jakiś błąd? Zrobiłem próbę z prymitywnym programem, który wyświetla napis na LCD 2x16 z ukłdem Atmega8 i program nawet nie drgnie, choć się kompiluje poprawnie. Podłączenie lcd do uC jest na 100% prawidłowe bo nawet multimetrem sprawdzone.

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 29 lis 2010, 17:13

Może rozwiązaniem będzie odbieranie kodu RC5 w przerwaniu zewnętrznym INT0.Przy zastosowaniu odbioru RC5 w obsłudze zewnętrznego przerwania odbiór odbywa się w tle programu głównego.
Stosowny przykład znajduje się w książce: "Programowanie mikrokontrolerów AVR w języku BASCOM" autorstwa Pana Marcina Wiązani.

Co do obsługi wyświetlacza LCD i MEGA8 to jeżeli linia konfiguracyjna Config Lcd pokrywa się z fizycznym podłączeniem wyświetlacza do mikrokontrolera, a sterownik wyświetlacza jest kompatybilny z HD44780 i jest sprawny to raczej błąd może leżeć albo w skompilowaniu programu z dyrektywą $Sim lub nie odpowiednio ustawionym potencjometrze kontrastu wyświetlacza.

slawek55
Użytkownik
Posty: 475
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Post autor: slawek55 » 30 lis 2010, 7:46

Pisałem wczesniej że układ działa jak zaprogramuję go programem napisanym pod C, ale widac to był szczegół.

A teraz coś co mnie zaskoczyło.
Pisałem poprzednio że w programnie pisanym w Bascom układ jakby nie żył.
Dodałem prosta instrukcję Config portd=output i zadziałało. Tzn na wyświetlaczu ukazal sie napis. Aby było śmieszniej usunąłem ta instrukcję i układ.. dalej działa. mimo że elektronike nie dotknąłem palcem. Chodziło mi tez o to aby z samym układzie nie wprowadzac jakis zmian, tylko programowe.

Spróbowałem następnie z odbiornikiem i kodem RC5. Na początku dałem odbiór RC5 w pętli a nie w przerwaniu. Układ też nie zadziałał. Przypadniem w celu sprawdzenia czy odbiornik jest sprawny podłączyłem diodę LED do wyjścia odbiornika, i.. na LCD pojawiło sie to co powinno czyli adres i komenda z pilota. Odłaczyłem diodę LED i przestało dekodować. Podłaczyłem sam rezytsor pod odbiornik bo myślałem że musi byc jakos obciążony ale tez nie ruszył. Działa tylko z dioda LED. Diodę umieściłem tak aby jej światło nie wpływało na odbiornik bo myślałem o jakimś sprzężeniu.

Ma ktoś z Was jakis pomysł co jest grane? A... w przerwaniu w ogóle nie chce pracować w różnych kombinacjach.

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 30 lis 2010, 12:58

Rozumiem że LED został podłączony do wyjścia układu odbiornika przez rezystor ograniczający prąd płynący przez strukturę LED. Katodą do wyjścia czy anodą (LED+rezystor do plusa czy masy)?
Może trzeba podciągnąć programowo do plusa pin mikroprocesora skonfigurowany jako wejście sygnału z odbiornika? Zależy to od budowy układów wyjściowych odbiornika, jeżeli będzie to wyjście OC to podciąganie będzie konieczne.

[ Dodano: 2010-11-30, 13:28 ]
Czy na zasilaniu odbiornika RC5 jest zalecany filtr RC (rezystor szeregowy oraz elektrolit blokujący zasilanie)?

slawek55
Użytkownik
Posty: 475
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Post autor: slawek55 » 30 lis 2010, 13:52

Czy rezystro pierwszy czy LED w układzie szeregowym raczej chyba nie ma znaczenia. Oczywistm jest tez że skoro pracujemy przy prądze stałym to LED świeci tylko przy spolayzowaniu jej w kierunku przewodzenia. Ale odpowiadając na pytanie to rezystor był na +5V potem anoda diody a katoda na wyjście odbiornika.
Skoro nie napisałem to pewnie nie było jasne, więc tak były próby zarówno z podciągnięciem wejscia uC jak i bez, i bez skutku (troche nie po polsku).
Jest też filtr tak jak mówi nota katalogowa układu TFMS. Zresztą filtr jest taki jak w niejednej juz sprawdzonej kostrukcji z EdW, czyli 100omów +100uF.

Widac że jesteś trochę uszczypliwy, ale Ok i nie mam za złe bo nie sądziłem że można sie wyłozyć na tak prymitywnej rzeczy. (nieraz już pisałem sobie progamy z odbiornikiem i RC5 i jakos działały za pierwszym razem, a tu banał i kaput, więc postaraj się zrozumieć że pewne oczywiste sprawy są po prostu sprawdzone)

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 30 lis 2010, 16:23

Nie miałem zamiaru być uszczypliwy. Słowo pisane jest trochę inne niż konwersacja.
A moja dociekliwość wynika z chęci zmierżenia się problemem odbiornika RC5, ponieważ nie programowałem AVR pod to zastosowanie, choć trochę zaawansowanych programów w Bascomie AVR "popełniłem". Jeżeli taka konfiguracja odbiornik+mikroprocesor jest tak nie przewidywalna to sam kiedyś będę musiał przez to przejść. :smile: Jeżeli chodzi o LED to chodziło mi o to czy zaświeca się gdy na wyjściu odbiornika jest stan zbliżony do masy czy też stan bliski zasilaniu.

[ Dodano: 2010-11-30, 16:28 ]
Teraz wiem że LED się zaświecała gdy na wyjściu odbiornika była wystawiona masa.

[ Dodano: 2010-11-30, 18:24 ]
Przetestowałem taki oto kod:

Kod: Zaznacz cały

'$sim
$regfile = "M8def.dat"
$crystal = 8000000
$baud = 9600
Config Rc5 = Pind.7
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
'----------------------------------------------------------------------------------------
Dim Adress As Byte
Dim Command As Byte
'----------------------------------------------------------------------------------------
Enable Interrupts
Cls
Echo Off
Cursor Off
Print "IR_test_1v0"
Do
  Getrc5(adress , Command)
    If Adress = &H00 Then                                   '&hFF..&h00 zależnie od adresu
      Command = Command And &H7F
      Cls
      Lcd "Adr=&h" ; Hex(adress)
      Lowerline
      Lcd "Cmd=&h" ; Hex(command)
      Print "Adress=&h" ; Hex(adress) ; " Command=&h" ; Hex(command)
      Print "Printbin Adress=" ;
      Printbin Adress
      Print                                                 '&h0A+&h0D
      Print "Printbin Command=" ;
      Printbin Command
      Print                                                 '&h0A+&h0D
    End If
'do odkomentowania w celu poznania adresu nadawanego
'    Cls
'    Lcd "Adr=&h" ; Hex(adress)
'    Lowerline
'    Lcd "Cmd=&h" ; Hex(command)
'    Print "Adress=&h" ; Hex(adress) ; " Command=&h" ; Hex(command)
'    Print "Printbin Adress=" ;
'    Printbin Adress
'    Print                                                   '&h0A+&h0D
'    Print "Printbin Command=" ;
'    Printbin Command
'    Print                                                   '&h0A+&h0D
Loop
End
'----------------------------------------------------------------------------------------
Program działa co obrazuje poniższy zrzut okna aplikacji terminalu.
Na wyświetlaczu LCD również poprawnie wyświetla odebrane zmienne.
Może pin procesora jest uszkodzony a może odbiornik?
Załączniki
term_rc5.gif
(39.01 KiB) Pobrany 378 razy

slawek55
Użytkownik
Posty: 475
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Post autor: slawek55 » 30 lis 2010, 19:13

Wydaje mi się że znalazłem problem choć nie do końca.
Ten sam program (który jest wyżej) skompilowałem w starszej wersji u kolegi. On ma 1.11.9.0 czy jakoś tak i przy tych samych ustawieniach poszło od razu, a to samo kompilując na najnowszej nie rusza.
Najbardziej dziwi mnie ze nie mogę się doszukać w opisach zmian niczego na temat obsługi LCD i RC5 i czy w nowych wersjach coś zostało "popsute"

Ciekawe co z tym teraz zrobić? Nie mam już poprzedniej wersji i nie wiem czy można się cofnąć do poprzedniej.

Martwi mnie tylko to co pisałem o wyświetlaczu LCD.

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 30 lis 2010, 22:39

Może aktualizować do nowszej wersji jak jest, a jak nie to zgłosić "buga" i pewnie poprawią w MCS.

ODPOWIEDZ