PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Array



infection
25.05.2008, 18:20
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

gothmog
26.05.2008, 10:01
Hi,

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



uint8_t OCR2Value[11] = {0,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x 10};
...

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

infection
26.05.2008, 20:23
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?

geronet
26.05.2008, 21:56
uint8_t = unsigned integer 8 bit (unsigned char)
uint16_t = uns. int. 16 bit etc.. (unsigned short)

gothmog
26.05.2008, 22:47
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