Attiny2313 i komunikacja z komputerem

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
zamaskowany
-
Posty: 3
Rejestracja: 10 wrz 2010, 11:28
Lokalizacja: Warszawa

Attiny2313 i komunikacja z komputerem

Post autor: zamaskowany » 10 wrz 2010, 11:43

Dzień dobry,
jestem początkujący w dziedzinie mikrokontrolerów. Kupiłem zestaw dla początkujących w skład którego wchodzi płytka i książka P. Góreckiego "Mikrokontrolery dla początkujących". Pierwszy problem nie do przebrnięcia to komunikacja z komputerem.

Mikrokontroler jest podłączony do 9ciopinowego złącza komputera trzema przewodami Txd, Rxd i Gnd. Wydaje mi się że jest poprawnie ponieważ "coś" się wysyła. Program jest najprostszy z możliwych ( taki jak w podręczniku)

Kod: Zaznacz cały

Dim B As Byte
Cls
LCD " Napisy"
Lowerline
Do
 B=Inkey()
 If B>0 Then
  Print Chr(B)
  Lcd Chr(B)
 End if
Loop Until B=5
Cls
End
Sytuacja wygląda następująco. Do mikrokontrolera docierają nie te znaki co potrzeba. Tzn wysyłając k otrzymuję j itd. ale cały czas powtarzalnie. Do komputera docierają tylko niektóre. Gdy zostawiłem uC podłączony na jakiś czas zauważyłem, że co jakiś czas komputer odbiera jakieś znaki.

Na różnych forach czytałem, że może to wina źle ustawionych fuse bitów, złego źródła taktowania ale boję się samemu coś zmieniać bo można zblokować kontroler. Z góry dziękuję za pomoc.

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

Post autor: Pikczu » 10 wrz 2010, 14:05

Wygląda na to że masz źle ustawiony baud rate czyli prędkość transmisji.
Dodaj do swojego kodu te trzy linie:

Kod: Zaznacz cały

$regfile = "attiny2313.dat"

$crystal = 4000000                                          'nieiwiem jaki masz wieæ zmien na odpowiedni

$baud = 9600                                                'to jets predkosc transmisji musi byc taka sama w terminalu



Dim B As Byte
Cls
LCD " Napisy"
Lowerline
Do
 B=Inkey()
 If B>0 Then
  Print Chr(B)
  Lcd Chr(B)
 End if
Loop Until B=5
Cls
End
Teraz w oknie terminala
Obrazek
Ostatnio zmieniony 12 wrz 2010, 15:31 przez Pikczu, łącznie zmieniany 1 raz.

zamaskowany
-
Posty: 3
Rejestracja: 10 wrz 2010, 11:28
Lokalizacja: Warszawa

Post autor: zamaskowany » 10 wrz 2010, 15:13

Baud jest ustawiony w kompilatorze i emulatorze na 2400 dla kontrolera i PC. Jak będę na miejscu to sprawdzę czy wpisanie

Kod: Zaznacz cały

$regfile = "attiny2313def.dat"

$crystal = 4000000
w czymś pomoże. Jak poznam wyniki to napiszę jeszcze co i jak.[/code]

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

Post autor: c4v2 » 11 wrz 2010, 7:44

Jeżeli w programie jest dyrektywa "$baud=2400" oraz ustawienia terminala w PC odpowiadają tej prędkości, to warto jeszcze sprawdzić ustawienia dotyczące ilości bitów danych, kontroli parzystości oraz stopu. Poprawne ustawienia to osiem bitów danych,
brak bitu kontroli parzystości i jeden bit stopu (8n1).
Fabryczne ustawienia bitów konfiguracyjnych powodują że mikrokontroler pracuje na wewnętrznym generatorze RC. Do transmisji szeregowej Rs232 wymagane jest aby mikroprocesor był taktowany z zewnętrznego rezonatora kwarcowego. Wymaga to jednak ingerencji w ustawienia fuse-bitów...

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

Post autor: Pikczu » 11 wrz 2010, 8:49

To jest następny krok, zresztą sam pisał że ich nie zmieniał. teraz potrzebujemy paru info od ciebie jaki to jest dokładnie procek czy to attiny2313?? i czy chcesz używać zewnętrznego kwarcu??

zamaskowany
-
Posty: 3
Rejestracja: 10 wrz 2010, 11:28
Lokalizacja: Warszawa

Post autor: zamaskowany » 11 wrz 2010, 16:12

Procesor Attiny2313 na płytce o następującym schemacie:

Obrazek

Między X1 a X2 jest wpięty rezonator 4 MHz. Domyślnie ten czy jakiś inny podaje sygnał taktujący? Czy to konieczna zmiana, żeby wymieniać się inf. z komputerem przez RS232?

Ustawienia transferu bit parzystości, stopu, prędkość ustawione odpowiednio.

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 11 wrz 2010, 17:24

A mnie ten schemat przypomina kit AVT gdzie oryginalnie był 90S2313 a nie ATTiny2313, Mimo że procesory podobne, to jednak się różnią od siebie, i pewnie dla tego twoje problemy. To że poustawiasz sobie w Bascom wszystko tak jak ma być to trochę za mało, bo w przypadku ATTiny2313 musisz je jeszcze zmusić do pracy z tym 4MHz zegarem na płytce przestawiając odpowiednio Fusy, inaczej będzie ci on pracował z wewnętrznym zegarem RC, który taktuje go jak dobrze pamiętam 1MHz.
Albo jak boisz się ruszać fusy to w Bascom przestaw sobie przed kompilacją zegar z 4MHz na 1MHz i powinno ruszyć.
O tak

Kod: Zaznacz cały

$regfile = "attiny2313def.dat"
$crystal = 1000000
No i pamiętaj aby nie kompilować programu który ma w sobie dyrektywę $SIM, bo taki na pewno się wysypie po wgraniu do CPU.

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

Post autor: Pikczu » 12 wrz 2010, 15:29

Ustawiłem dla ciebie fusy na 8 mhz wewnętrzny, bez podziału przez 8.
To jest ta pierwsza linia kodu nic w niej nie zmieniaj.

Kod: Zaznacz cały

$prog &HFF , &HE4 , &HD9 , &H00                             ' generated. Take care that the chip supports all fuse bytes.
$regfile = "attiny2313.dat"

$crystal = 8000000                                          '8Mhz

$baud = 9600

Config Lcd = 16 * 2

Dim B As Byte
Cls
Lcd " Napisy"
Lowerline
Do
 B = Inkey()
 If B > 0 Then
  Print Chr(b)
  Lcd Chr(b)
 End If
Loop Until B = 5
Cls
End

Awatar użytkownika
GrzesiekG
Użytkownik
Posty: 160
Rejestracja: 11 sie 2006, 8:06
Lokalizacja: Annopol
Kontakt:

Post autor: GrzesiekG » 12 wrz 2010, 17:54

Witam serdzecznie!
Koledzy, jeżeli procek jest "ze sklepu" (tj. nie odkupowane od kogoś, ktoby majstrował przy fusach) to domyślne jest ustawienie na zewnętrzny sygnał taktujący.

@zamaskowany:

W tej książce na str 261 masz pokazane okienko z konfiguracją komunikacji. Frequency to właśnie kwarc, który masz (w Hz). Baud ustaw jakie chcesz, byle błąd był <1%

Jeżeli "coś" dostajesz to problem jest raczej na pewno w prędkości transferu lub ramce transmisyjnej (czy jest ustawiona na 8 (bitów danych),n(no parity),1(1 stop bit)).
PZDR
GrzesiekG

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

Post autor: Pikczu » 12 wrz 2010, 20:03

Niestety kolego GrzesiekG, standardowo ze "sklepu" jest ustawiony na 1MHz a dokładnie 8Mhz wewnętrzny RC i podzielony przez 8.
Wystarczy ze użyje kodu z mojego postu wyżej i będzie ok.

Awatar użytkownika
GrzesiekG
Użytkownik
Posty: 160
Rejestracja: 11 sie 2006, 8:06
Lokalizacja: Annopol
Kontakt:

Post autor: GrzesiekG » 13 wrz 2010, 10:46

@Pikczu:

Ok. Mój widocznie był jakiś inny... :razz:

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

Post autor: Pikczu » 13 wrz 2010, 14:18

zamaskowany, rozwiązałeś już problem ?

ODPOWIEDZ