Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

UART s přerušením atmega8

 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
DavidChlup



Založen: Sep 03, 2019
Příspěvky: 69
Bydliště: Karlovy Vary

PříspěvekZaslal: ne květen 03 2020, 9:28    Předmět: UART s přerušením atmega8 Citovat

Ahoj,

už nevím kudy kam, mám tu úplně triviální program pro příjem po UARTu a někde mám něco blbě.

Když mám verzi bez přerušení a volání rutiny pro výpis z UDR do registru provozuji v hlavní smyčce, vše funguje. Vlastně to čte UDR pořád za běhu programu hlavní smyčky.

ALE jak to udělám systémem přerušení, tj že při příjmu Rx vyvolám přerušení, které mě odkáže na výčet UDR do registru a zpět do hlavní smyčky, tak mi to přečte data jen jednou a při dalším příjmu dat to absolutně nic nedělá. Jako by se mi UDR nevyprázdnilo a tak nepřijme další hodnoty.

Už nevím co a jak, tak prosím o radu. Ti, co mne chtějí odkázat na datasheet, tak z toho jsem to prostě nepochopil, nejsem znalec AJ a google překladač to jako vždy kazí.

kód:

.NOLIST
.INCLUDE "m8def.inc"
.LIST




.def   reg=R16
.def   reg2=r17

.EQU DATAIND=DDRD
.EQU LEDD=DDRC

.EQU DATAIN=PORTD   ;RX DATA
.EQU LED=PORTC      ;PC0-PC4 LED


.cseg
.org $0              

      rjmp ini
.org $00b
      rjmp USART_Receive


Ini:   ldi reg, 0b00000000
      out DATAIND, REG

      ldi reg, 0b11111111
      out LEDD, reg
      out LED, reg

      ldi reg, 0b00000000
      out DATAIN, REG

       ldi reg,LOW(RAMEND)
      out SPL,reg
      ldi reg,HIGH(RAMEND)
      out SPH,reg


; Set baud rate
      ldi reg, 51
      ldi reg2, 0
      out UBRRH, reg2
      out UBRRL, reg

; Enable receiver and transmitter
      ldi reg, (1<<RXEN)|(1<<RXCIE)
      out UCSRB, reg

; Set frame format: 8data, 1stop bit
      ldi reg, (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)
      out UCSRC, reg

      ldi reg, 0b00000000
      out led, reg
      rcall time2s
      ldi reg, 0b11111111
      out led, reg
      sei

;----------------- Vektory přerušení ----------------------





START:

      out led, reg

      rjmp start


USART_Receive:
      
               
      sbis UCSRA, RXC
      rjmp USART_Receive
                  
      in reg, UDR
      rjmp start





time2s:
; =============================
;    delay loop generator
;     16000000 cycles:
; -----------------------------
; delaying 15999993 cycles:
          ldi  R20, $53
WGLOOP0:  ldi  R21, $FB
WGLOOP1:  ldi  R22, $FF
WGLOOP2:  dec  R22
          brne WGLOOP2
          dec  R21
          brne WGLOOP1
          dec  R20
          brne WGLOOP0
; -----------------------------
; delaying 6 cycles:
          ldi  R20, $02
WGLOOP3:  dec  R20
          brne WGLOOP3
; -----------------------------
; delaying 1 cycle:
          nop
; =============================
ret
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zmije



Založen: Jun 30, 2005
Příspěvky: 1569
Bydliště: Pardubický kraj

PříspěvekZaslal: ne květen 03 2020, 10:36    Předmět: Citovat

Jak tak na to koukám, zatím si nepochopil princip přerušení. Na tvém místě bych si dopřát trošek luxusu, který nabízí jazyk C. Amega je na to uzpůsobená, najdeš na to více tutoriálů, zdarma kvalitní překladač atd...

Obsluha přerušení se nikdy neukončuje rjmp ale příkazem reti.

viz. https://www.avrfreaks.net/forum/external-interrupts-using-assembly
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
DavidChlup



Založen: Sep 03, 2019
Příspěvky: 69
Bydliště: Karlovy Vary

PříspěvekZaslal: ne květen 03 2020, 11:11    Předmět: Citovat

Dobrý postřeh, to jsem přehlídl. Přerušení jsem nepoužíval dost dlouho, resp jsem dlouho nic nepsal Very Happy nicméně to problém nevyřešilo.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zmije



Založen: Jun 30, 2005
Příspěvky: 1569
Bydliště: Pardubický kraj

PříspěvekZaslal: ne květen 03 2020, 11:17    Předmět: Citovat

pokud to máš upravené na
kód:

USART_Receive:
     
               
      sbis UCSRA, RXC
      rjmp USART_Receive
                 
      in reg, UDR
      reti


Tak je tam nekonečná smyčka.

edit:
zjistil jsem, že instrukce sbis je podmínková. Nekonečnou smyčku beru zpět.
http://www.avrbeginners.net/architecture/ioports/io_instr.html
citace:
sbic/sbis (skip if bit in I/O register is cleared/set) skips the next instruction depending on the I/O bit's state. In the example above I added a relative jump (rjmp) to show you how you could use this instruction. In this case, the mcu will jump to bit_is_set if bit 7 of PortD is not cleared (->set) and proceed with the instruction following the relative jump if that bit is cleared.


Naposledy upravil Zmije dne ne květen 03 2020, 12:55, celkově upraveno 1 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
DavidChlup



Založen: Sep 03, 2019
Příspěvky: 69
Bydliště: Karlovy Vary

PříspěvekZaslal: ne květen 03 2020, 12:11    Předmět: Citovat

Nahoře na adrese už mám:

kód:
.org $00b
      rcall USART_Receive
      rjmp start


dole pak to, co píšeš, jen podle datasheetu s instrukcí RET:

kód:
USART_Receive:
      
               
      sbis UCSRA, RXC
      rjmp USART_Receive
                  
      in reg, UDR
      ret


Naposledy upravil DavidChlup dne ne květen 03 2020, 12:15, celkově upraveno 1 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
DavidChlup



Založen: Sep 03, 2019
Příspěvky: 69
Bydliště: Karlovy Vary

PříspěvekZaslal: ne květen 03 2020, 12:15    Předmět: Citovat

AHA, tak datasheet píše "ret" a to nejde, ale s instrukcí "reti" to funguje...

kód:

.NOLIST
.INCLUDE "m8def.inc"
.LIST




.def   reg=R16
.def   reg2=r17

.EQU DATAIND=DDRD
.EQU LEDD=DDRC

.EQU DATAIN=PORTD   ;RX DATA
.EQU LED=PORTC      ;PC0-PC4 LED


.cseg
.org $0   
           
;----------------- Vektory přerušení ----------------------

      rjmp ini
.org $00b
      rcall USART_Receive
      rjmp start

;------------------- Inicializace -------------------------


Ini:   ldi reg, 0b00000000
      out DATAIND, REG

      ldi reg, 0b11111111
      out LEDD, reg
      out LED, reg

      ldi reg, 0b00000000
      out DATAIN, REG

       ldi reg,LOW(RAMEND)
      out SPL,reg
      ldi reg,HIGH(RAMEND)
      out SPH,reg


; Set baud rate
      ldi reg, 51
      ldi reg2, 0
      out UBRRH, reg2
      out UBRRL, reg
; Enable receiver and transmitter
      ldi reg, (1<<RXEN)|(1<<RXCIE)
      out UCSRB, reg
; Set frame format: 8data, 1stop bit
      ldi reg, (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)
      out UCSRC, reg

      ldi reg, 0b00000000
      out led, reg
      rcall time2s
      ldi reg, 0b11111111
      out led, reg

      sei

;------------------- Hlavní smyčka ------------------------


START:

      out led, reg

      rjmp start
;---------------- Podprogram přerušení --------------------


USART_Receive:
      
               
      sbis UCSRA, RXC
      rjmp USART_Receive
                  
      in reg, UDR
      reti


;----------------- Podprogram časování --------------------


time2s:
; =============================
;    delay loop generator
;     16000000 cycles:
; -----------------------------
; delaying 15999993 cycles:
          ldi  R20, $53
WGLOOP0:  ldi  R21, $FB
WGLOOP1:  ldi  R22, $FF
WGLOOP2:  dec  R22
          brne WGLOOP2
          dec  R21
          brne WGLOOP1
          dec  R20
          brne WGLOOP0
; -----------------------------
; delaying 6 cycles:
          ldi  R20, $02
WGLOOP3:  dec  R20
          brne WGLOOP3
; -----------------------------
; delaying 1 cycle:
          nop
; =============================

reti
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
lesana87



Založen: Sep 20, 2014
Příspěvky: 3328

PříspěvekZaslal: ne květen 03 2020, 16:27    Předmět: Citovat

To
kód:
sbis UCSRA, RXC
rjmp USART_Receive

je tam samozřejmě nesmyslné. V přerušení se žádné čekací cykly zásadně nedělají, princip přerušení je, že se automaticky vyvolá v okamžiku, kdy událost nastala, tak nemá smysl na ní čekat.
Stejně tak
kód:
.org $00b
      rcall USART_Receive
      rjmp start

je nesmysl, má tam být jen
kód:
.org $00b
      rjmp USART_Receive

Procesor se instrukcí reti automaticky vrací na místo, kde k přerušení došlo, s tím rcall se pokaždé vrací na start, což je blbost. Že to teď jako fuguje, je jen proto, že to nic jiného než skákání na start stejně nedělá a že přetéká zásobník se asi taky nepozná.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
DavidChlup



Založen: Sep 03, 2019
Příspěvky: 69
Bydliště: Karlovy Vary

PříspěvekZaslal: ne květen 03 2020, 22:32    Předmět: Citovat

Takže to má být takhle?

kód:
.NOLIST
.INCLUDE "m8def.inc"
.LIST




.def   reg=R16
.def   reg2=r17

.EQU DATAIND=DDRD
.EQU LEDD=DDRC

.EQU DATAIN=PORTD   ;RX DATA
.EQU LED=PORTC      ;PC0-PC4 LED


.cseg
.org $0   
      rjmp ini
           
;----------------- Vektory přerušení ----------------------

.org $00b
      rjmp USART_Receive

;------------------- Inicializace -------------------------


Ini:   ldi reg, 0b00000000
      out DATAIND, REG

      ldi reg, 0b11111111
      out LEDD, reg
      out LED, reg

      ldi reg, 0b00000000
      out DATAIN, REG

       ldi reg,LOW(RAMEND)
      out SPL,reg
      ldi reg,HIGH(RAMEND)
      out SPH,reg


; Set baud rate
      ldi reg, 51
      ldi reg2, 0
      out UBRRH, reg2
      out UBRRL, reg
; Enable receiver and transmitter
      ldi reg, (1<<RXEN)|(1<<RXCIE)
      out UCSRB, reg
; Set frame format: 8data, 1stop bit
      ldi reg, (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)
      out UCSRC, reg

      ldi reg, 0b00000000
      out led, reg
      rcall time2s
      ldi reg, 0b11111111
      out led, reg

      sei

;------------------- Hlavní smyčka ------------------------


START:

      out led, reg
      rjmp start

;---------------- Podprogram přerušení --------------------


USART_Receive:
                  
      in reg, UDR
      reti


;----------------- Podprogram časování --------------------


time2s:
; =============================
;    delay loop generator
;     16000000 cycles:
; -----------------------------
; delaying 15999993 cycles:
          ldi  R20, $53
WGLOOP0:  ldi  R21, $FB
WGLOOP1:  ldi  R22, $FF
WGLOOP2:  dec  R22
          brne WGLOOP2
          dec  R21
          brne WGLOOP1
          dec  R20
          brne WGLOOP0
; -----------------------------
; delaying 6 cycles:
          ldi  R20, $02
WGLOOP3:  dec  R20
          brne WGLOOP3
; -----------------------------
; delaying 1 cycle:
          nop
; =============================

reti
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
lesana87



Založen: Sep 20, 2014
Příspěvky: 3328

PříspěvekZaslal: po květen 04 2020, 18:23    Předmět: Citovat

Až na to reti úplně na konci Very Happy to jako demonstrace, že funguje přerušení, může posloužit. Ale do reálného použití to má ještě daleko. Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
DavidChlup



Založen: Sep 03, 2019
Příspěvky: 69
Bydliště: Karlovy Vary

PříspěvekZaslal: po květen 04 2020, 19:03    Předmět: Citovat

Takhle to generuje delay loop generátor i s tím reti na konci. Co by se tedy mělo zlepšit? Stačí jen bodovitě vyjmenovat, nějak to snad dohledám. Tohle bylo jen pro pochopení uartu, takže nečekám, že to bude hned použitelné 😁
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
lesana87



Založen: Sep 20, 2014
Příspěvky: 3328

PříspěvekZaslal: po květen 04 2020, 19:09    Předmět: Citovat

RETI patří na konec obsluhy přerušení. Na konec podprogramu patří RET.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
DavidChlup



Založen: Sep 03, 2019
Příspěvky: 69
Bydliště: Karlovy Vary

PříspěvekZaslal: st květen 06 2020, 19:08    Předmět: Citovat

Výborně, děkuji Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra.
Nemůžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Nemůžete připojovat soubory k příspěvkům
Můžete stahovat a prohlížet přiložené soubory

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.18 sekund