ATmega8 UART

Rasprava o AVR mikrokontrolerima, AVR projekti i drugo vezano za AVR...

Moderators: pedja089, stojke369, trax, InTheStillOfTheNight

Post Reply
User avatar
shiki
Posts: 15
Joined: 24-03-2011, 19:33
Location: Hrvatska

ATmega8 UART

Post by shiki »

Pozdrav ljudi,

pokusavam povezati 2 ATmega8 preko UART-a. Komunikacija je jednosmerna, pa jedan uC koristim kao odasiljacki, a drugi kao prijemni. Naravno, naletio sam na problem... Ocekivao sam signal iz Tx UART-a kao sto je opisan na linku:

http://www.atmel.com/Images/doc0941.pdf

dakle, start bit, oktet, stop bit, ali uz start bit i oktet koji saljem uvijek se pojavi sekvenca koja mi nije jasna... Slika signala je u privitku...
Zanima me sto je uopce ta sekvena, zasto se javlja i kako da je uklonim.

Evo i kodovi za Tx i Rx uC (Bascom AVR):
Tx:

Code: Select all

   $regfile = "m8def.dat"
   $crystal = 8000000
   $baud = 9200

   Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
   Config Pind.2 = Input
   Config Pind.1 = Output

   On Int0 Posalji_znak
   Config Int0 = Falling
   Enable Int0
   Enable Interrupts

   Do
   Loop

   Posalji_znak:
      Print "m"
   Return
Rx:

Code: Select all

   $regfile = "m8def.dat"
   $crystal = 8000000
   $baud = 9200

   Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
   Config Pind.0 = Input
   Config Pinb.0 = Output

   Dim Broj As Byte

   On Urxc Primljen_znak
   Enable Urxc
   Enable Interrupts

   Do
   Loop

   Primljen_znak:
      Broj = Inkey()
      Portb = Broj
   Return
Ovdje je primjer za slanje ASCII znaka "m", ali ta sekvenca je ista prilikom slanja bilo kojeg drugog znaka.

Ocekivao sam da ce LED spejena na PORTB.0 Rx uC-a zasvijetliti ako je poslan znak ciji je LSB 1, ali bez obzira koji znak saljem nema nikakvog ucinka.

Svaka pomoc dobro bi dosla! :D

Pozdrav,
Shiki
Attachments
UART sekvenca
UART sekvenca
UART.png (8.11 KiB) Viewed 3912 times
User avatar
shiki
Posts: 15
Joined: 24-03-2011, 19:33
Location: Hrvatska

Re: ATmega8 UART

Post by shiki »

Evo, skuzio sam ste je upitna sekvenca...
UART je konfiguriran tako da slanjem svakog znaka posalje zapravo 3 znaka:
- zeljeni znak
- ASCII CR (Carriage return)
- ASCII LF (Line Feed)

Ne znam da li se to iskljuciti, ali sada je vec lakse razmisljati. :D
User avatar
shiki
Posts: 15
Joined: 24-03-2011, 19:33
Location: Hrvatska

Re: ATmega8 UART

Post by shiki »

Na kraju sam ipak uspio...
Evo, saljem kodove i objasnjenja, ako se netko susretne sa slicnim problemom da zna sto mu je ciniti.

Tx uC je konfiguriran da preko UART-a salje 1 ako je PINB.0 = 1, a 0 ako je PINB.0=0.
Ovaj broj bit ce poslan u prvom oktetu iza kojeg slijede jos 2 okteta (redom CR i LF).
E da, vidljivo je iz koda, ali znakovi se salju u prekidnoj rutini INT0 prekida koji je aktivan na padajuci brid.
Kod za Tx izgleda ovako:

Code: Select all

   $regfile = "m8def.dat"
   $crystal = 8000000
   $baud = 9200

   Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
   Config Pind.2 = Input
   Config Pind.1 = Output
   Config Portb.0 = Input

   On Int0 Posalji_znak
   Config Int0 = Falling
   Enable Int0
   Enable Interrupts

   Dim Pin As Byte

   Do
   Loop

   Posalji_znak:
      Pin = Pinb.0
      Print Chr(pin)
   Return
Rx uC prima oktete od Tx uC-a. Ako je primio 1, postavit ce PORTB.0=1, a ako je primio 0 postavit ce PORTB.0=0. Znakovi CR i LF se u potpunosti ignoriraju i uzrokuju povratak iz prekidne rutine.
Evo i koda za Rx:

Code: Select all

   $regfile = "m8def.dat"
   $crystal = 8000000
   $baud = 9200

   Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
   Config Pind.0 = Input
   Config Pinb.0 = Output

   Dim Broj As Byte
   Dim Count As Byte

   On Urxc Primljen_znak
   Enable Urxc
   Enable Interrupts

   Do
   Loop

   Primljen_znak:
      Broj = Inkey()
      If Broj = 1 Then
         Portb.0 = 1
      Elseif Broj = 0 Then
         Portb.0 = 0
      Else
         Return
      End If
   Return
Programi su ultra jednostavni tako da mislim da ce koristiti svakom tko se krece baviti s UART-ima.

Pozdrav,
Shiki
User avatar
shiki
Posts: 15
Joined: 24-03-2011, 19:33
Location: Hrvatska

Re: ATmega8 UART

Post by shiki »

... i za kraj...

Kako bi se onemogucilo slanje CR i LF znaka nakon slanja zeljenog znaka, potrebno je na kraju naredbe print dodati znak ';' :

Code: Select all


   Posalji_znak:
      Pin = Pinb.0
      Print Chr(pin);
   Return

Pozdrav,
Shiki
User avatar
niho
Pravi forumaš
Pravi forumaš
Posts: 1895
Joined: 24-09-2009, 17:26
Location: Brcko, Bosnia and Herzegovina

Re: ATmega8 UART

Post by niho »

TO si dobro primijetio, mada se to uči u osnovnoj školi (nadam se da si na časovima informatike radio programiranje u Qbasicu. tamo se kaže da svaka nova naredba print ispisuje izraz u novom redu ( pa prema tome dodaje automatski cr i lf). Ako želiš ostati u istom redu koristi specijalne znake ";" i ",". Znak ";" omogućava nastavak pisanja na istom mjestu gdje si stao (znači bez ičega) a "," nastavlja u istom redu ali dodaje znak za tabulaciju.
Poz.
User avatar
shiki
Posts: 15
Joined: 24-03-2011, 19:33
Location: Hrvatska

Re: ATmega8 UART

Post by shiki »

Pozdrav Niho!

Nisam nikad radio u Qbasicu. Isao sam vise iz zabave povezati 2 ATmega8 pa me slanje 3 znaka umjesto 1 na trenutak zbunilo. Nisam znao da se naredbom Print automatski ispisuju 3 znaka. Naravno da tu nema neke velike mudrosti (jasno je cemu dodatni znakovi sluze u komunikaciji s terminalom), mislim da sam vec sve opisao u ova 3-4 posta. Ali eto, ako netko, tko se tek pocinje baviti serijskom komunikacijom, naleti na slicno pitanje, ovdje moze pronaci odgovor.
Tome bi i trebao sluziti ovaj forum, zar ne? :wink: :D

Pozdrav,
Shiki
User avatar
niho
Pravi forumaš
Pravi forumaš
Posts: 1895
Joined: 24-09-2009, 17:26
Location: Brcko, Bosnia and Herzegovina

Re: ATmega8 UART

Post by niho »

Pa naravno, sve je u svrhu razmjene znanja i iskustava. Nikada ni jedan post nisam, niti bih, napisao da iz bilo kakve zle namjere ili poruge. Pozdrav, samo naprijed. :)
Post Reply