www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Problem s CodeVision
Pojdi na stran Prejšnja  1, 2, 3
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
Alex17
Član
Član



Pridružen-a: Ned 28 Feb 2010 21:46
Prispevkov: 476
Aktiv.: 2.56
Kraj: Ljutomer

PrispevekObjavljeno: Čet Jul 28, 2011 6:45 pm    Naslov sporočila:   Odgovori s citatom

davide je napisal/a:
Mogoče je napaka v tem, ker sta v kodi dva različna pogoja, kaj se stori, ko je menu=2, najprej naj se spremeni napis na lcd zaslonu, v drugem pogoju pa naj se v tem meniju nastavljajo minute...???

Prav tako imaš dva pogoja, ko je Menu==1, tako da to odpade.

Če imaš voljo, je tu še nekaj predlogov: Smile
- v tisti del, kjer minute spreminjaš daj še eno LED, ki bo spreminjala stanje (uporabiš lahko kar PORTC.1 = !PORTC.1, saj smo ugotovili, da je prikaz OK) , da vidiš, če program sploh vstopi v if stavek ali ga preskoči;
- če bo ta utripala, definiraj novo spremenljivko in jo spreminjaj tam kjer minute, ter jo nekje posebej prikaži na zaslonu, da vidiš, če se bo ta spreminjala;
- če LED iz prvega poskusa ne bo utripala, definiraj novo spremenljivko namesto menu in jo uporabi namesto menu, ali pa določi drugačne vrednosti za nastavitev ur in minute (namestu menu==1 in menu==2 npr. menu==5...)
- probaj tudi različne variante z if, else if in else (menu==2), čeprav dvomim, da bi bil to problem.

Kaj drugega pa mi sedaj res ne pade na pamet.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
davide
Član
Član



Pridružen-a: Pet 10 Sep 2010 16:45
Prispevkov: 149
Aktiv.: 0.83
Kraj: Savinjska

PrispevekObjavljeno: Pon Avg 01, 2011 3:20 pm    Naslov sporočila:   Odgovori s citatom

Zanimivo res, poskusil sem že res vse načine, ampak sem obupal, ker stvar še vedno ne deluje...
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Alex17
Član
Član



Pridružen-a: Ned 28 Feb 2010 21:46
Prispevkov: 476
Aktiv.: 2.56
Kraj: Ljutomer

PrispevekObjavljeno: Tor Avg 02, 2011 11:46 pm    Naslov sporočila:   Odgovori s citatom

Kaj si pa nazadnje ugotovil? Gre v if stavek, ali ga preskoči?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
davide
Član
Član



Pridružen-a: Pet 10 Sep 2010 16:45
Prispevkov: 149
Aktiv.: 0.83
Kraj: Savinjska

PrispevekObjavljeno: Sre Avg 03, 2011 11:34 am    Naslov sporočila:   Odgovori s citatom

Ne v if stavek ne gre, potem sem probal, da bi izpislovalo samo minute, pa zamenjal minute in ure na lcd-ju pa vseeno ni hotelo spreminjati minut.
Torej še vedno ne vem ali je napaka v izpisu (en primer kaže na to) ali pa sploh ne prebere if stavka-bolj verjetno!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Alex17
Član
Član



Pridružen-a: Ned 28 Feb 2010 21:46
Prispevkov: 476
Aktiv.: 2.56
Kraj: Ljutomer

PrispevekObjavljeno: Sre Avg 03, 2011 2:17 pm    Naslov sporočila:   Odgovori s citatom

OK, naredi nov projekt / datoteko, karkoli da bo v drugi mapi in boš lahko prevedel kot samostojen projekt in prilepi tja spodnjo kodo.
Pomembno je, da kode nič ne spreminjaš (če bo prevajalnik javil kakšno očitno napako, kot je izpuščeno podpičje ali oklepaj, lahko popraviš, vse ostale napake, ki bi jih prevajalnik javil, pa prosim prilepi tu).
Če bo šlo vse tako kot mora, daj čip z novim programom v obstoječe vezje, s tem da dodaš (če že nimaš) LED na PORTC.1 in PORTC.2.
Malo sem spremenil prikaz na zaslonu, v prvi vrstice se izpiše SET: (ure):(minute), na koncu prve vrstice ap še nova spremenljivka New_Minute. Spodnje vrstice LCD-ja nisem spreminjal.
Začetna ura, ki se mora pokazati po pozdravnem zaslonu je 16:30, New_Minute pa imajo vrednost 20.
Ostalo bi naj delovalo vse kot prej, s tem da se spremenljivka NeW_Minute mora spreminjati sočasno tako z urami, kot z minutami. Se pravi, ko povečuješ ure, se povečuje New_minute, ko povečuješ minute, se povečuje NeW_Minute in enako za zmanjševanje.
LED na PORTC.1 mora spremeniti stanje ob vskaem pritisku na katerokoli tipko.
LED na pORTC.2 mora spremeniti stanje samo pri povečevnaju ali zmanjševanju miut.

Kar me zanima je sledeče:

1.: Ali je začetni prikaz številk po pozdravnem zaslonu pravilen (ura 16:30 in New_Minute 20);
2.: Ali se New_Minute spreminjajo sočasno z urami;
3.: ALi se new_minute spreminjajo sočasno z minutami;
4.: Ali se spreminjajo minute.
5.: ALI LED na PORTC.1 spremeni res ob kateremkoli pritisku na tipko (ure+, ure-, minute+, minute-)
6.: Ali LED na PORTC.2 spreminja stanje med nastavljanjem minut

Koda:
////////////////////////////////////////////////////////////////////////////////
#include <mega8.h>

// Alphanumeric LCD Module functions
#include <alcd.h>
#include <stdio.h>
#include <delay.h>

volatile unsigned int ura_milisekunde=0;
int ura_sekunde=0;
int ura_minute=0;
int ura_ure=0;
char min[2];
char hr[2];
int menu=1;
bit tipka_spuscena;
bit tipka_pritisnjena;
int ure=16;
int minute=30;
unsigned int New_minute = 20;
unsigned short New_Menu = 0;

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here



}


// Timer1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
// Place your code here

ura_milisekunde++;
    if (ura_milisekunde==1000)
    {
    ura_sekunde--;
    ura_milisekunde=0;
        if(ura_sekunde==-1)
        {
        ura_minute--;
        ura_sekunde=59;
            if(ura_minute==-1)
            {
            ura_ure--;
            ura_minute=59;
            }
        }
    }
}

// Declare your global variables here

void rele_vklop(){
PORTC.0=1;}

void rele_izklop(){
PORTC.0=0;}



void main(void)
{
// Declare your local variables here

PORTB=0x07;
DDRB=0x00;
PORTC=0x00;
DDRC=0x07;
PORTD=0x00;
DDRD=0xFF;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: CTC top=OCR1A
// OC1A output: Set
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0xC0;
TCCR1B=0x0B;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x7D;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: Off
GICR|=0x40;
MCUCR=0x02;
GIFR=0x40;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;

// USART initialization
// USART disabled
UCSRB=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// Alphanumeric LCD initialization
// Connections specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTD Bit 6
// RD - PORTD Bit 5
// EN - PORTD Bit 4
// D4 - PORTD Bit 0
// D5 - PORTD Bit 1
// D6 - PORTD Bit 2
// D7 - PORTD Bit 3
// Characters/line: 16
lcd_init(16);

// Global enable interrupts
//#asm("sei")

while(1){
      //lcd_clear();
      lcd_puts("  Lep pozdrav");
      lcd_gotoxy(2,1);
      lcd_puts("Casovni rele");
      delay_ms(4000);

      lcd_clear();
      //lcd_puts("Nast.cas->");
      lcd_puts("SET:");
      //lcd_gotoxy(2,1);
      //lcd_puts("  Start");
      //menu=1;



    while (1)
        {

          lcd_gotoxy(5,0);
          sprintf(hr,"%02d",ure);
          lcd_puts(hr);
          lcd_puts(":");
          sprintf(hr,"%02d",minute);
          lcd_puts(hr);
          sprintf(hr,"%02d",New_Minute);
          lcd_gotoxy(13,0);
          lcd_puts(hr);

          if(menu==0){
          lcd_gotoxy(0,1);
          //lcd_clear();
          lcd_puts("> Start         ");
          }
          else if(menu==1){
          lcd_gotoxy(0,1);
          //lcd_clear();
          lcd_puts("  Start   ^");
          }
          else if(menu==2){
          lcd_gotoxy(0,1);
          //lcd_clear();
          lcd_puts("  Start      ^");
          }


                if(PINB.0==0) //tipka menu
                {
                   PORTC.1 = !PORTC.1;
                   
                  delay_ms(10);
                    if(PINB.0==0)
                    {
                      if(++Menu > 2) Menu = 0;
                      if(++New_menu>2) New_Menu = 0;
                      while(!PINB.0);
                    }
                }

                if(PINB.1==0) //tipka gor
                {
                  PORTC.1 = !PORTC.1;

                    if(menu==1)
                    {
                    ure++;
                        if(ure==100)
                        {
                        ure=0;
                        }
                      if(++New_Minute > 59) New_Minute = 0;

                    }
                    if(menu==2)
                    {

                      if(++Minute > 59) Minute = 0;
                      if(++New_Minute > 23) New_Minute = 0;
                      PORTC.2 = !PORTC.2;

                    }
                    if(New_Menu==2)
                    {

                      if(++Minute > 59) Minute = 0;
                      if(++New_Minute > 23) New_Minute = 0;
                      PORTC.2 = !PORTC.2;

                    }
                    while(!PINB.1);
                }


                if(PINB.2==0) //tipka dol
                {

                  PORTC.1 = !PORTC.1;

                    if(menu==1)
                    {
                    ure--;
                        if(ure==-1)
                        {
                        ure=99;
                        }
                      if(--New_Minute > 23) NeW_Minute = 23;
                    }
                    if(menu==2)
                    {
                      if(--Minute < 0) Minute = 59;
                      if(--New_Minute > 59) NeW_Minute = 59;
                      PORTC.2 = !PORTC.2;
                    }
                    if(New_menu==2)
                    {
                      if(--Minute < 0) Minute = 59;
                      if(--New_Minute > 59) NeW_Minute = 59;
                      PORTC.2 = !PORTC.2;
                    }
                    while(!PINB.2);
                }

//                  while(menu==0)
//                  {
//
//                  }

    }
 }
}

////////////////////////////////////////////////////////////////////////////////
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
davide
Član
Član



Pridružen-a: Pet 10 Sep 2010 16:45
Prispevkov: 149
Aktiv.: 0.83
Kraj: Savinjska

PrispevekObjavljeno: Sob Avg 06, 2011 7:03 pm    Naslov sporočila:   Odgovori s citatom

Bom poskusil kopirati to tvojo kodo pa bom videl kaj se bo zgodilo...
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
davide
Član
Član



Pridružen-a: Pet 10 Sep 2010 16:45
Prispevkov: 149
Aktiv.: 0.83
Kraj: Savinjska

PrispevekObjavljeno: Sre Avg 10, 2011 10:13 am    Naslov sporočila:   Odgovori s citatom

no stvar je takšna:
na začetku je prikaz na zalonu set: 16:00 20
ko sem v manu=1 led dioda na portc.1 res spreminja stanje, vendar se številke spreminjajo drugače, nisem dal nobenega delaya, sem kopiral enako kot si napisal, tako da se spreminja zelo hitro, ni pa enako.
Ko je menu=2, se spreminja new_minute, ter obe led diodi svetita izmenoma.
V menu=3 led diodi utripata hkrati (spreminjata stanji skupaj), spreminja pa se spremenljivka new_minute...
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Alex17
Član
Član



Pridružen-a: Ned 28 Feb 2010 21:46
Prispevkov: 476
Aktiv.: 2.56
Kraj: Ljutomer

PrispevekObjavljeno: Čet Avg 11, 2011 12:14 am    Naslov sporočila:   Odgovori s citatom

Sedaj mi ni čisto jasno, zakaj se številke spreminjajo hitro, v vsakem if stavku bi moral program počakati, da spustiš tipko in šele nato nadaljevati. Mogoče pa prevajalniku ne pašejo stavki v smisliu "while(!PINB.2);" . Če lahko, zamenjaj vse 3 take primere z nekim malo večjim delayem (500ms), da boš normalno videl, kako in kdaj se katere spremenljivke spreminjajo.

Če praviš, da se na PORTC.1 LED spreminja vedno (in to res vedno), ko držiš katerokoli tipko, lahko to LED vržeš iz programa, da ne moti. Zaenkrat samo zakomentiraj vse vrstice s PORTC.1 ali pa LED potegni iz ploščice.

Kaj si mislil z Menu=3 ne vem točno, verjetno 2?

Mogoče bo malo nekulturno izgledalo, ampak dodaj pri prikazu ure še prikaz spremenljivk Menu in New_Menu:

Namesto tega:

Koda:
          lcd_gotoxy(5,0);
          sprintf(hr,"%02d",ure);
          lcd_puts(hr);
          lcd_puts(":");
          sprintf(hr,"%02d",minute);
          lcd_puts(hr);
          sprintf(hr,"%02d",New_Minute);
          lcd_gotoxy(13,0);
          lcd_puts(hr);

          if(menu==0){
          lcd_gotoxy(0,1);
          //lcd_clear();
          lcd_puts("> Start         ");
          }
          else if(menu==1){
          lcd_gotoxy(0,1);
          //lcd_clear();
          lcd_puts("  Start   ^");
          }
          else if(menu==2){
          lcd_gotoxy(0,1);
          //lcd_clear();
          lcd_puts("  Start      ^");
          }


zamenjaš z:

Koda:
          lcd_gotoxy(5,0);
          sprintf(hr,"%02d",ure);
          lcd_puts(hr);
          lcd_puts(":");
          sprintf(hr,"%02d",minute);
          lcd_puts(hr);
          sprintf(hr,"%02d",New_Minute);
          lcd_gotoxy(13,0);
          lcd_puts(hr);

          sprintf(hr,"%02d",menu);
          lcd_gotoxy(1,1);
          lcd_puts(hr);
          sprintf(hr,"%02d",New_menu);
          lcd_gotoxy(5,1);
          lcd_puts(hr);




Sedaj se bo v spodnji vrtsici LCDja pokazalo levo spremenljivka menu, malo dalje pa New_Menu. Ti dve številki morata biti ves čas enaki, vrednosti pa imata lahko 0, 1 ali 2. Se to tudi zgodi?

Še vedno me zanima, ali se preminjajo minute, ko bi se morale (menu==2) in ali takrat utripa LED na PORTC.2.
Če sem prav razumel, se New_minute spreminjajo hkrati z urami in minutami, kot bi se morale?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran Prejšnja  1, 2, 3
Stran 3 od 3

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 493 dni


Powered by phpBB © 2001, 2005 phpBB Group