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í 

74HC575 a multiplex na atmega

 
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
Aktuell



Založen: Jul 14, 2010
Příspěvky: 26

PříspěvekZaslal: ne prosinec 08 2013, 19:45    Předmět: 74HC575 a multiplex na atmega Citovat

Zdravím, mám takový problém, dělám program pro multiplexování BCD displeje pomocí shift registru 595, program jako takový pro posílání stringu a pouštění potřebných bitů na výstup se zdá že funguje dobře, ale když chci přepínat anody pomocí funkce switch case, tak proběhne nejspíš jen první case a druhý už ne a nevím si s tím vůbec rady, kde může být chyba. Na ukázku sem vybral část kódu a zapojení v ISIS, kde by správně mělo být **56, ale je jen ***6 (adresování zjednodušeno jen na dvě poslední cifry).


kód:
int i=3456;

unsigned char znaky [10] = {
    0b00000011,       //0
    0b10011111,       //1
    0b00100101,       //2
    0b00001101,       //3
    0b10011001,       //4
    0b01101001,       //5
    0b01000001,       //6
    0b00011111,       //7
    0b00000001,       //8
    0b00001001   };    //9


unsigned char anody [4] = {
    0b0001,     //0  - 4.digit
    0b0010,     //1  - 3.digit
    0b0100,     //2  - 2.digit
    0b1000   };  //3  - 1.digit


ISR(TIMER0_OVF_vect)
{
   
tisice=i/1000;  // 4-cif. cislo rozsekej na cifry
pom=i%1000;
stovky=pom/100;
pom=pom%100;
desitky=pom/10;
jednotky=pom%10;
   
         
   switch (cyklus) {
      
   case 0:
         
      data_k_odeslani= (znaky[jednotky]<<4) | anody[0];   // sluč registry pro katody a anody
         
      while(pocet_odeslanych < 12)      //posilam 12 bitu
   
         {  PORTC=PORTC&0b11111110;     //hodiny do nuly
            if(data_k_odeslani & 0x01) PORTC=PORTC|0b00000010;
                   else PORTC=PORTC&0b11111101;
            PORTC=PORTC|0b00000001; // hodiny do jednicky
            data_k_odeslani>>=1; //posun data o bit doprava
            pocet_odeslanych++;
          }

           PORTC=PORTC|0b00000100;  // pusť data na paralelní výstupy
           asm("nop");
           PORTC=PORTC&0b11111011;  // výstupy uzavři

               
    cyklus=1;
    break;


   case 1:
         
      data_k_odeslani= (znaky[desitky]<<4) | anody[1];   // sluč registry pro katody a anody
         
      while(pocet_odeslanych < 12)      //posilam 12 bitu
   
         {  PORTC=PORTC&0b11111110;     //hodiny do nuly
            if(data_k_odeslani & 0x01) PORTC=PORTC|0b00000010;
                   else PORTC=PORTC&0b11111101;
            PORTC=PORTC|0b00000001; // hodiny do jednicky
            data_k_odeslani>>=1; //posun data o bit doprava
            pocet_odeslanych++;
          }

           PORTC=PORTC|0b00000100;  // vpusť data na paralelní výstupy
           asm("nop");
           PORTC=PORTC&0b11111011;  // výstupyuzavři
               
               
    cyklus=0;
    break;

       } // konec switch
   
TCNT0=217;
      
}



simul.jpg
 Komentář:

Stáhnout
 Soubor:  simul.jpg
 Velikost:  132.09 kB
 Staženo:  129 krát

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



Založen: Nov 23, 2009
Příspěvky: 312

PříspěvekZaslal: po prosinec 09 2013, 7:36    Předmět: Citovat

Zkus přemýšlet jak se budou měnit bity v posuvných registrech když pokaždé pošleš 12 bitů.

Buď musíš posílat 16 bitů, nebo před posláním 12-ti bitů registry vynulovat.

A pošli kompletní kód.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
procesor



Založen: Oct 02, 2009
Příspěvky: 5286
Bydliště: PO

PříspěvekZaslal: po prosinec 09 2013, 14:09    Předmět: Citovat

Žeby rozmýšlal? a vyšlo mu, že 12 stačí.
Posledné 4 bity v registri mu môžu byť ukradnuté.
Kde nuluješ "pocet_odeslanych"
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Aktuell



Založen: Jul 14, 2010
Příspěvky: 26

PříspěvekZaslal: po prosinec 09 2013, 17:08    Předmět: Citovat

citace:
Nemá být počet odeslaných < 11 (pokud teda počítáme od nuly)?

No já bych se vsadil, že určitě ne, protože 0,1,2,3,4,5,6,7,8,9,10 určitě dohromady nedá 12...

Nechtěl jsem tu zbytečně spamovat celým kódem, tak jsem vybral podstatnou část a doufal že si zbytek každý domyslí, ale asi ne, tak tady pro pořádek celý kód. Uvnitř smyčky while bych problém neviděl, odeslání stringu se zdá že funguje, nefunguje však její ukončení a skočení na další case. Program sem se snažil nějak okomentovat.

kód:
#include <avr/interrupt.h>
#include <avr/io.h>         
#include <stdlib.h>
#include <stdio.h>

unsigned char znaky [10] = {   // definuj pole znaků kombinací katod segmentů
    0b00000011,       //0
    0b10011111,       //1
    0b00100101,       //2
    0b00001101,       //3
    0b10011001,       //4
    0b01101001,       //5
    0b01000001,       //6
    0b00011111,       //7
    0b00000001,       //8
    0b00001001   };   //9


unsigned char anody [4] = {   // definuj pole pro anody jednotlivých sedmisegmentovek
    0b0001,     //0  - 4.digit
    0b0010,     //1  - 3.digit
    0b0100,     //2  - 2.digit
    0b1000   }; //3  - 1.digit

unsigned short int data_k_odeslani, pom, i=3456;
unsigned char pocet_odeslanych = 0, jednotky, desitky, stovky, tisice, cyklus=0;


void main(void)
{
    PORTC=0;         // vynuluj port
    DDRC=0b11111111; // port C jako výstupní
    TIMSK=0b00000001;     // čítač 0 povoleno přerušení (bit0 TIMER0, bit2 TIMER1, bit6 TIMER2)   
   
 //  Nastavení čítač 0
    TCCR0 = 0b00000100;   //   clk/1024 – 101 ; clk/256 – 100 ; clk/64 – 011 ; for clk/8 – 010 ; no presc. - 001
    TCNT0 = 217;          //   2^8 - 1000000 / 256 / 100 = 217  -> 100 Hz

asm("sei");   // Global enable interrupts
   
         while(1)
         {
            
         }
}

ISR(TIMER0_OVF_vect)       //  přerušení overflow timer
{
   
tisice=i/1000;  // 4-cif. cislo rozsekej na cifry
pom=i%1000;
stovky=pom/100;
pom=pom%100;
desitky=pom/10;
jednotky=pom%10;
   
         
   switch (cyklus) {
      
   case 0:
         
      data_k_odeslani= (znaky[jednotky]<<4) | anody[0];   // sluč registry pro katody a anody
         
      while(pocet_odeslanych < 12)      //posilam 12 bitu
   
         {  PORTC=PORTC&0b11111110;     //hodiny do nuly
            if(data_k_odeslani & 1) PORTC=PORTC|0b00000010;  // pokud vymaskovaný bit v proměné není roven nule, pošli jedničku do sériového výstupu
                   else PORTC=PORTC&0b11111101;   // jinak pošli nulu
            PORTC=PORTC|0b00000001; // hodiny do jednicky, povolení vstupu bitu 1 z předch.podm. na sériový výstup
            data_k_odeslani>>=1; //posuň data o bit doprava
            pocet_odeslanych++;
          }

           PORTC=PORTC|0b00000100;  // pusť data na paralelní výstupy
           asm("nop");
           PORTC=PORTC&0b11111011;  // výstupy uzavři

               
    cyklus=1;
    break;


   case 1:
         
      data_k_odeslani= (znaky[desitky]<<4) | anody[1];   
         
      while(pocet_odeslanych < 12)     
   
         {  PORTC=PORTC&0b11111110;     
            if(data_k_odeslani & 1) PORTC=PORTC|0b00000010;
                   else PORTC=PORTC&0b11111101;
            PORTC=PORTC|0b00000001;
            data_k_odeslani>>=1;
            pocet_odeslanych++;
          }

           PORTC=PORTC|0b00000100; 
           asm("nop");
           PORTC=PORTC&0b11111011; 
               
               
    cyklus=0;
    break;

       } // konec switch
   
TCNT0=217; // znovu nastav čítač
      
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
FHonza



Založen: Nov 20, 2012
Příspěvky: 1453
Bydliště: Praha

PříspěvekZaslal: po prosinec 09 2013, 17:51    Předmět: Citovat

zkus deklarovat proměnnou cyklus jako volatile char
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Aktuell



Založen: Jul 14, 2010
Příspěvky: 26

PříspěvekZaslal: po prosinec 09 2013, 18:17    Předmět: Citovat

FHonza napsal(a):
zkus deklarovat proměnnou cyklus jako volatile char

Bohužel nepomohlo Confused
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
FHonza



Založen: Nov 20, 2012
Příspěvky: 1453
Bydliště: Praha

PříspěvekZaslal: po prosinec 09 2013, 18:32    Předmět: Citovat

zkus přeložit kód bez optimalizace nebo všechny proměnné, které se používají v obsluze přerušení, deklarovat jako volatile. Obecně by globální proměnné, které se používají v obsluze přerušení, měly být takto deklarovány. Jinak hrozí že se po návratu z obsluhy nezachová jejich hodnota.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
piitr



Založen: Oct 19, 2007
Příspěvky: 1003

PříspěvekZaslal: po prosinec 09 2013, 19:37    Předmět: Citovat

Přijde mi, že nenuluješ pocet_odeslanych před whilem.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
Aktuell



Založen: Jul 14, 2010
Příspěvky: 26

PříspěvekZaslal: po prosinec 09 2013, 20:48    Předmět: Citovat

piitr napsal(a):
Přijde mi, že nenuluješ pocet_odeslanych před whilem.

Přišlo ti to správně. A já se domníval že vynulování v deklaraci bude stačit. Díky za vyřešení
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
procesor



Založen: Oct 02, 2009
Příspěvky: 5286
Bydliště: PO

PříspěvekZaslal: po prosinec 09 2013, 21:36    Předmět: Citovat

procesor napsal(a):
Žeby rozmýšlal? a vyšlo mu, že 12 stačí.
Posledné 4 bity v registri mu môžu byť ukradnuté.
Kde nuluješ "pocet_odeslanych"


Stačilo by čítať...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
AB1



Založen: Nov 23, 2009
Příspěvky: 312

PříspěvekZaslal: út prosinec 10 2013, 4:50    Předmět: Citovat

procesor napsal(a):
Žeby rozmýšlal? a vyšlo mu, že 12 stačí.
Posledné 4 bity v registri mu môžu byť ukradnuté.

Máš pravdu.
Přemýšlet jsem měl já, než jsem to napsal.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
procesor



Založen: Oct 02, 2009
Příspěvky: 5286
Bydliště: PO

PříspěvekZaslal: út prosinec 10 2013, 14:04    Předmět: Citovat

Tvoj postup by tiež fungoval/nefungoval, mal by iba pár nadbytočných inštrukcií Smile a chýbali potrebné-
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
procesor



Založen: Oct 02, 2009
Příspěvky: 5286
Bydliště: PO

PříspěvekZaslal: st prosinec 11 2013, 16:18    Předmět: Citovat

Dnes je to mega... chýb a bežne mega naviac. Proste nikto netuší
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.16 sekund