SchemaTheek
 
Home Nieuws Forum Schema's Artikelen Magazine Downloads Links Shops Zoeken
 
Controle Paneel
Gebruikersnaam
Wachtwoord
  Onthoud mij
» Wachtwoord?
» Registreren
Site info
» Het Team
» Contact
» FAQ
» Leden
» Upload Archief
Stats
Totaal online: 7
7 gasten
0 leden:
Forum > Digitaal > Atmega 234 proggen in C digi. klok.
Pyro-Brad
Lid
Berichten: 251
Gepost op maandag 13 Februari 2012 15:19:05 QuoteWijzig

Beste heren en damen,

Ik ben bezig met het programmeren van een digitaleklok in de taal C. Ik ben de taal C nog aan het leren!

Nu ben ik begonnen met case lussen maken voor de 7-segment displays aan te sturen. Ik heb de variable "sec1" op 0 en wil vervolgens dat die naar case0 gaat om portc.0 aan te sturen. Daarna wil ik dat er een delay komt vervolgens 1 bij "sec1" optellen en dan naar case1 gaat.
Dit werkt helaas niet volgens de planning.
Hier de code:

Code
#define        F_CPU 20000000
#include     <avr/io.h>
#include     <util/delay.h>

char sec1;

int main () 
{
    DDRC = 0xff;
    DDRD = 0x00;
    sec1 = 0x00;
while (1) 

switch(sec1)
      {
        case 0:
          PORTC=0x01;
          break;
        case 1:
          PORTC=0x02;
          break;
        case 2:
          PORTC=0x04;
          break;
        case 3:
          PORTC=0x08;
          break;
        case 4:
          PORTC=0x10;
          break;
        case 5:
          PORTC=0x20;
          break;
        case 6:
          PORTC=0x40;
          break;
        case 7:
          PORTC=0x80;
          break;
        case 8:
          PORTC=0x08;
          break;
        default: PORTC=0x08;
      }
if (sec1 = 8) sec1 = 0;
_delay_ms(200);
sec1++;

return;

}



Alleen het 1e ledje gaat branden.
Weten jullie wat er mis gaat?

Ik wil dit toppic graag open houden voor straks andere problemen tijdens mijn project als jullie dat goed vinden.

Alvast bedankt!

nu nog het nubke van schematheek :p
Stynus
Admin
Berichten: 2855
Gepost op maandag 13 Februari 2012 17:57:43 QuoteWijzig

Ik mis de { en } van je while loop.


Met vriendelijke groet, Stynus ||| www.elektronicastynus.be
djoveld
Lid
Berichten: 7
Gepost op dinsdag 14 Februari 2012 10:17:12 QuoteWijzig

Inderdaad zoals Stynus al zegt, met deze constructie valt alleen de switch() in de while lus. sec1=0x00 -> PORTC=0x01 1e ledje gaat aan. De rest van de code wordt nooit uitgevoerd. Het is altijd aan te bevelen om {} te gebruiken ook als er maar een statement uitgevoerd hoeft te worden, dat voorkomt dit soort problemen...

CowBeast
Webmaster
Berichten: 257
Gepost op woensdag 15 Februari 2012 14:19:46 QuoteWijzig

@Pyro-Brad: Zoals reeds aangehaald maak je volledig verkeerd gebruik van de scope van je while lus, alsook die van je if die eronder volgt.
In C moet je steeds het bereik van je functie defini?ren doormiddel van { en }. Je moet dus duidelijk aangeven wat er in je while lus zit. MAAR met uitzondering als er maar ??n instructie volgt...
Dus wanneer je geen gebruik maakt van { en } dan gaat C automatisch de scope (bereik van de functie) bepalen. En dit is tot de eerste ; op het einde van een lijn. Er bestaat genoeg literatuur daar rond, dus google even een C cursus en het staat daar in geuren en kleuren uitgelegd.

Tevens bepaald de scoop ook de geldigheid van je variabelen...

Dit alles toegepast op jouw code zou het volgende moeten opleveren.
Tussenhaakjes, ik heb ook je if structuur onderaan aangepast... Want je zou nooit in null terechtkomen wanneer je 0x08 bereikt, je gaat namelijk je variabele sec1 op 0 zetten, en 200ms erna onmiddelijk incrementeren zonder de switch nog een uit te voeren waardoor je deze toestand dus overslaat. ;-)

Code

#define        F_CPU 20000000 
#include     <avr/io.h> 
#include     <util/delay.h> 

char sec1; 

int main ()  

    DDRC = 0xff; 
    DDRD = 0x00; 
    sec1 = 0x00; 
while (1) { 

switch(sec1) 
      { 
        case 0: 
          PORTC=0x01; 
          break; 
        case 1: 
          PORTC=0x02; 
          break; 
        case 2: 
          PORTC=0x04; 
          break; 
        case 3: 
          PORTC=0x08; 
          break; 
        case 4: 
          PORTC=0x10; 
          break; 
        case 5: 
          PORTC=0x20; 
          break; 
        case 6: 
          PORTC=0x40; 
          break; 
        case 7: 
          PORTC=0x80; 
          break; 
        case 8: 
          PORTC=0x08; 
          break; 
        default: PORTC=0x08; 
      } 

   if (sec1 = 8)
     sec1 = 0; 
   else {
     _delay_ms(200); 
     sec1++; 
   }
 }
 return; 



Active Topics

» Atoomklok
» De tuin.
» Werkplaatsinrichting
» Subaru Outback 2016
» ? => Mini kerstlan...
» ATSAMD21J18A-AU backupen
» De gevolgen van een kl...
» Afstandsbediening plaf...
» Virtual Chemist probleem
» Probleem met Toyota Av...

» Meer actieve topics

Advertenties

PCBway

© 2004-2023 SchemaTheek
Laadtijd: 0.12301 sec.