- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 5 von 5

Thema: Array

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer
    Registriert seit
    25.05.2008
    Ort
    Burgenland
    Alter
    34
    Beiträge
    2

    Array

    Hallo liebe Community,

    Ich habe ein kleines Problem, was jedoch sehr einfach zu lösen sein sollte.
    Ich muss für ein kleines Projekt in der Schule eine "Helligkeitssteuerung mittels PWM in 10 Stufen" programmieren.

    Bin mit dem Programm soweit schon fertig, nur kenn ich mich mit der C Programmierung leider nicht so gut aus & hab daher mit einen einfachen Array ein Problem.

    Hier der Code:

    #include <mega8.h>
    #include <delay.h>
    #include <LCDlib.h>

    #define T1 PINC.1
    #define UP PINC.2
    #define DOWN PINC.3
    #define Licht PORTD.4

    #define CR 0x0D



    bit Taste, Flanke, Merker, RUN;
    bit UP_OLD, DOWN_OLD;

    unsigned char count;


    interrupt [TIM2_OVF] void timer2_ovf_isr(void) // Timer 2 overflow interrupt service routine
    {
    Licht = 0;
    }

    interrupt [TIM2_COMP] void timer2_comp_isr(void)// Timer 2 output compare interrupt service routine
    {
    if (RUN)
    Licht = 1;
    }


    void InitSFRs();


    void main(void)
    {
    InitSFRs();


    #asm("sei")



    while (1)
    {
    // Flankenerkennung für Licht EIN/AUS
    Taste = !T1;
    delay_ms(30);
    Taste &= !T1;
    Flanke = Taste & !Merker;
    Merker = Taste;

    if (Flanke)
    RUN = !RUN;


    // Flankenerkennung für Erhöhung der Helligkeit
    if (!UP && UP_OLD)
    {
    if (count<10)
    {
    count ++;
    }
    }

    UP_OLD = UP;
    delay_ms(10);

    // Flankenerkennung für Verringerung der Helligkeit
    if (!DOWN && DOWN_OLD)
    {
    if (count>0)
    {
    count --;
    }
    }

    DOWN_OLD = DOWN;
    delay_ms(10);



    } // while
    } // main

    void InitSFRs()
    {
    // Portkonfiguaration
    DDRC = 0x30;
    PORTC = 0x0E;

    DDRD = 0x10;
    PORTD = 0x00;

    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: 500,000 kHz
    // Mode: Normal top=FFh
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x04;
    TCNT2=0x00;
    OCR2=0x80;

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

    }
    Durch Veränderung von OCR2 (=Comp) kann heller bzw. dünkler gestellt werden. Da das ganze in Stufen erfolgen soll müssen die 256 Bits durch 10 unterteilt werden.
    Ich könnte das ganze jetzt ganz einfach mittels IF folgenderweise machen

    if(count==1)
    OCR2=0x01

    if(count==2)
    OCR=0x02

    if(...)
    .....

    Mir erscheint das aber in einem Array (Feld) als eleganter.

    Das Problem ist jedoch, dass ich micht mit Arrays nicht auskenne und nicht weiss wie ich einem Array "count" mit "OCR2" verbinden kann - ich hab nur sowoas in der Art im Kopf: "char zählen [10] = {0x01, 0x02, 0x03, 0x04, ...}

    Wäre sehr nett wenn mir jemand helfen kann, mein Programm fertig zu stellen.

    FÜr die zehn Werte nehmt bitte einfach 0x01, 0x02 , 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10.

    MFG infection

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    09.02.2006
    Beiträge
    57
    Hi,

    deine Syntax für die Array-Defintion stimmt, Du könntest dann den Wert von count als Index benutzen, in etwa so:

    Code:
    uint8_t OCR2Value[11] = {0,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10};
    ...
    
    while(1){
    ... // count aktualisieren
    
    
    OCR2 = OCR2Value[count];
    ...
    
    }
    Ich habe als Array-Größe 11 angenommen, weil es ja 11 mögliche Werte für count gibt (0 bis 10).

    Eine Anmerkung noch: der Atmega8 hat bereits eingebaute PWM-Funktionalität, d.h. das was Du in den beiden ISR´s machst, kannst Du problemlos auch von der Hardware erledigen lassen. Siehe dazu im Datenblatt unter "Fast PWM".

    Gruß
    Jonas
    Gruß
    Jonas

  3. #3
    Neuer Benutzer
    Registriert seit
    25.05.2008
    Ort
    Burgenland
    Alter
    34
    Beiträge
    2
    dankeschön Jonas

    Eine Frage hab ich noch.

    Was ist den uint8_t?

    Ich hab bis jetzt nur Typen wie bit, char, int, float, double + Zusätze wie signed, unsigned, long, short kenngelernt.

    Würde es mit einem dieses Datentypen auch funktionieren?

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.01.2007
    Beiträge
    134
    uint8_t = unsigned integer 8 bit (unsigned char)
    uint16_t = uns. int. 16 bit etc.. (unsigned short)

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    09.02.2006
    Beiträge
    57
    Sorry, ich hatte den Datentyp aus Gewohneit verwendet. Er ist in der AVR libc definiert. Die Syntax gilt aber für alle einfachen Datentypen.

    Gruß
    Jonas
    Gruß
    Jonas

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test