kodový zámek s displejem

Popravdě řečeno - program je napsaný dost prasácky. Některá použitá makra by sis musela napsat, pokud nejsou součástí WinAVR. Navíc tohle není psané ve WinAVR z winide51.wz.cz/avr/ (Assembler). Jaké jsou mezi nimi rozdíly ? Ten první (dnes je součástí AVR Toolchain v AVR Studiu) je freeware, ten druhý ne. Navíc ten druhý už se hodně dlouho nevyvíjí. Ale zpátky k pogramu. Žádné piny nejsou pojmenované, jakákoliv změna programu je tudíž téměř nemyslitelná. Použít na tuto aplikaci ATmega162 a ještě navíc s krystalem je holý nesmysl. Podle mně šlo o nějaký školní přípravek. Na tuto jednoduchou aplikaci by bohatě stačil ATtiny2313, protože potřebuješ 8 IO pinů na klávesnici a 7 pinů pro LCD (4x data, 2x řídící, 1x ovládání podsvícení) a zbývají Ti 2 piny na pípátko a relé. Pokud se chceš naučit assembler pro AVRko, tak tenhle program je ukázkou toho, jak se psát program NEMÁ.

Vytahnu Ti tady nějaký příklady špatného programování :

  1. Využití RAM :
    Statusy by se daly sloučit do jednoho bytu a ne kvůli jednomu bitu “plýtvat” celým bytem. Na druhou stranu, pokud je RAMky dostatek, proč ne - je to asi nejmenší prohřešek. Osobně například status programu nechávám uložený po celou dobu běhu programu v některém registru. Je s ním pak jednnodušší a rychlejší práce - viz dále.

  2. Označení signálů a konstant jmény na začátku :

      CPI   R16, 10
      BRNE    TEST2
      RJMP   ZAC

Jedná se o konstantu 10. Je použitá na více mistech. JENŽE : Pokud potřebuješ konstantu změnit, musíš jí najít VŠUDE, kde je použitá. Ale co, když je čislo 10 naše konstanta, ale i třeba délka čekání nebo znak ze sériového portu ? Takže pokud napíšu :

      CPI R16, 10
      BRNE TEST2

      CPI R16, 10
      BRNE ZNOVA

      CPI R16, 10
      BRNE SMYCKA

a potřebuju změnit kód znaku, na který čekám, jak zjistím, že je to ta správná desítka, kterou měním ? A jak zajistím, že jsem změnil všechny správné desítky v celém kódu ? Tady je odpověď :

#define Test_kodu 10
#define Ukoncovaci_znak 10
#define Pocet_cekani 10

      CPI R16, Test_kodu
      BRNE TEST2

      CPI R16, Ukoncovaci_znak
      BRNE ZNOVA

      CPI R16, Pocet_cekani
      BRNE SMYCKA

Pokud změním třeba hodnotu konstanty “Test_kodu”, pak se mi “přepíšou” VŠECHNY SPRÁVNÉ desítky v CELÉM programu.

Vrátím se ke status registru. Status programu ukládám do jednoho registru a pojmenovávám si jednotlivé bity.

Například :

.def PRG_STAT=R10            ; Registr, kde je uložený status programu
#define BOOT_END 0           ; bit 0 => 1 znamená, že je dokončeno bootování všech (hlavně externích) periferií.
#define BUFFER_FULL 1       ; bit 1 => 0 = OK, 1 =  buffer je plný

V programu pak používám :

    sbr PRG_STAT, (1<<BOOT_END)          ; Nastavení bitu 0 ve statusu na log. 1

    sbrs PRG_STAT, BOOT_END                  ; Přeskoč následující instrukci, pokud bit 0 = 1
    rjmp Bit_je_nula

    sbrc PRG_STAT, BOOT_END                  ; Přeskoč následující instrukci, pokud bit 0 = 0
    rjmp Bit_je_jednicka
  1. Použití maker :
VYSBYT:      CPI08   PODSV, 0
            BRNE   SVITI
TESTKODM:   CPMM32   KODX, KODM      ;porovnává načtený kód se správným
            BREQ   MASTER_OK
            RJMP   TESTKOD1

Makra CPI08 a CPMM32 (a další) jsou v zásadě použitá správně. Pokud však nejsou součástí překladače, pak ve zdrojových textech chybí jejich definice.

  1. Použití sekcí :
.SECT jméno_sekce
.ENDSECT

Sekce nejsou (alespoň pokud vím) standartní výbavou assemblerů. Použití je sice možné, ale může výrazně zkomplikovat přenos do jiného vývojového prostředí. Rozhodně bych se použití sekcí spíše vyhnul. Ostatně, pokud nemáš výše zmíněný WinAVR assembler k dispozici, tak sekce nepoužiješ.

V praxi bývá zvykem začít vytvořením návrhu zapojení a DPS, aby sis DPS pokud možno co nejvíce zjednodušila. Podle návrhu DPS pak umístění jednotlivých signálů na piny. Mnohem jednodušeji totiž zrealizuješ přehození významu pinů v programu, než jejich přepojení na DPS. A já osobně bych Ti doporučil stejný postup. Nakresli si DPS a návrh podle potřeby a podle něj si pak napiš program. Druhou variantou je, aby sis stáhla schéma zapojení tam, kde jsi našla program. Jenže kopírováním programu a hardwaru z Internetu bez přemýšlení nad nimi se nic nenaučíš.